Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / hoisting-metadata.ll
blob026002a4942af606b26e21d3dd212499f31ee7c4
1 ; RUN: opt -p simplifycfg -S %s | FileCheck %s
3 declare void @init(ptr)
5 define i64 @hoist_load_with_matching_pointers_and_tbaa(i1 %c) {
6 ; CHECK-LABEL: define i64 @hoist_load_with_matching_pointers_and_tbaa(
7 ; CHECK-SAME: i1 [[C:%.*]]) {
8 ; CHECK-NEXT:  [[ENTRY:.*:]]
9 ; CHECK-NEXT:    [[TMP:%.*]] = alloca i64, align 8
10 ; CHECK-NEXT:    call void @init(ptr [[TMP]])
11 ; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[TMP]], align 8
12 ; CHECK-NOT:       !tbaa
13 ; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[TMP]], align 8
14 ; CHECK-NOT:       !tbaa
15 ; CHECK-NEXT:    [[P:%.*]] = select i1 [[C]], i64 [[TMP0]], i64 [[TMP1]]
16 ; CHECK-NEXT:    ret i64 [[P]]
18 entry:
19   %tmp = alloca i64, align 8
20   call void @init(ptr %tmp)
21   br i1 %c, label %then, label %else
23 then:
24   %0 = load i64, ptr %tmp, align 8, !tbaa !0
25   br label %exit
27 else:
28   %1 = load i64, ptr %tmp, align 8, !tbaa !0
29   br label %exit
31 exit:
32   %p = phi i64 [ %0, %then ], [ %1, %else ]
33   ret i64 %p
36 define i64 @hoist_load_with_matching_tbaa_different_pointers(i1 %c) {
37 ; CHECK-LABEL: define i64 @hoist_load_with_matching_tbaa_different_pointers(
38 ; CHECK-SAME: i1 [[C:%.*]]) {
39 ; CHECK-NEXT:  [[ENTRY:.*:]]
40 ; CHECK-NEXT:    [[TMP:%.*]] = alloca i64, align 8
41 ; CHECK-NEXT:    [[TMP_1:%.*]] = alloca i64, align 8
42 ; CHECK-NEXT:    call void @init(ptr [[TMP]])
43 ; CHECK-NEXT:    call void @init(ptr [[TMP_1]])
44 ; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[TMP]], align 8
45 ; CHECK-NOT:       !tbaa
46 ; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[TMP_1]], align 8
47 ; CHECK-NOT:       !tbaa
48 ; CHECK-NEXT:    [[P:%.*]] = select i1 [[C]], i64 [[TMP0]], i64 [[TMP1]]
49 ; CHECK-NEXT:    ret i64 [[P]]
51 entry:
52   %tmp = alloca i64, align 8
53   %tmp.1 = alloca i64, align 8
54   call void @init(ptr %tmp)
55   call void @init(ptr %tmp.1)
56   br i1 %c, label %then, label %else
58 then:
59   %0 = load i64, ptr %tmp, align 8, !tbaa !0
60   br label %exit
62 else:
63   %1 = load i64, ptr %tmp.1, align 8, !tbaa !0
64   br label %exit
66 exit:
67   %p = phi i64 [ %0, %then ], [ %1, %else ]
68   ret i64 %p
71 define i64 @hoist_load_with_different_tbaa(i1 %c) {
72 ; CHECK-LABEL: define i64 @hoist_load_with_different_tbaa(
73 ; CHECK-SAME: i1 [[C:%.*]]) {
74 ; CHECK-NEXT:  [[ENTRY:.*:]]
75 ; CHECK-NEXT:    [[TMP:%.*]] = alloca i64, align 8
76 ; CHECK-NEXT:    call void @init(ptr [[TMP]])
77 ; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[TMP]], align 8
78 ; CHECK-NOT:       !tbaa
79 ; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[TMP]], align 8
80 ; CHECK-NOT:       !tbaa
81 ; CHECK-NEXT:    [[P:%.*]] = select i1 [[C]], i64 [[TMP0]], i64 [[TMP1]]
82 ; CHECK-NEXT:    ret i64 [[P]]
84 entry:
85   %tmp = alloca i64, align 8
86   call void @init(ptr %tmp)
87   br i1 %c, label %then, label %else
89 then:
90   %0 = load i64, ptr %tmp, align 8, !tbaa !0
91   br label %exit
93 else:
94   %1 = load i64, ptr %tmp, align 8, !tbaa !5
95   br label %exit
97 exit:
98   %p = phi i64 [ %0, %then ], [ %1, %else ]
99   ret i64 %p
102 define i64 @hoist_different_ops(i1 %c, i64 %a) {
103 ; CHECK-LABEL: define i64 @hoist_different_ops(
104 ; CHECK-SAME: i1 [[C:%.*]], i64 [[A:%.*]]) {
105 ; CHECK-NEXT:  [[ENTRY:.*:]]
106 ; CHECK-NEXT:    [[TMP:%.*]] = alloca i64, align 8
107 ; CHECK-NEXT:    call void @init(ptr [[TMP]])
108 ; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[TMP]], align 8
109 ; CHECK-NOT:       !tbaa
110 ; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[A]], 123
111 ; CHECK-NEXT:    [[P:%.*]] = select i1 [[C]], i64 [[TMP0]], i64 [[TMP1]]
112 ; CHECK-NEXT:    ret i64 [[P]]
114 entry:
115   %tmp = alloca i64, align 8
116   call void @init(ptr %tmp)
117   br i1 %c, label %then, label %else
119 then:
120   %0 = load i64, ptr %tmp, align 8, !tbaa !0
121   br label %exit
123 else:
124   %1 = add i64 %a, 123
125   br label %exit
127 exit:
128   %p = phi i64 [ %0, %then ], [ %1, %else ]
129   ret i64 %p
132 !0 = !{!1, !1, i64 0}
133 !1 = !{!"p2 long long", !2, i64 0}
134 !2 = !{!"any pointer", !3, i64 0}
135 !3 = !{!"omnipotent char", !4, i64 0}
136 !4 = !{!"Simple C++ TBAA"}
137 !5 = !{!3, !3, i64 0}