; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -passes=gvn -enable-load-pre -S | FileCheck %s --check-prefixes=CHECK,MDEP ; RUN: opt < %s -passes='gvn' -enable-load-pre -S | FileCheck %s --check-prefixes=CHECK,MSSA ; Ensure AA metadata are combined properly while hoisting the load. @g_bool = global i8 0, align 1 @g_long = global i64 0, align 8 define void @test_combine_metadata(i1 %c, i64 %arg) { ; CHECK-LABEL: define void @test_combine_metadata( ; CHECK-SAME: i1 [[C:%.*]], i64 [[ARG:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[VAL:%.*]] = alloca i8, align 1 ; CHECK-NEXT: br label %[[LOOP:.*]] ; CHECK: [[LOOP]]: ; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ @g_long, %[[IF_THEN:.*]] ], [ [[VAL]], %[[ENTRY]] ] ; CHECK-NEXT: store i64 [[ARG]], ptr @g_long, align 8, !tbaa [[LONG_TBAA0:![0-9]+]] ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[ARG]] to i8 ; CHECK-NEXT: store i8 [[TRUNC]], ptr [[VAL]], align 1, !tbaa [[_BOOL_TBAA4:![0-9]+]] ; CHECK-NEXT: [[V1_PRE:%.*]] = load i8, ptr [[PHI]], align 1, !tbaa [[CHAR_TBAA6:![0-9]+]] ; CHECK-NEXT: br i1 [[C]], label %[[IF_THEN]], label %[[IF_ELSE:.*]] ; CHECK: [[IF_ELSE]]: ; CHECK-NEXT: store i8 [[V1_PRE]], ptr @g_bool, align 8, !tbaa [[LONG_TBAA0]] ; CHECK-NEXT: br label %[[IF_THEN]] ; CHECK: [[IF_THEN]]: ; CHECK-NEXT: store i8 [[V1_PRE]], ptr @g_bool, align 1 ; CHECK-NEXT: br label %[[LOOP]] ; entry: %val = alloca i8, align 1 br label %loop loop: %phi = phi ptr [ @g_long, %if.then ], [ %val, %entry ] store i64 %arg, ptr @g_long, align 8, !tbaa !3 %trunc = trunc i64 %arg to i8 store i8 %trunc, ptr %val, align 1, !tbaa !5 br i1 %c, label %if.then, label %if.else if.else: %v2 = load i8, ptr %phi, align 1, !tbaa !7 store i8 %v2, ptr @g_bool, align 8, !tbaa !3 br label %if.then if.then: %v1 = load i8, ptr %phi, align 1, !tbaa !5 store i8 %v1, ptr @g_bool, align 1 br label %loop } !0 = !{!"Simple C/C++ TBAA"} !1 = !{!"omnipotent char", !0, i64 0} !2 = !{!"long", !1, i64 0} !3 = !{!2, !2, i64 0} !4 = !{!"_Bool", !1, i64 0} !5 = !{!4, !4, i64 0} !7 = !{!1, !1, i64 0} ;. ; CHECK: [[LONG_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0} ; CHECK: [[META1]] = !{!"long", [[META2:![0-9]+]], i64 0} ; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0} ; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"} ; CHECK: [[_BOOL_TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0} ; CHECK: [[META5]] = !{!"_Bool", [[META2]], i64 0} ; CHECK: [[CHAR_TBAA6]] = !{[[META2]], [[META2]], i64 0} ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; MDEP: {{.*}} ; MSSA: {{.*}}