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