mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-16 19:19:10 +00:00
[InstCombine] Teach InstCombine how to handle an obfuscated splat.
An obfuscated splat is where the frontend poorly generates code for a splat using several different shuffles to create the splat, i.e., %A = load <4 x float>* %in_ptr, align 16 %B = shufflevector <4 x float> %A, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 undef, i32 undef> %C = shufflevector <4 x float> %B, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 4, i32 undef> %D = shufflevector <4 x float> %C, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 2, i32 4> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166061 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c5ac87d067
commit
4932bbe20c
@ -636,8 +636,11 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
|
||||
|
||||
// If LHS's width is changed, shift the mask value accordingly.
|
||||
// If newRHS == NULL, i.e. LHSOp0 == RHSOp0, we want to remap any
|
||||
// references to RHSOp0 to LHSOp0, so we don't need to shift the mask.
|
||||
if (eltMask >= 0 && newRHS != NULL)
|
||||
// references from RHSOp0 to LHSOp0, so we don't need to shift the mask.
|
||||
// If newRHS == newLHS, we want to remap any references from newRHS to
|
||||
// newLHS so that we can properly identify splats that may occur due to
|
||||
// obfuscation accross the two vectors.
|
||||
if (eltMask >= 0 && newRHS != NULL && newLHS != newRHS)
|
||||
eltMask += newLHSWidth;
|
||||
}
|
||||
|
||||
|
11
test/Transforms/InstCombine/obfuscated_splat.ll
Normal file
11
test/Transforms/InstCombine/obfuscated_splat.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: opt -instcombine -S %s | FileCheck %s
|
||||
|
||||
define void @test(<4 x float> *%in_ptr, <4 x float> *%out_ptr) {
|
||||
%A = load <4 x float>* %in_ptr, align 16
|
||||
%B = shufflevector <4 x float> %A, <4 x float> undef, <4 x i32> <i32 0, i32 0, i32 undef, i32 undef>
|
||||
%C = shufflevector <4 x float> %B, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 4, i32 undef>
|
||||
%D = shufflevector <4 x float> %C, <4 x float> %A, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
|
||||
; CHECK: %D = shufflevector <4 x float> %A, <4 x float> undef, <4 x i32> zeroinitializer
|
||||
store <4 x float> %D, <4 x float> *%out_ptr
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user