; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -passes=gvn -S < %s | FileCheck %s --check-prefixes=CHECK,MDEP ; RUN: opt -passes='gvn' -S < %s | FileCheck %s --check-prefixes=CHECK,MSSA target datalayout = "e-p:64:64:64" ; GVN should preserve the TBAA tag on loads when doing PRE. define void @test(ptr %P, ptr %Q, i1 %arg) nounwind { ; CHECK-LABEL: define void @test( ; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[ARG:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: br i1 [[ARG]], label %[[BB_NPH:.*]], label %[[FOR_END:.*]] ; CHECK: [[BB_NPH]]: ; CHECK-NEXT: [[TMP33_PRE:%.*]] = load i16, ptr [[P]], align 2, !tbaa [[SHORT_TBAA0:![0-9]+]] ; CHECK-NEXT: br label %[[FOR_BODY:.*]] ; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP33:%.*]] = phi i16 [ 0, %[[FOR_BODY]] ], [ [[TMP33_PRE]], %[[BB_NPH]] ] ; CHECK-NEXT: store i16 [[TMP33]], ptr [[Q]], align 2 ; CHECK-NEXT: store i16 0, ptr [[P]], align 2, !tbaa [[SHORT_TBAA0]] ; CHECK-NEXT: br i1 false, label %[[FOR_BODY_FOR_END_CRIT_EDGE:.*]], label %[[FOR_BODY]] ; CHECK: [[FOR_BODY_FOR_END_CRIT_EDGE]]: ; CHECK-NEXT: br label %[[FOR_END]] ; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void ; entry: br i1 %arg, label %bb.nph, label %for.end bb.nph: ; preds = %entry br label %for.body for.body: ; preds = %for.body, %bb.nph %tmp33 = load i16, ptr %P, align 2, !tbaa !0 store i16 %tmp33, ptr %Q store i16 0, ptr %P, align 2, !tbaa !0 br i1 false, label %for.end, label %for.body for.end: ; preds = %for.body, %entry ret void } !0 = !{!3, !3, i64 0} !1 = !{!"omnipotent char", !2} !2 = !{!"Simple C/C++ TBAA"} !3 = !{!"short", !1} ;. ; CHECK: [[SHORT_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0} ; CHECK: [[META1]] = !{!"short", [[META2:![0-9]+]]} ; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]]} ; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"} ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; MDEP: {{.*}} ; MSSA: {{.*}}