Skip to content

Commit e831395

Browse files
lukel97IanWood1
authored andcommitted
[VectorCombine] Add tests for UB issue, remove immediate UB from existing tests. NFC (llvm#138395)
This adds a test that exercises the part of scalarizeBinOpOrCmp that produces immediate UB as described in llvm#138095 (comment), but is fortunately currently folded into a correct transform. I also noticed a bunch of immediate UB in some of the existing tests so this also cleans them up. They should still all be scalarized though.
1 parent 1487d3a commit e831395

File tree

4 files changed

+65
-43
lines changed

4 files changed

+65
-43
lines changed

llvm/test/Transforms/VectorCombine/AArch64/scalarize-scalable.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ define <vscale x 4 x i32> @scalarize_scalable_udiv(i32 %x, i32 %y) {
3030
; CHECK-NEXT: ret <vscale x 4 x i32> [[R]]
3131
;
3232
%splatx = insertelement <vscale x 4 x i32> poison, i32 %x, i64 0
33-
%splaty = insertelement <vscale x 4 x i32> poison, i32 %y, i64 0
33+
%splaty = insertelement <vscale x 4 x i32> splat (i32 1), i32 %y, i64 0
3434
%r = udiv <vscale x 4 x i32> %splatx, %splaty
3535
ret <vscale x 4 x i32> %r
3636
}

llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant-inseltpoison.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,21 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
305305
define <2 x i64> @urem_constant_op0(i64 %x) {
306306
; CHECK-LABEL: @urem_constant_op0(
307307
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
308-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
308+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
309309
; CHECK-NEXT: ret <2 x i64> [[BO]]
310310
;
311-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
311+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
312312
%bo = urem <2 x i64> <i64 5, i64 undef>, %ins
313313
ret <2 x i64> %bo
314314
}
315315

316316
define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
317317
; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
318318
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
319-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
319+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
320320
; CHECK-NEXT: ret <2 x i64> [[BO]]
321321
;
322-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
322+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
323323
%bo = urem <2 x i64> <i64 5, i64 2>, %ins
324324
ret <2 x i64> %bo
325325
}
@@ -331,7 +331,7 @@ define <2 x i64> @urem_constant_op1(i64 %x) {
331331
; CHECK-NEXT: ret <2 x i64> [[BO]]
332332
;
333333
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
334-
%bo = urem <2 x i64> %ins, <i64 undef, i64 2>
334+
%bo = urem <2 x i64> %ins, <i64 2, i64 2>
335335
ret <2 x i64> %bo
336336
}
337337

@@ -360,10 +360,10 @@ define <2 x i64> @srem_constant_op0(i64 %x) {
360360
define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
361361
; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
362362
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
363-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
363+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
364364
; CHECK-NEXT: ret <2 x i64> [[BO]]
365365
;
366-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
366+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
367367
%bo = srem <2 x i64> <i64 5, i64 2>, %ins
368368
ret <2 x i64> %bo
369369
}
@@ -375,7 +375,7 @@ define <2 x i64> @srem_constant_op1(i64 %x) {
375375
; CHECK-NEXT: ret <2 x i64> [[BO]]
376376
;
377377
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
378-
%bo = srem <2 x i64> %ins, <i64 undef, i64 2>
378+
%bo = srem <2 x i64> %ins, <i64 2, i64 2>
379379
ret <2 x i64> %bo
380380
}
381381

@@ -393,21 +393,21 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
393393
define <2 x i64> @udiv_constant_op0(i64 %x) {
394394
; CHECK-LABEL: @udiv_constant_op0(
395395
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
396-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
396+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
397397
; CHECK-NEXT: ret <2 x i64> [[BO]]
398398
;
399-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
399+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
400400
%bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
401401
ret <2 x i64> %bo
402402
}
403403

404404
define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
405405
; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
406406
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
407-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
407+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
408408
; CHECK-NEXT: ret <2 x i64> [[BO]]
409409
;
410-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
410+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
411411
%bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
412412
ret <2 x i64> %bo
413413
}
@@ -419,7 +419,7 @@ define <2 x i64> @udiv_constant_op1(i64 %x) {
419419
; CHECK-NEXT: ret <2 x i64> [[BO]]
420420
;
421421
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
422-
%bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
422+
%bo = udiv <2 x i64> %ins, <i64 2, i64 2>
423423
ret <2 x i64> %bo
424424
}
425425

@@ -437,21 +437,21 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
437437
define <2 x i64> @sdiv_constant_op0(i64 %x) {
438438
; CHECK-LABEL: @sdiv_constant_op0(
439439
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
440-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
440+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
441441
; CHECK-NEXT: ret <2 x i64> [[BO]]
442442
;
443-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
443+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
444444
%bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
445445
ret <2 x i64> %bo
446446
}
447447

448448
define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
449449
; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
450450
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
451-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
451+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
452452
; CHECK-NEXT: ret <2 x i64> [[BO]]
453453
;
454-
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
454+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
455455
%bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
456456
ret <2 x i64> %bo
457457
}
@@ -463,7 +463,7 @@ define <2 x i64> @sdiv_constant_op1(i64 %x) {
463463
; CHECK-NEXT: ret <2 x i64> [[BO]]
464464
;
465465
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
466-
%bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
466+
%bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
467467
ret <2 x i64> %bo
468468
}
469469

llvm/test/Transforms/VectorCombine/X86/insert-binop-with-constant.ll

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -305,33 +305,33 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
305305
define <2 x i64> @urem_constant_op0(i64 %x) {
306306
; CHECK-LABEL: @urem_constant_op0(
307307
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
308-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
308+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
309309
; CHECK-NEXT: ret <2 x i64> [[BO]]
310310
;
311-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
311+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
312312
%bo = urem <2 x i64> <i64 5, i64 undef>, %ins
313313
ret <2 x i64> %bo
314314
}
315315

316316
define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
317317
; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
318318
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
319-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
319+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
320320
; CHECK-NEXT: ret <2 x i64> [[BO]]
321321
;
322-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
322+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
323323
%bo = urem <2 x i64> <i64 5, i64 2>, %ins
324324
ret <2 x i64> %bo
325325
}
326326

327327
define <2 x i64> @urem_constant_op1(i64 %x) {
328328
; CHECK-LABEL: @urem_constant_op1(
329329
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
330-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
330+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
331331
; CHECK-NEXT: ret <2 x i64> [[BO]]
332332
;
333333
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
334-
%bo = urem <2 x i64> %ins, <i64 undef, i64 2>
334+
%bo = urem <2 x i64> %ins, <i64 2, i64 2>
335335
ret <2 x i64> %bo
336336
}
337337

@@ -349,33 +349,33 @@ define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) {
349349
define <2 x i64> @srem_constant_op0(i64 %x) {
350350
; CHECK-LABEL: @srem_constant_op0(
351351
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
352-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
352+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
353353
; CHECK-NEXT: ret <2 x i64> [[BO]]
354354
;
355-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
355+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
356356
%bo = srem <2 x i64> <i64 5, i64 undef>, %ins
357357
ret <2 x i64> %bo
358358
}
359359

360360
define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
361361
; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
362362
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
363-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
363+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
364364
; CHECK-NEXT: ret <2 x i64> [[BO]]
365365
;
366-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
366+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
367367
%bo = srem <2 x i64> <i64 5, i64 2>, %ins
368368
ret <2 x i64> %bo
369369
}
370370

371371
define <2 x i64> @srem_constant_op1(i64 %x) {
372372
; CHECK-LABEL: @srem_constant_op1(
373373
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
374-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
374+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
375375
; CHECK-NEXT: ret <2 x i64> [[BO]]
376376
;
377377
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
378-
%bo = srem <2 x i64> %ins, <i64 undef, i64 2>
378+
%bo = srem <2 x i64> %ins, <i64 2, i64 2>
379379
ret <2 x i64> %bo
380380
}
381381

@@ -393,33 +393,33 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
393393
define <2 x i64> @udiv_constant_op0(i64 %x) {
394394
; CHECK-LABEL: @udiv_constant_op0(
395395
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
396-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
396+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
397397
; CHECK-NEXT: ret <2 x i64> [[BO]]
398398
;
399-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
399+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
400400
%bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
401401
ret <2 x i64> %bo
402402
}
403403

404404
define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
405405
; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
406406
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
407-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
407+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
408408
; CHECK-NEXT: ret <2 x i64> [[BO]]
409409
;
410-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
410+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
411411
%bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
412412
ret <2 x i64> %bo
413413
}
414414

415415
define <2 x i64> @udiv_constant_op1(i64 %x) {
416416
; CHECK-LABEL: @udiv_constant_op1(
417417
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
418-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
418+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
419419
; CHECK-NEXT: ret <2 x i64> [[BO]]
420420
;
421421
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
422-
%bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
422+
%bo = udiv <2 x i64> %ins, <i64 2, i64 2>
423423
ret <2 x i64> %bo
424424
}
425425

@@ -437,33 +437,33 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
437437
define <2 x i64> @sdiv_constant_op0(i64 %x) {
438438
; CHECK-LABEL: @sdiv_constant_op0(
439439
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
440-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
440+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
441441
; CHECK-NEXT: ret <2 x i64> [[BO]]
442442
;
443-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
443+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
444444
%bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
445445
ret <2 x i64> %bo
446446
}
447447

448448
define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
449449
; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
450450
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
451-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
451+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
452452
; CHECK-NEXT: ret <2 x i64> [[BO]]
453453
;
454-
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
454+
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
455455
%bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
456456
ret <2 x i64> %bo
457457
}
458458

459459
define <2 x i64> @sdiv_constant_op1(i64 %x) {
460460
; CHECK-LABEL: @sdiv_constant_op1(
461461
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
462-
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
462+
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
463463
; CHECK-NEXT: ret <2 x i64> [[BO]]
464464
;
465465
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
466-
%bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
466+
%bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
467467
ret <2 x i64> %bo
468468
}
469469

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -S -p vector-combine | FileCheck %s
3+
4+
; FIXME: The way we scalarize this today is by creating a
5+
;
6+
; %v = udiv <4 x i8> splat (i8 1), <i8 0, i8 1, i8 1, i8 1>
7+
;
8+
; to insert the scalar into, which is immediate UB. Coincidentally, at creation
9+
; this gets constant folded into <i8 poison, i8 1, i8 1, i8 1>, but we shouldn't
10+
; rely on this.
11+
define <4 x i8> @udiv_ub(i8 %x, i8 %y) {
12+
; CHECK-LABEL: define <4 x i8> @udiv_ub(
13+
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
14+
; CHECK-NEXT: [[V_SCALAR:%.*]] = udiv i8 [[X]], [[Y]]
15+
; CHECK-NEXT: [[V:%.*]] = insertelement <4 x i8> <i8 poison, i8 1, i8 1, i8 1>, i8 [[V_SCALAR]], i64 0
16+
; CHECK-NEXT: ret <4 x i8> [[V]]
17+
;
18+
%x.insert = insertelement <4 x i8> splat (i8 1), i8 %x, i32 0
19+
%y.insert = insertelement <4 x i8> <i8 0, i8 1, i8 1, i8 1>, i8 %y, i32 0
20+
%v = udiv <4 x i8> %x.insert, %y.insert
21+
ret <4 x i8> %v
22+
}

0 commit comments

Comments
 (0)