mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
[InstCombine] avoid infinite loop from shuffle-extract-insert sequence (PR30923)
Removing the limitation in visitInsertElementInst() causes several regressions because we're not prepared to fold sequences of shuffles or inserts and extracts separated by shuffles. Fixing that appears to be a difficult mission because we are purposely trying to avoid creating shuffles with arbitrary shuffle masks because some targets may choke on those. https://llvm.org/bugs/show_bug.cgi?id=30923 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286423 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
027f4d03c6
commit
9c5e4bac4a
@ -413,6 +413,14 @@ static void replaceExtractElements(InsertElementInst *InsElt,
|
||||
if (InsertionBlock != InsElt->getParent())
|
||||
return;
|
||||
|
||||
// TODO: This restriction matches the check in visitInsertElementInst() and
|
||||
// prevents an infinite loop caused by not turning the extract/insert pair
|
||||
// into a shuffle. We really should not need either check, but we're lacking
|
||||
// folds for shufflevectors because we're afraid to generate shuffle masks
|
||||
// that the backend can't handle.
|
||||
if (InsElt->hasOneUse() && isa<InsertElementInst>(InsElt->user_back()))
|
||||
return;
|
||||
|
||||
auto *WideVec = new ShuffleVectorInst(ExtVecOp, UndefValue::get(ExtVecType),
|
||||
ConstantVector::get(ExtendMask));
|
||||
|
||||
|
@ -237,3 +237,30 @@ end:
|
||||
ret double %mu
|
||||
}
|
||||
|
||||
; https://llvm.org/bugs/show_bug.cgi?id=30923
|
||||
; Delete the widening shuffle if we're not going to reduce the extract/insert to a shuffle.
|
||||
|
||||
define <4 x float> @PR30923(<2 x float> %x) {
|
||||
; CHECK-LABEL: @PR30923(
|
||||
; CHECK-NEXT: bb1:
|
||||
; CHECK-NEXT: [[EXT1:%.*]] = extractelement <2 x float> %x, i32 1
|
||||
; CHECK-NEXT: store float [[EXT1]], float* undef, align 4
|
||||
; CHECK-NEXT: br label %bb2
|
||||
; CHECK: bb2:
|
||||
; CHECK-NEXT: [[EXT2:%.*]] = extractelement <2 x float> %x, i32 0
|
||||
; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x float> <float 0.000000e+00, float 0.000000e+00, float undef, float undef>, float [[EXT2]], i32 2
|
||||
; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x float> [[INS1]], float [[EXT1]], i32 3
|
||||
; CHECK-NEXT: ret <4 x float> [[INS2]]
|
||||
;
|
||||
bb1:
|
||||
%ext1 = extractelement <2 x float> %x, i32 1
|
||||
store float %ext1, float* undef, align 4
|
||||
br label %bb2
|
||||
|
||||
bb2:
|
||||
%widen = shufflevector <2 x float> %x, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
|
||||
%ext2 = extractelement <4 x float> %widen, i32 0
|
||||
%ins1 = insertelement <4 x float> <float 0.0, float 0.0, float undef, float undef>, float %ext2, i32 2
|
||||
%ins2 = insertelement <4 x float> %ins1, float %ext1, i32 3
|
||||
ret <4 x float> %ins2
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user