[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner sabre at nondot.org
Sat Apr 14 16:02:36 PDT 2007



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.744 -> 1.745
---
Log message:

Implement Transforms/InstCombine/vec_extract_elt.ll, transforming:

define i32 @test(float %f) {
        %tmp7 = insertelement <4 x float> undef, float %f, i32 0                
        %tmp17 = bitcast <4 x float> %tmp7 to <4 x i32>         
        %tmp19 = extractelement <4 x i32> %tmp17, i32 0         
        ret i32 %tmp19
}

into:

define i32 @test(float %f) {
        %tmp19 = bitcast float %f to i32                ; <i32> [#uses=1]
        ret i32 %tmp19
}

On PPC, this is the difference between:

_test:
        mfspr r2, 256
        oris r3, r2, 8192
        mtspr 256: http://llvm.org/PR256 , r3
        stfs f1, -16(r1)
        addi r3, r1, -16
        addi r4, r1, -32
        lvx v2, 0, r3
        stvx v2, 0, r4
        lwz r3, -32(r1)
        mtspr 256: http://llvm.org/PR256 , r2
        blr 

and:

_test:
        stfs f1, -4(r1)
        nop
        nop
        nop
        lwz r3, -4(r1)
        blr 



---
Diffs of the changes:  (+11 -0)

 InstructionCombining.cpp |   11 +++++++++++
 1 files changed, 11 insertions(+)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.744 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.745
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.744	Sat Apr 14 17:29:23 2007
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Sat Apr 14 18:02:14 2007
@@ -9109,6 +9109,17 @@
     
     if (Value *Elt = FindScalarElement(EI.getOperand(0), IndexVal))
       return ReplaceInstUsesWith(EI, Elt);
+    
+    // If the this extractelement is directly using a bitcast from a vector of
+    // the same number of elements, see if we can find the source element from
+    // it.  In this case, we will end up needing to bitcast the scalars.
+    if (BitCastInst *BCI = dyn_cast<BitCastInst>(EI.getOperand(0))) {
+      if (const VectorType *VT = 
+              dyn_cast<VectorType>(BCI->getOperand(0)->getType()))
+        if (VT->getNumElements() == VectorWidth)
+          if (Value *Elt = FindScalarElement(BCI->getOperand(0), IndexVal))
+            return new BitCastInst(Elt, EI.getType());
+    }
   }
   
   if (Instruction *I = dyn_cast<Instruction>(EI.getOperand(0))) {






More information about the llvm-commits mailing list