1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes="loop-idiom" < %s -S | FileCheck %s 3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 5 6target triple = "x86_64-apple-darwin10.0.0" 7 8 9define dso_local void @double_memset(ptr nocapture %p) { 10; CHECK-LABEL: @double_memset( 11; CHECK-NEXT: entry: 12; CHECK-NEXT: call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern, i64 128), !tbaa [[TBAA0:![0-9]+]] 13; CHECK-NEXT: br label [[FOR_BODY:%.*]] 14; CHECK: for.cond.cleanup: 15; CHECK-NEXT: ret void 16; CHECK: for.body: 17; CHECK-NEXT: [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ] 18; CHECK-NEXT: [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]] 19; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_07]], 1 20; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], 16 21; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]] 22; 23entry: 24 br label %for.body 25 26for.cond.cleanup: 27 ret void 28 29for.body: 30 %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ] 31 %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07 32 store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !5 33 %inc = add nuw nsw i64 %i.07, 1 34 %exitcond.not = icmp eq i64 %inc, 16 35 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 36} 37 38 39define dso_local void @struct_memset(ptr nocapture %p) { 40; CHECK-LABEL: @struct_memset( 41; CHECK-NEXT: entry: 42; CHECK-NEXT: call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern.1, i64 128), !tbaa [[TBAA4:![0-9]+]] 43; CHECK-NEXT: br label [[FOR_BODY:%.*]] 44; CHECK: for.cond.cleanup: 45; CHECK-NEXT: ret void 46; CHECK: for.body: 47; CHECK-NEXT: [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ] 48; CHECK-NEXT: [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]] 49; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_07]], 1 50; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], 16 51; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]] 52; 53entry: 54 br label %for.body 55 56for.cond.cleanup: 57 ret void 58 59for.body: 60 %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ] 61 %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07 62 store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !10 63 %inc = add nuw nsw i64 %i.07, 1 64 %exitcond.not = icmp eq i64 %inc, 16 65 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 66} 67 68define dso_local void @var_memset(ptr nocapture %p, i64 %len) { 69; CHECK-LABEL: @var_memset( 70; CHECK-NEXT: entry: 71; CHECK-NEXT: [[TMP0:%.*]] = shl nuw i64 [[LEN:%.*]], 3 72; CHECK-NEXT: call void @memset_pattern16(ptr [[P:%.*]], ptr @.memset_pattern.2, i64 [[TMP0]]) 73; CHECK-NEXT: br label [[FOR_BODY:%.*]] 74; CHECK: for.cond.cleanup: 75; CHECK-NEXT: ret void 76; CHECK: for.body: 77; CHECK-NEXT: [[I_07:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ] 78; CHECK-NEXT: [[PTR1:%.*]] = getelementptr inbounds double, ptr [[P]], i64 [[I_07]] 79; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_07]], 1 80; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], [[LEN]] 81; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]] 82; 83entry: 84 br label %for.body 85 86for.cond.cleanup: 87 ret void 88 89for.body: 90 %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ] 91 %ptr1 = getelementptr inbounds double, ptr %p, i64 %i.07 92 store double 3.14159e+00, ptr %ptr1, align 1, !tbaa !10 93 %inc = add nuw nsw i64 %i.07, 1 94 %exitcond.not = icmp eq i64 %inc, %len 95 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body 96} 97 98!5 = !{!6, !6, i64 0} 99!6 = !{!"double", !7, i64 0} 100!7 = !{!"omnipotent char", !8, i64 0} 101!8 = !{!"Simple C++ TBAA"} 102 103!15 = !{!8, i64 0, !"omnipotent char"} 104!17 = !{!15, i64 8, !"double"} 105!9 = !{!15, i64 32, !"_ZTS1A", !17, i64 0, i64 8, !17, i64 8, i64 8, !17, i64 16, i64 8, !17, i64 24, i64 8} 106!10 = !{!9, !17, i64 0, i64 1} 107 108!18 = !{!19, !20, i64 0} 109!19 = !{!"A", !20, i64 0, !22, i64 8} 110!20 = !{!"any pointer", !7, i64 0} 111!21 = !{!22, !20, i64 0} 112!22 = !{!"B", !20, i64 0} 113