Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ define <vscale x 4 x i32> @scalarize_scalable_udiv(i32 %x, i32 %y) {
; CHECK-NEXT: ret <vscale x 4 x i32> [[R]]
;
%splatx = insertelement <vscale x 4 x i32> poison, i32 %x, i64 0
%splaty = insertelement <vscale x 4 x i32> poison, i32 %y, i64 0
%splaty = insertelement <vscale x 4 x i32> splat (i32 1), i32 %y, i64 0
%r = udiv <vscale x 4 x i32> %splatx, %splaty
ret <vscale x 4 x i32> %r
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,21 +305,21 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @urem_constant_op0(i64 %x) {
; CHECK-LABEL: @urem_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = urem <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = urem <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}
Expand All @@ -331,7 +331,7 @@ define <2 x i64> @urem_constant_op1(i64 %x) {
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
%bo = urem <2 x i64> %ins, <i64 undef, i64 2>
%bo = urem <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand Down Expand Up @@ -360,10 +360,10 @@ define <2 x i64> @srem_constant_op0(i64 %x) {
define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = srem <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}
Expand All @@ -375,7 +375,7 @@ define <2 x i64> @srem_constant_op1(i64 %x) {
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
%bo = srem <2 x i64> %ins, <i64 undef, i64 2>
%bo = srem <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand All @@ -393,21 +393,21 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @udiv_constant_op0(i64 %x) {
; CHECK-LABEL: @udiv_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}
Expand All @@ -419,7 +419,7 @@ define <2 x i64> @udiv_constant_op1(i64 %x) {
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
%bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
%bo = udiv <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand All @@ -437,21 +437,21 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @sdiv_constant_op0(i64 %x) {
; CHECK-LABEL: @sdiv_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}
Expand All @@ -463,7 +463,7 @@ define <2 x i64> @sdiv_constant_op1(i64 %x) {
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> poison, i64 %x, i32 1
%bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
%bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,33 +305,33 @@ define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @urem_constant_op0(i64 %x) {
; CHECK-LABEL: @urem_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = urem <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @urem_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = urem <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @urem_constant_op1(i64 %x) {
; CHECK-LABEL: @urem_constant_op1(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
%bo = urem <2 x i64> %ins, <i64 undef, i64 2>
%bo = urem <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand All @@ -349,33 +349,33 @@ define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @srem_constant_op0(i64 %x) {
; CHECK-LABEL: @srem_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = srem <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @srem_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = srem <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @srem_constant_op1(i64 %x) {
; CHECK-LABEL: @srem_constant_op1(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
%bo = srem <2 x i64> %ins, <i64 undef, i64 2>
%bo = srem <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand All @@ -393,33 +393,33 @@ define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @udiv_constant_op0(i64 %x) {
; CHECK-LABEL: @udiv_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @udiv_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @udiv_constant_op1(i64 %x) {
; CHECK-LABEL: @udiv_constant_op1(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
%bo = udiv <2 x i64> %ins, <i64 undef, i64 2>
%bo = udiv <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand All @@ -437,33 +437,33 @@ define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) {
define <2 x i64> @sdiv_constant_op0(i64 %x) {
; CHECK-LABEL: @sdiv_constant_op0(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 undef>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) {
; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]]
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 5, i64 2>, i64 [[BO_SCALAR]], i64 0
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 0
%ins = insertelement <2 x i64> splat (i64 1), i64 %x, i32 0
%bo = sdiv <2 x i64> <i64 5, i64 2>, %ins
ret <2 x i64> %bo
}

define <2 x i64> @sdiv_constant_op1(i64 %x) {
; CHECK-LABEL: @sdiv_constant_op1(
; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1
; CHECK-NEXT: ret <2 x i64> [[BO]]
;
%ins = insertelement <2 x i64> undef, i64 %x, i32 1
%bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2>
%bo = sdiv exact <2 x i64> %ins, <i64 2, i64 2>
ret <2 x i64> %bo
}

Expand Down
22 changes: 22 additions & 0 deletions llvm/test/Transforms/VectorCombine/binop-scalarize.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s -S -p vector-combine | FileCheck %s

; FIXME: The way we scalarize this today is by creating a
;
; %v = udiv <4 x i8> splat (i8 1), <i8 0, i8 1, i8 1, i8 1>
;
; to insert the scalar into, which is immediate UB. Coincidentally, at creation
; this gets constant folded into <i8 poison, i8 1, i8 1, i8 1>, but we shouldn't
; rely on this.
define <4 x i8> @udiv_ub(i8 %x, i8 %y) {
; CHECK-LABEL: define <4 x i8> @udiv_ub(
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
; CHECK-NEXT: [[V_SCALAR:%.*]] = udiv i8 [[X]], [[Y]]
; CHECK-NEXT: [[V:%.*]] = insertelement <4 x i8> <i8 poison, i8 1, i8 1, i8 1>, i8 [[V_SCALAR]], i64 0
; CHECK-NEXT: ret <4 x i8> [[V]]
;
%x.insert = insertelement <4 x i8> splat (i8 1), i8 %x, i32 0
%y.insert = insertelement <4 x i8> <i8 0, i8 1, i8 1, i8 1>, i8 %y, i32 0
%v = udiv <4 x i8> %x.insert, %y.insert
ret <4 x i8> %v
}
Loading