mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-28 00:50:37 +00:00
Eliminate useless insertelement instructions. This implements
Transforms/InstCombine/vec_insertelt.ll and fixes PR1286. We now compile the code from that bug into: _foo: movl 4(%esp), %eax movdqa (%eax), %xmm0 movl 8(%esp), %ecx psllw (%ecx), %xmm0 movdqa %xmm0, (%eax) ret instead of: _foo: subl $4, %esp movl %ebp, (%esp) movl %esp, %ebp movl 12(%ebp), %eax movdqa (%eax), %xmm0 #IMPLICIT_DEF %eax pinsrw $2, %eax, %xmm0 xorl %ecx, %ecx pinsrw $3, %ecx, %xmm0 pinsrw $4, %eax, %xmm0 pinsrw $5, %ecx, %xmm0 pinsrw $6, %eax, %xmm0 pinsrw $7, %ecx, %xmm0 movl 8(%ebp), %eax movdqa (%eax), %xmm1 psllw %xmm0, %xmm1 movdqa %xmm1, (%eax) movl %ebp, %esp popl %ebp ret woo :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35788 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2d87734a8f
commit
599ded1a7f
@ -9160,6 +9160,10 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) {
|
||||
Value *ScalarOp = IE.getOperand(1);
|
||||
Value *IdxOp = IE.getOperand(2);
|
||||
|
||||
// Inserting an undef or into an undefined place, remove this.
|
||||
if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp))
|
||||
ReplaceInstUsesWith(IE, VecOp);
|
||||
|
||||
// If the inserted element was extracted from some other vector, and if the
|
||||
// indexes are constant, try to turn this into a shufflevector operation.
|
||||
if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user