Avoid non-trivial loop unswitching while optimizing for size.
authorDevang Patel <dpatel@apple.com>
Wed, 6 Jun 2007 00:21:03 +0000 (00:21 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 6 Jun 2007 00:21:03 +0000 (00:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37446 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Scalar.h
lib/Transforms/Scalar/LoopUnswitch.cpp

index 67e881bb5360b6475000c093b20fbd688388e3af..3d88a2f08ecb383513c39dde374f3fe7b67b6070 100644 (file)
@@ -127,7 +127,7 @@ LoopPass *createLoopStrengthReducePass(const TargetLowering *TLI = 0);
 //
 // LoopUnswitch - This pass is a simple loop unswitching pass.
 //
-LoopPass *createLoopUnswitchPass();
+LoopPass *createLoopUnswitchPass(bool Os = false);
 
 //===----------------------------------------------------------------------===//
 //
index 61510a71003a2b29eb39c4cf66f70c312644ccfd..7ad3bd626c13f7dd8aefabb1a37dc04c62fdb214 100644 (file)
@@ -67,10 +67,12 @@ namespace {
     // after RewriteLoopBodyWithConditionConstant rewrites first loop.
     std::vector<Loop*> LoopProcessWorklist;
     SmallPtrSet<Value *,8> UnswitchedVals;
-
+    
+    bool OptimizeForSize;
   public:
     static char ID; // Pass ID, replacement for typeid
-    LoopUnswitch() : LoopPass((intptr_t)&ID) {}
+    LoopUnswitch(bool Os = false) : 
+      LoopPass((intptr_t)&ID), OptimizeForSize(Os) {}
 
     bool runOnLoop(Loop *L, LPPassManager &LPM);
 
@@ -116,7 +118,9 @@ namespace {
   RegisterPass<LoopUnswitch> X("loop-unswitch", "Unswitch loops");
 }
 
-LoopPass *llvm::createLoopUnswitchPass() { return new LoopUnswitch(); }
+LoopPass *llvm::createLoopUnswitchPass(bool Os) { 
+  return new LoopUnswitch(Os); 
+}
 
 /// FindLIVLoopCondition - Cond is a condition that occurs in L.  If it is
 /// invariant in the loop, or has an invariant piece, return the invariant.
@@ -359,6 +363,11 @@ unsigned LoopUnswitch::getLoopUnswitchCost(Loop *L, Value *LIC) {
 bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val,Loop *L){
   // Check to see if it would be profitable to unswitch this loop.
   unsigned Cost = getLoopUnswitchCost(L, LoopCond);
+
+  // Do not do non-trivial unswitch while optimizing for size.
+  if (Cost && OptimizeForSize)
+    return false;
+
   if (Cost > Threshold) {
     // FIXME: this should estimate growth by the amount of code shared by the
     // resultant unswitched loops.