[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp

Evan Cheng evan.cheng at apple.com
Fri Apr 21 23:21:58 PDT 2006



Changes in directory llvm/lib/Target/X86:

X86ISelLowering.cpp updated: 1.180 -> 1.181
---
Log message:

Fix a performance regression. Use {p}shuf* when there are only two distinct elements in a build_vector.

---
Diffs of the changes:  (+17 -13)

 X86ISelLowering.cpp |   30 +++++++++++++++++-------------
 1 files changed, 17 insertions(+), 13 deletions(-)


Index: llvm/lib/Target/X86/X86ISelLowering.cpp
diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.180 llvm/lib/Target/X86/X86ISelLowering.cpp:1.181
--- llvm/lib/Target/X86/X86ISelLowering.cpp:1.180	Fri Apr 21 18:03:30 2006
+++ llvm/lib/Target/X86/X86ISelLowering.cpp	Sat Apr 22 01:21:46 2006
@@ -3274,22 +3274,26 @@
       return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[0], V[1], ShufMask);
     }
 
-    // Expand into a number of unpckl*.
-    // e.g. for v4f32
-    //   Step 1: unpcklps 0, 2 ==> X: <?, ?, 2, 0>
-    //         : unpcklps 1, 3 ==> Y: <?, ?, 3, 1>
-    //   Step 2: unpcklps X, Y ==>    <3, 2, 1, 0>
-    SDOperand UnpckMask = getUnpacklMask(NumElems, DAG);
-    for (unsigned i = 0; i < NumElems; ++i)
-      V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Op.getOperand(i));
-    NumElems >>= 1;
-    while (NumElems != 0) {
+    if (Values.size() > 2) {
+      // Expand into a number of unpckl*.
+      // e.g. for v4f32
+      //   Step 1: unpcklps 0, 2 ==> X: <?, ?, 2, 0>
+      //         : unpcklps 1, 3 ==> Y: <?, ?, 3, 1>
+      //   Step 2: unpcklps X, Y ==>    <3, 2, 1, 0>
+      SDOperand UnpckMask = getUnpacklMask(NumElems, DAG);
       for (unsigned i = 0; i < NumElems; ++i)
-        V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i], V[i + NumElems],
-                           UnpckMask);
+        V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Op.getOperand(i));
       NumElems >>= 1;
+      while (NumElems != 0) {
+        for (unsigned i = 0; i < NumElems; ++i)
+          V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i], V[i + NumElems],
+                             UnpckMask);
+        NumElems >>= 1;
+      }
+      return V[0];
     }
-    return V[0];
+
+    return SDOperand();
   }
   case ISD::EXTRACT_VECTOR_ELT: {
     if (!isa<ConstantSDNode>(Op.getOperand(1)))






More information about the llvm-commits mailing list