1; RUN: opt -aa-pipeline=tbaa -passes=licm -S < %s | FileCheck %s 2 3; LICM should be able to hoist the address load out of the loop 4; by using TBAA information. 5 6; CHECK: @foo 7; CHECK: entry: 8; CHECK-NEXT: %tmp3 = load ptr, ptr @P 9; CHECK-NEXT: br label %for.body 10 11@P = common global ptr null 12 13define void @foo(i64 %n) nounwind { 14entry: 15 br label %for.body 16 17for.body: ; preds = %entry, %for.body 18 %i.07 = phi i64 [ %inc, %for.body ], [ 0, %entry ] 19 %tmp3 = load ptr, ptr @P, !tbaa !1 20 %scevgep = getelementptr double, ptr %tmp3, i64 %i.07 21 %tmp4 = load double, ptr %scevgep, !tbaa !2 22 %mul = fmul double %tmp4, 2.300000e+00 23 store double %mul, ptr %scevgep, !tbaa !2 24 %inc = add i64 %i.07, 1 25 %exitcond = icmp eq i64 %inc, %n 26 br i1 %exitcond, label %for.end, label %for.body 27 28for.end: ; preds = %for.body, %entry 29 ret void 30} 31 32!0 = !{!"root"} 33!1 = !{!6, !6, i64 0} 34!2 = !{!7, !7, i64 0} 35 36; LICM shouldn't hoist anything here. 37 38; CHECK: @bar 39; CHECK: loop: 40; CHECK: load 41; CHECK: store 42; CHECK: load 43; CHECK: store 44; CHECK: br label %loop 45 46define void @bar(ptr %p) nounwind { 47entry: 48 br label %loop 49 50loop: 51 %tmp51 = load ptr, ptr %p, !tbaa !4 52 store ptr %tmp51, ptr %p 53 %tmp40 = load i8, ptr %p, !tbaa !5 54 store i8 %tmp40, ptr %p 55 br label %loop 56} 57 58!3 = !{!"pointer", !8} 59!4 = !{!8, !8, i64 0} 60!5 = !{!10, !10, i64 0} 61!6 = !{!"pointer", !0} 62!7 = !{!"double", !0} 63!8 = !{!"char", !9} 64!9 = !{!"root"} 65!10 = !{!"scalar-type", !9} 66