forked from OSchip/llvm-project
				
			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 :)
llvm-svn: 35788
			
			
This commit is contained in:
		
							parent
							
								
									418bf4eb1c
								
							
						
					
					
						commit
						4ca9cbb170
					
				| 
						 | 
				
			
			@ -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…
	
		Reference in New Issue