Skip to content

Commit a357137

Browse files
committed
[InstCombine] Add test for #97053 (NFC)
1 parent 68a1944 commit a357137

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

llvm/test/Transforms/InstCombine/scalarization.ll

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,35 @@ define i8 @extract_element_binop_splat_variable_index(<4 x i8> %x, i32 %y) {
156156
ret i8 %r
157157
}
158158

159+
; We cannot move the extractelement before the sdiv here, because %z may be
160+
; out of range, making the divisor poison and resulting in immediate UB.
161+
; FIXME: This is a miscompile.
162+
define i8 @extract_element_binop_splat_variable_index_may_trap(<4 x i8> %x, <4 x i8> %y, i32 %z) {
163+
;
164+
; CHECK-LABEL: @extract_element_binop_splat_variable_index_may_trap(
165+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 [[Z:%.*]]
166+
; CHECK-NEXT: [[R:%.*]] = sdiv i8 42, [[TMP1]]
167+
; CHECK-NEXT: ret i8 [[R]]
168+
;
169+
%b = sdiv <4 x i8> splat (i8 42), %y
170+
%r = extractelement <4 x i8> %b, i32 %z
171+
ret i8 %r
172+
}
173+
174+
; Moving the extractelement first is fine here, because the index is known to
175+
; be valid, so we can't introduce additional poison.
176+
define i8 @extract_element_binop_constant_index_may_trap(<4 x i8> %x, <4 x i8> %y, i32 %z) {
177+
;
178+
; CHECK-LABEL: @extract_element_binop_constant_index_may_trap(
179+
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i64 3
180+
; CHECK-NEXT: [[R:%.*]] = sdiv i8 42, [[TMP1]]
181+
; CHECK-NEXT: ret i8 [[R]]
182+
;
183+
%b = sdiv <4 x i8> splat (i8 42), %y
184+
%r = extractelement <4 x i8> %b, i32 3
185+
ret i8 %r
186+
}
187+
159188
define i8 @extract_element_binop_splat_with_undef_variable_index(<4 x i8> %x, i32 %y) {
160189
;
161190
; CHECK-LABEL: @extract_element_binop_splat_with_undef_variable_index(
@@ -344,8 +373,8 @@ define i1 @extractelt_vector_fcmp_constrhs_dynidx(<2 x float> %arg, i32 %idx) {
344373
define i1 @extractelt_vector_fcmp_copy_flags(<4 x float> %x) {
345374
; CHECK-LABEL: @extractelt_vector_fcmp_copy_flags(
346375
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[X:%.*]], i64 2
347-
; CHECK-NEXT: [[TMP2:%.*]] = fcmp nsz arcp oeq float [[TMP1]], 0.000000e+00
348-
; CHECK-NEXT: ret i1 [[TMP2]]
376+
; CHECK-NEXT: [[R:%.*]] = fcmp nsz arcp oeq float [[TMP1]], 0.000000e+00
377+
; CHECK-NEXT: ret i1 [[R]]
349378
;
350379
%cmp = fcmp nsz arcp oeq <4 x float> %x, zeroinitializer
351380
%r = extractelement <4 x i1> %cmp, i32 2

0 commit comments

Comments
 (0)