@@ -5,9 +5,11 @@ declare void @foo(i32, i32)
5
5
6
6
define void @decompose_illegal_srem_same_block (i32 %a , i32 %b ) {
7
7
; CHECK-LABEL: @decompose_illegal_srem_same_block(
8
- ; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
9
- ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[DIV]], [[B]]
10
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A]], [[TMP1]]
8
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i32 [[A:%.*]]
9
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i32 [[B:%.*]]
10
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A_FROZEN]], [[B_FROZEN]]
11
+ ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[DIV]], [[B_FROZEN]]
12
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A_FROZEN]], [[TMP1]]
11
13
; CHECK-NEXT: call void @foo(i32 [[REM_DECOMPOSED]], i32 [[DIV]])
12
14
; CHECK-NEXT: ret void
13
15
;
@@ -19,9 +21,11 @@ define void @decompose_illegal_srem_same_block(i32 %a, i32 %b) {
19
21
20
22
define void @decompose_illegal_urem_same_block (i32 %a , i32 %b ) {
21
23
; CHECK-LABEL: @decompose_illegal_urem_same_block(
22
- ; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[A:%.*]], [[B:%.*]]
23
- ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[DIV]], [[B]]
24
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A]], [[TMP1]]
24
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i32 [[A:%.*]]
25
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i32 [[B:%.*]]
26
+ ; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[A_FROZEN]], [[B_FROZEN]]
27
+ ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[DIV]], [[B_FROZEN]]
28
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A_FROZEN]], [[TMP1]]
25
29
; CHECK-NEXT: call void @foo(i32 [[REM_DECOMPOSED]], i32 [[DIV]])
26
30
; CHECK-NEXT: ret void
27
31
;
@@ -37,9 +41,11 @@ define void @decompose_illegal_urem_same_block(i32 %a, i32 %b) {
37
41
define i32 @hoist_sdiv (i32 %a , i32 %b ) {
38
42
; CHECK-LABEL: @hoist_sdiv(
39
43
; CHECK-NEXT: entry:
40
- ; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
41
- ; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[DIV]], [[B]]
42
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A]], [[TMP0]]
44
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i32 [[A:%.*]]
45
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i32 [[B:%.*]]
46
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[A_FROZEN]], [[B_FROZEN]]
47
+ ; CHECK-NEXT: [[TMP0:%.*]] = mul i32 [[DIV]], [[B_FROZEN]]
48
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i32 [[A_FROZEN]], [[TMP0]]
43
49
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[REM_DECOMPOSED]], 42
44
50
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
45
51
; CHECK: if:
67
73
define i64 @hoist_udiv (i64 %a , i64 %b ) {
68
74
; CHECK-LABEL: @hoist_udiv(
69
75
; CHECK-NEXT: entry:
70
- ; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A:%.*]], [[B:%.*]]
71
- ; CHECK-NEXT: [[TMP0:%.*]] = mul i64 [[DIV]], [[B]]
72
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i64 [[A]], [[TMP0]]
76
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i64 [[A:%.*]]
77
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i64 [[B:%.*]]
78
+ ; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A_FROZEN]], [[B_FROZEN]]
79
+ ; CHECK-NEXT: [[TMP0:%.*]] = mul i64 [[DIV]], [[B_FROZEN]]
80
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i64 [[A_FROZEN]], [[TMP0]]
73
81
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[REM_DECOMPOSED]], 42
74
82
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
75
83
; CHECK: if:
@@ -97,12 +105,14 @@ end:
97
105
define i16 @hoist_srem (i16 %a , i16 %b ) {
98
106
; CHECK-LABEL: @hoist_srem(
99
107
; CHECK-NEXT: entry:
100
- ; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 [[A:%.*]], [[B:%.*]]
108
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i16 [[A:%.*]]
109
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i16 [[B:%.*]]
110
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i16 [[A_FROZEN]], [[B_FROZEN]]
101
111
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[DIV]], 42
102
112
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
103
113
; CHECK: if:
104
- ; CHECK-NEXT: [[TMP0:%.*]] = mul i16 [[DIV]], [[B ]]
105
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i16 [[A ]], [[TMP0]]
114
+ ; CHECK-NEXT: [[TMP0:%.*]] = mul i16 [[DIV]], [[B_FROZEN ]]
115
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i16 [[A_FROZEN ]], [[TMP0]]
106
116
; CHECK-NEXT: br label [[END]]
107
117
; CHECK: end:
108
118
; CHECK-NEXT: [[RET:%.*]] = phi i16 [ [[REM_DECOMPOSED]], [[IF]] ], [ 3, [[ENTRY:%.*]] ]
@@ -127,12 +137,14 @@ end:
127
137
define i8 @hoist_urem (i8 %a , i8 %b ) {
128
138
; CHECK-LABEL: @hoist_urem(
129
139
; CHECK-NEXT: entry:
130
- ; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[A:%.*]], [[B:%.*]]
140
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i8 [[A:%.*]]
141
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i8 [[B:%.*]]
142
+ ; CHECK-NEXT: [[DIV:%.*]] = udiv i8 [[A_FROZEN]], [[B_FROZEN]]
131
143
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[DIV]], 42
132
144
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
133
145
; CHECK: if:
134
- ; CHECK-NEXT: [[TMP0:%.*]] = mul i8 [[DIV]], [[B ]]
135
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i8 [[A ]], [[TMP0]]
146
+ ; CHECK-NEXT: [[TMP0:%.*]] = mul i8 [[DIV]], [[B_FROZEN ]]
147
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i8 [[A_FROZEN ]], [[TMP0]]
136
148
; CHECK-NEXT: br label [[END]]
137
149
; CHECK: end:
138
150
; CHECK-NEXT: [[RET:%.*]] = phi i8 [ [[REM_DECOMPOSED]], [[IF]] ], [ 3, [[ENTRY:%.*]] ]
@@ -157,14 +169,18 @@ end:
157
169
define i32 @srem_of_srem_unexpanded (i32 %X , i32 %Y , i32 %Z ) {
158
170
; CHECK-LABEL: @srem_of_srem_unexpanded(
159
171
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
160
- ; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
172
+ ; CHECK-NEXT: [[X_FROZEN:%.*]] = freeze i32 [[X:%.*]]
173
+ ; CHECK-NEXT: [[T0_FROZEN:%.*]] = freeze i32 [[T0]]
174
+ ; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X_FROZEN]], [[T0_FROZEN]]
161
175
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
162
- ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[T1]], [[T0]]
163
- ; CHECK-NEXT: [[T3_DECOMPOSED:%.*]] = sub i32 [[X]], [[TMP1]]
164
- ; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3_DECOMPOSED]], [[Y]]
176
+ ; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[T1]], [[T0_FROZEN]]
177
+ ; CHECK-NEXT: [[T3_DECOMPOSED:%.*]] = sub i32 [[X_FROZEN]], [[TMP1]]
178
+ ; CHECK-NEXT: [[T3_DECOMPOSED_FROZEN:%.*]] = freeze i32 [[T3_DECOMPOSED]]
179
+ ; CHECK-NEXT: [[Y_FROZEN:%.*]] = freeze i32 [[Y]]
180
+ ; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3_DECOMPOSED_FROZEN]], [[Y_FROZEN]]
165
181
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
166
- ; CHECK-NEXT: [[TMP2:%.*]] = mul i32 [[T4]], [[Y ]]
167
- ; CHECK-NEXT: [[T6_DECOMPOSED:%.*]] = sub i32 [[T3_DECOMPOSED ]], [[TMP2]]
182
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i32 [[T4]], [[Y_FROZEN ]]
183
+ ; CHECK-NEXT: [[T6_DECOMPOSED:%.*]] = sub i32 [[T3_DECOMPOSED_FROZEN ]], [[TMP2]]
168
184
; CHECK-NEXT: ret i32 [[T6_DECOMPOSED]]
169
185
;
170
186
%t0 = mul nsw i32 %Z , %Y
@@ -289,12 +305,14 @@ end:
289
305
define i128 @dont_hoist_urem (i128 %a , i128 %b ) {
290
306
; CHECK-LABEL: @dont_hoist_urem(
291
307
; CHECK-NEXT: entry:
292
- ; CHECK-NEXT: [[DIV:%.*]] = udiv i128 [[A:%.*]], [[B:%.*]]
308
+ ; CHECK-NEXT: [[A_FROZEN:%.*]] = freeze i128 [[A:%.*]]
309
+ ; CHECK-NEXT: [[B_FROZEN:%.*]] = freeze i128 [[B:%.*]]
310
+ ; CHECK-NEXT: [[DIV:%.*]] = udiv i128 [[A_FROZEN]], [[B_FROZEN]]
293
311
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i128 [[DIV]], 42
294
312
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
295
313
; CHECK: if:
296
- ; CHECK-NEXT: [[TMP0:%.*]] = mul i128 [[DIV]], [[B ]]
297
- ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i128 [[A ]], [[TMP0]]
314
+ ; CHECK-NEXT: [[TMP0:%.*]] = mul i128 [[DIV]], [[B_FROZEN ]]
315
+ ; CHECK-NEXT: [[REM_DECOMPOSED:%.*]] = sub i128 [[A_FROZEN ]], [[TMP0]]
298
316
; CHECK-NEXT: br label [[END]]
299
317
; CHECK: end:
300
318
; CHECK-NEXT: [[RET:%.*]] = phi i128 [ [[REM_DECOMPOSED]], [[IF]] ], [ 3, [[ENTRY:%.*]] ]
0 commit comments