[llvm-commits] [llvm] r60013 - /llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp

Chris Lattner sabre at nondot.org
Mon Nov 24 23:25:26 PST 2008


Author: lattner
Date: Tue Nov 25 01:25:26 2008
New Revision: 60013

URL: http://llvm.org/viewvc/llvm-project?rev=60013&view=rev
Log:
Teach MatchScaledValue to handle Scales by 1 with MatchAddr (which
can recursively match things) and scales by 0 by ignoring them.
This triggers once in 403.gcc, saving 1 (!!!!) instruction in the 
whole huge app.

Modified:
    llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp?rev=60013&r1=60012&r2=60013&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp Tue Nov 25 01:25:26 2008
@@ -557,7 +557,7 @@
     return Result;
   }
 private:
-  bool MatchScaledValue(Value *ScaleReg, int64_t Scale);
+  bool MatchScaledValue(Value *ScaleReg, int64_t Scale, unsigned Depth);
   bool MatchAddr(Value *V, unsigned Depth);
   bool MatchOperationAddr(User *Operation, unsigned Opcode, unsigned Depth);
 };
@@ -566,7 +566,17 @@
 /// MatchScaledValue - Try adding ScaleReg*Scale to the current addressing mode.
 /// Return true and update AddrMode if this addr mode is legal for the target,
 /// false if not.
-bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale) {
+bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale,
+                                             unsigned Depth) {
+  // If Scale is 1, then this is the same as adding ScaleReg to the addressing
+  // mode.  Just process that directly.
+  if (Scale == 1)
+    return MatchAddr(ScaleReg, Depth);
+  
+  // If the scale is 0, it takes nothing to add this.
+  if (Scale == 0)
+    return true;
+  
   // If we already have a scale of this value, we can add to it, otherwise, we
   // need an available scale field.
   if (AddrMode.Scale != 0 && AddrMode.ScaledReg != ScaleReg)
@@ -663,7 +673,7 @@
     if (Opcode == Instruction::Shl)
       Scale = 1 << Scale;
     
-    return MatchScaledValue(AddrInst->getOperand(0), Scale);
+    return MatchScaledValue(AddrInst->getOperand(0), Scale, Depth);
   }
   case Instruction::GetElementPtr: {
     // Scan the GEP.  We check it if it contains constant offsets and at most
@@ -728,8 +738,8 @@
     // See if the scale and offset amount is valid for this target.
     AddrMode.BaseOffs += ConstantOffset;
     
-    // FIXME: If VariableScale = 1, just call MatchAddr recursively?
-    if (!MatchScaledValue(AddrInst->getOperand(VariableOperand),VariableScale)){
+    if (!MatchScaledValue(AddrInst->getOperand(VariableOperand), VariableScale,
+                          Depth)) {
       AddrMode = BackupAddrMode;
       return false;
     }





More information about the llvm-commits mailing list