Skip to content

Commit 5e0adce

Browse files
committedJul 30, 2019
[DivRemPairs] Add srem-of-srem tests (PR42823, D65298, D65451)
The @srem_of_srem_expanded case exposed a RAUW pitfall in D65298. Right now these don't appear to fail verification, so it should be safe to precommit them. https://reviews.llvm.org/D65298 https://bugs.llvm.org/show_bug.cgi?id=42823 https://reviews.llvm.org/D65451 llvm-svn: 367325
1 parent 39f3503 commit 5e0adce

File tree

4 files changed

+176
-0
lines changed

4 files changed

+176
-0
lines changed
 

‎llvm/test/Transforms/DivRemPairs/PowerPC/div-expanded-rem-pair.ll

+45
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,51 @@ end:
9595
ret i8 %ret
9696
}
9797

98+
; Be careful with RAUW/invalidation if this is a srem-of-srem.
99+
100+
define i32 @srem_of_srem_unexpanded(i32 %X, i32 %Y, i32 %Z) {
101+
; CHECK-LABEL: @srem_of_srem_unexpanded(
102+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
103+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
104+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
105+
; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[T1]], [[T0]]
106+
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[X]], [[TMP1]]
107+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[TMP2]], [[Y]]
108+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
109+
; CHECK-NEXT: [[TMP3:%.*]] = mul i32 [[T4]], [[Y]]
110+
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]]
111+
; CHECK-NEXT: ret i32 [[TMP4]]
112+
;
113+
%t0 = mul nsw i32 %Z, %Y
114+
%t1 = sdiv i32 %X, %t0
115+
%t2 = mul nsw i32 %t0, %t1
116+
%t3.recomposed = srem i32 %X, %t0
117+
%t4 = sdiv i32 %t3.recomposed, %Y
118+
%t5 = mul nsw i32 %t4, %Y
119+
%t6.recomposed = srem i32 %t3.recomposed, %Y
120+
ret i32 %t6.recomposed
121+
}
122+
define i32 @srem_of_srem_expanded(i32 %X, i32 %Y, i32 %Z) {
123+
; CHECK-LABEL: @srem_of_srem_expanded(
124+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
125+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
126+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
127+
; CHECK-NEXT: [[T3:%.*]] = sub nsw i32 [[X]], [[T2]]
128+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3]], [[Y]]
129+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
130+
; CHECK-NEXT: [[T6:%.*]] = sub nsw i32 [[T3]], [[T5]]
131+
; CHECK-NEXT: ret i32 [[T6]]
132+
;
133+
%t0 = mul nsw i32 %Z, %Y
134+
%t1 = sdiv i32 %X, %t0
135+
%t2 = mul nsw i32 %t0, %t1
136+
%t3 = sub nsw i32 %X, %t2
137+
%t4 = sdiv i32 %t3, %Y
138+
%t5 = mul nsw i32 %t4, %Y
139+
%t6 = sub nsw i32 %t3, %t5
140+
ret i32 %t6
141+
}
142+
98143
; If the target doesn't have a unified div/rem op for the type, keep decomposed rem
99144

100145
define i128 @dont_hoist_urem(i128 %a, i128 %b) {

‎llvm/test/Transforms/DivRemPairs/PowerPC/div-rem-pairs.ll

+45
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,51 @@ end:
151151
ret i8 %ret
152152
}
153153

154+
; Be careful with RAUW/invalidation if this is a srem-of-srem.
155+
156+
define i32 @srem_of_srem_unexpanded(i32 %X, i32 %Y, i32 %Z) {
157+
; CHECK-LABEL: @srem_of_srem_unexpanded(
158+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
159+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
160+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
161+
; CHECK-NEXT: [[TMP1:%.*]] = mul i32 [[T1]], [[T0]]
162+
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 [[X]], [[TMP1]]
163+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[TMP2]], [[Y]]
164+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
165+
; CHECK-NEXT: [[TMP3:%.*]] = mul i32 [[T4]], [[Y]]
166+
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[TMP2]], [[TMP3]]
167+
; CHECK-NEXT: ret i32 [[TMP4]]
168+
;
169+
%t0 = mul nsw i32 %Z, %Y
170+
%t1 = sdiv i32 %X, %t0
171+
%t2 = mul nsw i32 %t0, %t1
172+
%t3.recomposed = srem i32 %X, %t0
173+
%t4 = sdiv i32 %t3.recomposed, %Y
174+
%t5 = mul nsw i32 %t4, %Y
175+
%t6.recomposed = srem i32 %t3.recomposed, %Y
176+
ret i32 %t6.recomposed
177+
}
178+
define i32 @srem_of_srem_expanded(i32 %X, i32 %Y, i32 %Z) {
179+
; CHECK-LABEL: @srem_of_srem_expanded(
180+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
181+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
182+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
183+
; CHECK-NEXT: [[T3:%.*]] = sub nsw i32 [[X]], [[T2]]
184+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3]], [[Y]]
185+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
186+
; CHECK-NEXT: [[T6:%.*]] = sub nsw i32 [[T3]], [[T5]]
187+
; CHECK-NEXT: ret i32 [[T6]]
188+
;
189+
%t0 = mul nsw i32 %Z, %Y
190+
%t1 = sdiv i32 %X, %t0
191+
%t2 = mul nsw i32 %t0, %t1
192+
%t3 = sub nsw i32 %X, %t2
193+
%t4 = sdiv i32 %t3, %Y
194+
%t5 = mul nsw i32 %t4, %Y
195+
%t6 = sub nsw i32 %t3, %t5
196+
ret i32 %t6
197+
}
198+
154199
; If the ops don't match, don't do anything: signedness.
155200

156201
define i32 @dont_hoist_udiv(i32 %a, i32 %b) {

‎llvm/test/Transforms/DivRemPairs/X86/div-expanded-rem-pair.ll

+43
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,49 @@ end:
9595
ret i8 %ret
9696
}
9797

98+
; Be careful with RAUW/invalidation if this is a srem-of-srem.
99+
100+
define i32 @srem_of_srem_unexpanded(i32 %X, i32 %Y, i32 %Z) {
101+
; CHECK-LABEL: @srem_of_srem_unexpanded(
102+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
103+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
104+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
105+
; CHECK-NEXT: [[T3_RECOMPOSED:%.*]] = srem i32 [[X]], [[T0]]
106+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3_RECOMPOSED]], [[Y]]
107+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
108+
; CHECK-NEXT: [[T6_RECOMPOSED:%.*]] = srem i32 [[T3_RECOMPOSED]], [[Y]]
109+
; CHECK-NEXT: ret i32 [[T6_RECOMPOSED]]
110+
;
111+
%t0 = mul nsw i32 %Z, %Y
112+
%t1 = sdiv i32 %X, %t0
113+
%t2 = mul nsw i32 %t0, %t1
114+
%t3.recomposed = srem i32 %X, %t0
115+
%t4 = sdiv i32 %t3.recomposed, %Y
116+
%t5 = mul nsw i32 %t4, %Y
117+
%t6.recomposed = srem i32 %t3.recomposed, %Y
118+
ret i32 %t6.recomposed
119+
}
120+
define i32 @srem_of_srem_expanded(i32 %X, i32 %Y, i32 %Z) {
121+
; CHECK-LABEL: @srem_of_srem_expanded(
122+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
123+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
124+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
125+
; CHECK-NEXT: [[T3:%.*]] = sub nsw i32 [[X]], [[T2]]
126+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3]], [[Y]]
127+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
128+
; CHECK-NEXT: [[T6:%.*]] = sub nsw i32 [[T3]], [[T5]]
129+
; CHECK-NEXT: ret i32 [[T6]]
130+
;
131+
%t0 = mul nsw i32 %Z, %Y
132+
%t1 = sdiv i32 %X, %t0
133+
%t2 = mul nsw i32 %t0, %t1
134+
%t3 = sub nsw i32 %X, %t2
135+
%t4 = sdiv i32 %t3, %Y
136+
%t5 = mul nsw i32 %t4, %Y
137+
%t6 = sub nsw i32 %t3, %t5
138+
ret i32 %t6
139+
}
140+
98141
; If the target doesn't have a unified div/rem op for the type, keep decomposed rem
99142

100143
define i128 @dont_hoist_urem(i128 %a, i128 %b) {

‎llvm/test/Transforms/DivRemPairs/X86/div-rem-pairs.ll

+43
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,49 @@ end:
145145
ret i8 %ret
146146
}
147147

148+
; Be careful with RAUW/invalidation if this is a srem-of-srem.
149+
150+
define i32 @srem_of_srem_unexpanded(i32 %X, i32 %Y, i32 %Z) {
151+
; CHECK-LABEL: @srem_of_srem_unexpanded(
152+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
153+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
154+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
155+
; CHECK-NEXT: [[T3_RECOMPOSED:%.*]] = srem i32 [[X]], [[T0]]
156+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3_RECOMPOSED]], [[Y]]
157+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
158+
; CHECK-NEXT: [[T6_RECOMPOSED:%.*]] = srem i32 [[T3_RECOMPOSED]], [[Y]]
159+
; CHECK-NEXT: ret i32 [[T6_RECOMPOSED]]
160+
;
161+
%t0 = mul nsw i32 %Z, %Y
162+
%t1 = sdiv i32 %X, %t0
163+
%t2 = mul nsw i32 %t0, %t1
164+
%t3.recomposed = srem i32 %X, %t0
165+
%t4 = sdiv i32 %t3.recomposed, %Y
166+
%t5 = mul nsw i32 %t4, %Y
167+
%t6.recomposed = srem i32 %t3.recomposed, %Y
168+
ret i32 %t6.recomposed
169+
}
170+
define i32 @srem_of_srem_expanded(i32 %X, i32 %Y, i32 %Z) {
171+
; CHECK-LABEL: @srem_of_srem_expanded(
172+
; CHECK-NEXT: [[T0:%.*]] = mul nsw i32 [[Z:%.*]], [[Y:%.*]]
173+
; CHECK-NEXT: [[T1:%.*]] = sdiv i32 [[X:%.*]], [[T0]]
174+
; CHECK-NEXT: [[T2:%.*]] = mul nsw i32 [[T0]], [[T1]]
175+
; CHECK-NEXT: [[T3:%.*]] = sub nsw i32 [[X]], [[T2]]
176+
; CHECK-NEXT: [[T4:%.*]] = sdiv i32 [[T3]], [[Y]]
177+
; CHECK-NEXT: [[T5:%.*]] = mul nsw i32 [[T4]], [[Y]]
178+
; CHECK-NEXT: [[T6:%.*]] = sub nsw i32 [[T3]], [[T5]]
179+
; CHECK-NEXT: ret i32 [[T6]]
180+
;
181+
%t0 = mul nsw i32 %Z, %Y
182+
%t1 = sdiv i32 %X, %t0
183+
%t2 = mul nsw i32 %t0, %t1
184+
%t3 = sub nsw i32 %X, %t2
185+
%t4 = sdiv i32 %t3, %Y
186+
%t5 = mul nsw i32 %t4, %Y
187+
%t6 = sub nsw i32 %t3, %t5
188+
ret i32 %t6
189+
}
190+
148191
; If the ops don't match, don't do anything: signedness.
149192

150193
define i32 @dont_hoist_udiv(i32 %a, i32 %b) {

0 commit comments

Comments
 (0)
Please sign in to comment.