MOVL shuffle (i.e. movd or movss / movsd from memory) of undef, V2 == V2
authorEvan Cheng <evan.cheng@apple.com>
Sun, 23 Apr 2006 06:35:19 +0000 (06:35 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sun, 23 Apr 2006 06:35:19 +0000 (06:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27953 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp

index 3861fc35940256cfb4a91295b8764fe570d54818..8d52c56f072560d67ff39d3b57928c05b21e83ff 100644 (file)
@@ -2973,6 +2973,8 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
     SDOperand PermMask = Op.getOperand(2);
     MVT::ValueType VT = Op.getValueType();
     unsigned NumElems = PermMask.getNumOperands();
+    bool V1IsUndef = V1.getOpcode() == ISD::UNDEF;
+    bool V2IsUndef = V2.getOpcode() == ISD::UNDEF;
 
     if (isSplatMask(PermMask.Val)) {
       if (NumElems <= 4) return Op;
@@ -2980,8 +2982,10 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
       return PromoteSplat(Op, DAG);
     }
 
-    if (X86::isMOVLMask(PermMask.Val) ||
-        X86::isMOVSHDUPMask(PermMask.Val) ||
+    if (X86::isMOVLMask(PermMask.Val))
+      return (V1IsUndef) ? V2 : Op;
+      
+    if (X86::isMOVSHDUPMask(PermMask.Val) ||
         X86::isMOVSLDUPMask(PermMask.Val) ||
         X86::isMOVHLPSMask(PermMask.Val) ||
         X86::isMOVHPMask(PermMask.Val) ||
@@ -3003,6 +3007,7 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
     }
 
     if (isCommutedMOVL(PermMask.Val, V2IsSplat)) {
+      if (V2IsUndef) return V1;
       Op = CommuteVectorShuffle(Op, DAG);
       V1 = Op.getOperand(0);
       V2 = Op.getOperand(1);