Avoid creating shift-by-zero SDNodes in the common case of
authorDan Gohman <gohman@apple.com>
Sat, 23 Aug 2008 01:06:51 +0000 (01:06 +0000)
committerDan Gohman <gohman@apple.com>
Sat, 23 Aug 2008 01:06:51 +0000 (01:06 +0000)
i8* getelementptr. DAGCombine eliminates these, but this is
a fairly common case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55214 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index e13cfc0fa034e0086db2919985e036b1dddf6f24..147f45c8b53b34c4808f6a6129c9ae538419000d 100644 (file)
@@ -2814,16 +2814,17 @@ void SelectionDAGLowering::visitGetElementPtr(User &I) {
 
       // If this is a multiply by a power of two, turn it into a shl
       // immediately.  This is a very common case.
-      if (isPowerOf2_64(ElementSize)) {
-        unsigned Amt = Log2_64(ElementSize);
-        IdxN = DAG.getNode(ISD::SHL, N.getValueType(), IdxN,
-                           DAG.getConstant(Amt, TLI.getShiftAmountTy()));
-        N = DAG.getNode(ISD::ADD, N.getValueType(), N, IdxN);
-        continue;
+      if (ElementSize != 1) {
+        if (isPowerOf2_64(ElementSize)) {
+          unsigned Amt = Log2_64(ElementSize);
+          IdxN = DAG.getNode(ISD::SHL, N.getValueType(), IdxN,
+                             DAG.getConstant(Amt, TLI.getShiftAmountTy()));
+        } else {
+          SDValue Scale = DAG.getIntPtrConstant(ElementSize);
+          IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN, Scale);
+        }
       }
-      
-      SDValue Scale = DAG.getIntPtrConstant(ElementSize);
-      IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN, Scale);
+
       N = DAG.getNode(ISD::ADD, N.getValueType(), N, IdxN);
     }
   }