xref: /llvm-project/llvm/test/Transforms/GVNHoist/hoist-md.ll (revision 34c645fdeb2678c57237472667294567b73f3021)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
2; RUN: opt -S -passes=gvn-hoist < %s | FileCheck %s
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6define void @test1(i1 %b, ptr %x) {
7; CHECK-LABEL: define void @test1
8; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) {
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    store i32 2, ptr [[X]], align 4, !tbaa [[TBAA0:![0-9]+]]
11; CHECK-NEXT:    br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
12; CHECK:       if.then:
13; CHECK-NEXT:    br label [[IF_END:%.*]]
14; CHECK:       if.else:
15; CHECK-NEXT:    br label [[IF_END]]
16; CHECK:       if.end:
17; CHECK-NEXT:    ret void
18;
19entry:
20  br i1 %b, label %if.then, label %if.else
21
22if.then:                                          ; preds = %entry
23  store i32 2, ptr %x, align 4, !tbaa !1
24  br label %if.end
25
26if.else:                                          ; preds = %entry
27  store i32 2, ptr %x, align 4, !tbaa !5
28  br label %if.end
29
30if.end:                                           ; preds = %if.else, %if.then
31  ret void
32}
33
34define void @test2(i1 %b, ptr %x) {
35; CHECK-LABEL: define void @test2
36; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) {
37; CHECK-NEXT:  entry:
38; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
39; CHECK-NEXT:    store i32 2, ptr [[TMP0]], align 4, !tbaa [[TBAA0]]
40; CHECK-NEXT:    br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
41; CHECK:       if.then:
42; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
43; CHECK-NEXT:    br label [[IF_END:%.*]]
44; CHECK:       if.else:
45; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
46; CHECK-NEXT:    br label [[IF_END]]
47; CHECK:       if.end:
48; CHECK-NEXT:    ret void
49;
50entry:
51  br i1 %b, label %if.then, label %if.else
52
53if.then:                                          ; preds = %entry
54  %gep1 = getelementptr inbounds i32, ptr %x, i64 1
55  store i32 2, ptr %gep1, align 4, !tbaa !1
56  br label %if.end
57
58if.else:                                          ; preds = %entry
59  %gep2 = getelementptr inbounds i32, ptr %x, i64 1
60  store i32 2, ptr %gep2, align 4, !tbaa !5
61  br label %if.end
62
63if.end:                                           ; preds = %if.else, %if.then
64  ret void
65}
66
67define void @test3(i1 %b, ptr %x) {
68; CHECK-LABEL: define void @test3
69; CHECK-SAME: (i1 [[B:%.*]], ptr [[X:%.*]]) {
70; CHECK-NEXT:  entry:
71; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i32, ptr [[X]], i64 1
72; CHECK-NEXT:    store i32 2, ptr [[TMP0]], align 4, !tbaa [[TBAA0]]
73; CHECK-NEXT:    br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
74; CHECK:       if.then:
75; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i32, ptr [[X]], i64 1
76; CHECK-NEXT:    br label [[IF_END:%.*]]
77; CHECK:       if.else:
78; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i32, ptr [[X]], i64 1
79; CHECK-NEXT:    br label [[IF_END]]
80; CHECK:       if.end:
81; CHECK-NEXT:    ret void
82;
83entry:
84  br i1 %b, label %if.then, label %if.else
85
86if.then:                                          ; preds = %entry
87  %gep1 = getelementptr inbounds i32, ptr %x, i64 1
88  store i32 2, ptr %gep1, align 4, !tbaa !1
89  br label %if.end
90
91if.else:                                          ; preds = %entry
92  %gep2 = getelementptr i32, ptr %x, i64 1
93  store i32 2, ptr %gep2, align 4, !tbaa !5
94  br label %if.end
95
96if.end:                                           ; preds = %if.else, %if.then
97  ret void
98}
99
100define i32 @test4(i1 %b, ptr %y) {
101; CHECK-LABEL: define i32 @test4
102; CHECK-SAME: (i1 [[B:%.*]], ptr [[Y:%.*]]) {
103; CHECK-NEXT:  entry:
104; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[Y]], align 4, !range [[RNG3:![0-9]+]]
105; CHECK-NEXT:    br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
106; CHECK:       if.then:
107; CHECK-NEXT:    br label [[RETURN:%.*]]
108; CHECK:       if.end:
109; CHECK-NEXT:    br label [[RETURN]]
110; CHECK:       return:
111; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ [[TMP0]], [[IF_THEN]] ], [ [[TMP0]], [[IF_END]] ]
112; CHECK-NEXT:    ret i32 [[RETVAL_0]]
113;
114entry:
115  br i1 %b, label %if.then, label %if.end
116
117if.then:                                          ; preds = %entry
118  %0 = load i32, ptr %y, align 4, !range !7
119  br label %return
120
121if.end:                                           ; preds = %entry
122  %1 = load i32, ptr %y, align 4, !range !8
123  br label %return
124
125return:                                           ; preds = %if.end, %if.then
126  %retval.0 = phi i32 [ %0, %if.then ], [ %1, %if.end ]
127  ret i32 %retval.0
128}
129
130define ptr @test5(i1 %b, ptr %y) {
131; CHECK-LABEL: define ptr @test5
132; CHECK-SAME: (i1 [[B:%.*]], ptr [[Y:%.*]]) {
133; CHECK-NEXT:  entry:
134; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[Y]], align 4
135; CHECK-NEXT:    br i1 [[B]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
136; CHECK:       if.then:
137; CHECK-NEXT:    br label [[RETURN:%.*]]
138; CHECK:       if.end:
139; CHECK-NEXT:    br label [[RETURN]]
140; CHECK:       return:
141; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi ptr [ [[TMP0]], [[IF_THEN]] ], [ [[TMP0]], [[IF_END]] ]
142; CHECK-NEXT:    ret ptr [[RETVAL_0]]
143;
144entry:
145  br i1 %b, label %if.then, label %if.end
146
147if.then:                                          ; preds = %entry
148  %0 = load ptr, ptr %y, align 4, !nonnull !9
149  br label %return
150
151if.end:                                           ; preds = %entry
152  %1 = load ptr, ptr %y, align 4
153  br label %return
154
155return:                                           ; preds = %if.end, %if.then
156  %retval.0 = phi ptr [ %0, %if.then ], [ %1, %if.end ]
157  ret ptr %retval.0
158}
159
160!1 = !{!2, !2, i64 0}
161!2 = !{!"int", !3, i64 0}
162!3 = !{!"omnipotent char", !4, i64 0}
163!4 = !{!"Simple C++ TBAA"}
164!5 = !{!6, !6, i64 0}
165!6 = !{!"_ZTS1e", !3, i64 0}
166!7 = !{i32 0, i32 2}
167!8 = !{i32 3, i32 4}
168!9 = !{}
169;.
170; CHECK: [[TBAA0]] = !{!1, !1, i64 0}
171; CHECK: [[META1:![0-9]+]] = !{!"omnipotent char", !2, i64 0}
172; CHECK: [[META2:![0-9]+]] = !{!"Simple C++ TBAA"}
173; CHECK: [[RNG3]] = !{i32 0, i32 2, i32 3, i32 4}
174;.
175