[AMDGPU] Add True16 register classes.
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / hoist-common-code.ll
blob43fb8faad7cfd940a29bc731717daf24ab80b1a0
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -hoist-common-insts=true | FileCheck %s
4 declare void @bar(i32)
6 define void @test(i1 %P, ptr %Q) {
7 ; CHECK-LABEL: @test(
8 ; CHECK-NEXT:  common.ret:
9 ; CHECK-NEXT:    store i32 1, ptr [[Q:%.*]], align 4
10 ; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[Q]], align 4
11 ; CHECK-NEXT:    call void @bar(i32 [[A]])
12 ; CHECK-NEXT:    ret void
14   br i1 %P, label %T, label %F
15 T:              ; preds = %0
16   store i32 1, ptr %Q
17   %A = load i32, ptr %Q               ; <i32> [#uses=1]
18   call void @bar( i32 %A )
19   ret void
20 F:              ; preds = %0
21   store i32 1, ptr %Q
22   %B = load i32, ptr %Q               ; <i32> [#uses=1]
23   call void @bar( i32 %B )
24   ret void
27 define void @test_switch(i64 %i, ptr %Q) {
28 ; CHECK-LABEL: @test_switch(
29 ; CHECK-NEXT:    switch i64 [[I:%.*]], label [[BB0:%.*]] [
30 ; CHECK-NEXT:    i64 1, label [[BB1:%.*]]
31 ; CHECK-NEXT:    i64 2, label [[BB2:%.*]]
32 ; CHECK-NEXT:    ]
33 ; CHECK:       common.ret:
34 ; CHECK-NEXT:    ret void
35 ; CHECK:       bb0:
36 ; CHECK-NEXT:    store i32 1, ptr [[Q:%.*]], align 4
37 ; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[Q]], align 4
38 ; CHECK-NEXT:    call void @bar(i32 [[A]])
39 ; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
40 ; CHECK:       bb1:
41 ; CHECK-NEXT:    store i32 1, ptr [[Q]], align 4
42 ; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[Q]], align 4
43 ; CHECK-NEXT:    call void @bar(i32 [[B]])
44 ; CHECK-NEXT:    br label [[COMMON_RET]]
45 ; CHECK:       bb2:
46 ; CHECK-NEXT:    store i32 1, ptr [[Q]], align 4
47 ; CHECK-NEXT:    [[C:%.*]] = load i32, ptr [[Q]], align 4
48 ; CHECK-NEXT:    call void @bar(i32 [[C]])
49 ; CHECK-NEXT:    br label [[COMMON_RET]]
51   switch i64 %i, label %bb0 [
52   i64 1, label %bb1
53   i64 2, label %bb2
54   ]
55 bb0:              ; preds = %0
56   store i32 1, ptr %Q
57   %A = load i32, ptr %Q               ; <i32> [#uses=1]
58   call void @bar( i32 %A )
59   ret void
60 bb1:              ; preds = %0
61   store i32 1, ptr %Q
62   %B = load i32, ptr %Q               ; <i32> [#uses=1]
63   call void @bar( i32 %B )
64   ret void
65 bb2:              ; preds = %0
66   store i32 1, ptr %Q
67   %C = load i32, ptr %Q               ; <i32> [#uses=1]
68   call void @bar( i32 %C )
69   ret void
72 define i1 @common_instr_on_switch(i64 %a, i64 %b, i64 %c) unnamed_addr {
73 ; CHECK-LABEL: @common_instr_on_switch(
74 ; CHECK-NEXT:  start:
75 ; CHECK-NEXT:    switch i64 [[A:%.*]], label [[BB0:%.*]] [
76 ; CHECK-NEXT:    i64 1, label [[BB1:%.*]]
77 ; CHECK-NEXT:    i64 2, label [[BB2:%.*]]
78 ; CHECK-NEXT:    ]
79 ; CHECK:       bb0:
80 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[B:%.*]], [[C:%.*]]
81 ; CHECK-NEXT:    br label [[EXIT:%.*]]
82 ; CHECK:       bb1:
83 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[B]], [[C]]
84 ; CHECK-NEXT:    br label [[EXIT]]
85 ; CHECK:       bb2:
86 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[B]], [[C]]
87 ; CHECK-NEXT:    br label [[EXIT]]
88 ; CHECK:       exit:
89 ; CHECK-NEXT:    [[RESULT:%.*]] = phi i1 [ [[TMP0]], [[BB0]] ], [ [[TMP1]], [[BB1]] ], [ [[TMP2]], [[BB2]] ]
90 ; CHECK-NEXT:    ret i1 [[RESULT]]
92 start:
93   switch i64 %a, label %bb0 [
94   i64 1, label %bb1
95   i64 2, label %bb2
96   ]
98 bb0:                                              ; preds = %start
99   %0 = icmp eq i64 %b, %c
100   br label %exit
102 bb1:                                              ; preds = %start
103   %1 = icmp eq i64 %b, %c
104   br label %exit
106 bb2:                                              ; preds = %start
107   %2 = icmp eq i64 %b, %c
108   br label %exit
110 exit:                                             ; preds = %bb2, %bb1, %bb0
111   %result = phi i1 [ %0, %bb0 ], [ %1, %bb1 ], [ %2, %bb2 ]
112   ret i1 %result
115 define i1 @partial_common_instr_on_switch(i64 %a, i64 %b, i64 %c) unnamed_addr {
116 ; CHECK-LABEL: @partial_common_instr_on_switch(
117 ; CHECK-NEXT:  start:
118 ; CHECK-NEXT:    switch i64 [[A:%.*]], label [[BB0:%.*]] [
119 ; CHECK-NEXT:    i64 1, label [[BB1:%.*]]
120 ; CHECK-NEXT:    i64 2, label [[BB2:%.*]]
121 ; CHECK-NEXT:    ]
122 ; CHECK:       bb0:
123 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[B:%.*]], [[C:%.*]]
124 ; CHECK-NEXT:    br label [[EXIT:%.*]]
125 ; CHECK:       bb1:
126 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[B]], [[C]]
127 ; CHECK-NEXT:    br label [[EXIT]]
128 ; CHECK:       bb2:
129 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[B]], [[C]]
130 ; CHECK-NEXT:    br label [[EXIT]]
131 ; CHECK:       exit:
132 ; CHECK-NEXT:    [[RESULT:%.*]] = phi i1 [ [[TMP0]], [[BB0]] ], [ [[TMP1]], [[BB1]] ], [ [[TMP2]], [[BB2]] ]
133 ; CHECK-NEXT:    ret i1 [[RESULT]]
135 start:
136   switch i64 %a, label %bb0 [
137   i64 1, label %bb1
138   i64 2, label %bb2
139   ]
141 bb0:                                              ; preds = %start
142   %0 = icmp eq i64 %b, %c
143   br label %exit
145 bb1:                                              ; preds = %start
146   %1 = icmp ne i64 %b, %c
147   br label %exit
149 bb2:                                              ; preds = %start
150   %2 = icmp eq i64 %b, %c
151   br label %exit
153 exit:                                             ; preds = %bb2, %bb1, %bb0
154   %result = phi i1 [ %0, %bb0 ], [ %1, %bb1 ], [ %2, %bb2 ]
155   ret i1 %result