forked from OSchip/llvm-project
[InstCombine] fold extract subvector of bitcast insertelt
This is visible in the original example from: https://llvm.org/PR50055 (but this change doesn't solve the bug) https://alive2.llvm.org/ce/z/vM_Yq-
This commit is contained in:
parent
8a74cc139d
commit
5577e86691
|
@ -2080,13 +2080,22 @@ static Instruction *narrowVectorSelect(ShuffleVectorInst &Shuf,
|
|||
return SelectInst::Create(NarrowCond, NarrowX, NarrowY);
|
||||
}
|
||||
|
||||
/// Try to combine 2 shuffles into 1 shuffle by concatenating a shuffle mask.
|
||||
/// Try to fold an extract subvector operation.
|
||||
static Instruction *foldIdentityExtractShuffle(ShuffleVectorInst &Shuf) {
|
||||
Value *Op0 = Shuf.getOperand(0), *Op1 = Shuf.getOperand(1);
|
||||
if (!Shuf.isIdentityWithExtract() || !match(Op1, m_Undef()))
|
||||
return nullptr;
|
||||
|
||||
Value *X, *Y;
|
||||
// Check if we are extracting all bits of an inserted scalar:
|
||||
// extract-subvec (bitcast (inselt ?, X, 0) --> bitcast X to subvec type
|
||||
Value *X;
|
||||
if (match(Op0, m_BitCast(m_InsertElt(m_Value(), m_Value(X), m_Zero()))) &&
|
||||
X->getType()->getPrimitiveSizeInBits() ==
|
||||
Shuf.getType()->getPrimitiveSizeInBits())
|
||||
return new BitCastInst(X, Shuf.getType());
|
||||
|
||||
// Try to combine 2 shuffles into 1 shuffle by concatenating a shuffle mask.
|
||||
Value *Y;
|
||||
ArrayRef<int> Mask;
|
||||
if (!match(Op0, m_Shuffle(m_Value(X), m_Value(Y), m_Mask(Mask))))
|
||||
return nullptr;
|
||||
|
|
|
@ -170,9 +170,7 @@ define <16 x i8> @shuf_bitcast_operand_cannot_widen_undef(<4 x i32> %x) {
|
|||
|
||||
define <2 x i4> @shuf_bitcast_insert(<2 x i8> %v, i8 %x) {
|
||||
; CHECK-LABEL: @shuf_bitcast_insert(
|
||||
; CHECK-NEXT: [[I:%.*]] = insertelement <2 x i8> poison, i8 [[X:%.*]], i32 0
|
||||
; CHECK-NEXT: [[B:%.*]] = bitcast <2 x i8> [[I]] to <4 x i4>
|
||||
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i4> [[B]], <4 x i4> undef, <2 x i32> <i32 0, i32 1>
|
||||
; CHECK-NEXT: [[R:%.*]] = bitcast i8 [[X:%.*]] to <2 x i4>
|
||||
; CHECK-NEXT: ret <2 x i4> [[R]]
|
||||
;
|
||||
%i = insertelement <2 x i8> %v, i8 %x, i32 0
|
||||
|
@ -185,8 +183,7 @@ define <2 x i4> @shuf_bitcast_inserti_use1(<2 x i8> %v, i8 %x, <2 x i8>* %p) {
|
|||
; CHECK-LABEL: @shuf_bitcast_inserti_use1(
|
||||
; CHECK-NEXT: [[I:%.*]] = insertelement <2 x i8> [[V:%.*]], i8 [[X:%.*]], i32 0
|
||||
; CHECK-NEXT: store <2 x i8> [[I]], <2 x i8>* [[P:%.*]], align 2
|
||||
; CHECK-NEXT: [[B:%.*]] = bitcast <2 x i8> [[I]] to <4 x i4>
|
||||
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i4> [[B]], <4 x i4> undef, <2 x i32> <i32 0, i32 1>
|
||||
; CHECK-NEXT: [[R:%.*]] = bitcast i8 [[X]] to <2 x i4>
|
||||
; CHECK-NEXT: ret <2 x i4> [[R]]
|
||||
;
|
||||
%i = insertelement <2 x i8> %v, i8 %x, i32 0
|
||||
|
@ -199,10 +196,9 @@ define <2 x i4> @shuf_bitcast_inserti_use1(<2 x i8> %v, i8 %x, <2 x i8>* %p) {
|
|||
define <2 x i4> @shuf_bitcast_insert_use2(<2 x i8> %v, i8 %x, <4 x i4>* %p) {
|
||||
; CHECK-LABEL: @shuf_bitcast_insert_use2(
|
||||
; CHECK-NEXT: [[I:%.*]] = insertelement <2 x i8> [[V:%.*]], i8 [[X:%.*]], i32 0
|
||||
; CHECK-NEXT: [[B:%.*]] = bitcast <2 x i8> [[I]] to <4 x i4>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i4>* [[P:%.*]] to <2 x i8>*
|
||||
; CHECK-NEXT: store <2 x i8> [[I]], <2 x i8>* [[TMP1]], align 4
|
||||
; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x i4> [[B]], <4 x i4> undef, <2 x i32> <i32 0, i32 1>
|
||||
; CHECK-NEXT: [[R:%.*]] = bitcast i8 [[X]] to <2 x i4>
|
||||
; CHECK-NEXT: ret <2 x i4> [[R]]
|
||||
;
|
||||
%i = insertelement <2 x i8> %v, i8 %x, i32 0
|
||||
|
@ -212,6 +208,8 @@ define <2 x i4> @shuf_bitcast_insert_use2(<2 x i8> %v, i8 %x, <4 x i4>* %p) {
|
|||
ret <2 x i4> %r
|
||||
}
|
||||
|
||||
; negative test - but demanded elements reduces this.
|
||||
|
||||
define <2 x i4> @shuf_bitcast_insert_wrong_index(<2 x i8> %v, i8 %x) {
|
||||
; CHECK-LABEL: @shuf_bitcast_insert_wrong_index(
|
||||
; CHECK-NEXT: [[B:%.*]] = bitcast <2 x i8> [[V:%.*]] to <4 x i4>
|
||||
|
@ -224,6 +222,8 @@ define <2 x i4> @shuf_bitcast_insert_wrong_index(<2 x i8> %v, i8 %x) {
|
|||
ret <2 x i4> %r
|
||||
}
|
||||
|
||||
; negative test
|
||||
|
||||
define <3 x i4> @shuf_bitcast_wrong_size(<2 x i8> %v, i8 %x) {
|
||||
; CHECK-LABEL: @shuf_bitcast_wrong_size(
|
||||
; CHECK-NEXT: [[I:%.*]] = insertelement <2 x i8> [[V:%.*]], i8 [[X:%.*]], i32 0
|
||||
|
|
Loading…
Reference in New Issue