[llvm-commits] [llvm] r119558 - /llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp

Evan Cheng evan.cheng at apple.com
Wed Nov 17 12:56:31 PST 2010


Author: evancheng
Date: Wed Nov 17 14:56:30 2010
New Revision: 119558

URL: http://llvm.org/viewvc/llvm-project?rev=119558&view=rev
Log:
Avoid isel movcc of large immediates when the large immediate is available in a register. These immediates aren't free.

Modified:
    llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=119558&r1=119557&r2=119558&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Wed Nov 17 14:56:30 2010
@@ -1777,20 +1777,21 @@
 
 SDNode *ARMDAGToDAGISel::
 SelectT2CMOVImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
-                    ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
+                  ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
   ConstantSDNode *T = dyn_cast<ConstantSDNode>(TrueVal);
-  if (!T)
+  if (!T || !TrueVal.getNode()->hasOneUse())
     return 0;
 
   unsigned Opc = 0;
   unsigned TrueImm = T->getZExtValue();
-  bool isSoImm = is_t2_so_imm(TrueImm);
-  if (isSoImm || TrueImm <= 0xffff) {
-    Opc = isSoImm ? ARM::t2MOVCCi : ARM::t2MOVCCi16;
+  if (is_t2_so_imm(TrueImm)) {
+    Opc = ARM::t2MOVCCi;
+  } else if (TrueImm <= 0xffff) {
+    Opc = ARM::t2MOVCCi16;
   } else if (is_t2_so_imm_not(TrueImm)) {
     TrueImm = ~TrueImm;
     Opc = ARM::t2MVNCCi;
-  } else if (Subtarget->hasV6T2Ops()) {
+  } else if (TrueVal.getNode()->hasOneUse() && Subtarget->hasV6T2Ops()) {
     // Large immediate.
     Opc = ARM::t2MOVCCi32imm;
   }
@@ -1807,7 +1808,7 @@
 
 SDNode *ARMDAGToDAGISel::
 SelectARMCMOVImmOp(SDNode *N, SDValue FalseVal, SDValue TrueVal,
-                     ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
+                   ARMCC::CondCodes CCVal, SDValue CCR, SDValue InFlag) {
   ConstantSDNode *T = dyn_cast<ConstantSDNode>(TrueVal);
   if (!T)
     return 0;
@@ -1815,12 +1816,15 @@
   unsigned Opc = 0;
   unsigned TrueImm = T->getZExtValue();
   bool isSoImm = is_so_imm(TrueImm);
-  if (isSoImm || (Subtarget->hasV6T2Ops() && TrueImm <= 0xffff)) {
-    Opc = isSoImm ? ARM::MOVCCi : ARM::MOVCCi16;
+  if (isSoImm) {
+    Opc = ARM::MOVCCi;
+  } else if (Subtarget->hasV6T2Ops() && TrueImm <= 0xffff) {
+    Opc = ARM::MOVCCi16;
   } else if (is_so_imm_not(TrueImm)) {
     TrueImm = ~TrueImm;
     Opc = ARM::MVNCCi;
-  } else if (Subtarget->hasV6T2Ops() || ARM_AM::isSOImmTwoPartVal(TrueImm)) {
+  } else if (TrueVal.getNode()->hasOneUse() &&
+             (Subtarget->hasV6T2Ops() || ARM_AM::isSOImmTwoPartVal(TrueImm))) {
     // Large immediate.
     Opc = ARM::MOVCCi32imm;
   }





More information about the llvm-commits mailing list