@@ -156,6 +156,35 @@ define i8 @extract_element_binop_splat_variable_index(<4 x i8> %x, i32 %y) {
156
156
ret i8 %r
157
157
}
158
158
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
+
159
188
define i8 @extract_element_binop_splat_with_undef_variable_index (<4 x i8 > %x , i32 %y ) {
160
189
;
161
190
; 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) {
344
373
define i1 @extractelt_vector_fcmp_copy_flags (<4 x float > %x ) {
345
374
; CHECK-LABEL: @extractelt_vector_fcmp_copy_flags(
346
375
; 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 ]]
349
378
;
350
379
%cmp = fcmp nsz arcp oeq <4 x float > %x , zeroinitializer
351
380
%r = extractelement <4 x i1 > %cmp , i32 2
0 commit comments