[llvm-commits] [llvm] r114117 - in /llvm/trunk: include/llvm/Analysis/InstructionSimplify.h include/llvm/Transforms/Utils/Local.h lib/Analysis/InstructionSimplify.cpp

Owen Anderson resistor at mac.com
Thu Sep 16 13:51:41 PDT 2010


Author: resistor
Date: Thu Sep 16 15:51:41 2010
New Revision: 114117

URL: http://llvm.org/viewvc/llvm-project?rev=114117&view=rev
Log:
Revert r114097, adding back in the assertion against replacing an Instruction by itself.  Now that CorrelatedValuePropagation is
more careful not to call SimplifyInstructionsInBlock() on an unreachable block, the issue has been fixed at a higher level.  Add
a big warning to SimplifyInstructionsInBlock() to hopefully prevent this in the future.

Modified:
    llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
    llvm/trunk/include/llvm/Transforms/Utils/Local.h
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp

Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=114117&r1=114116&r2=114117&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (original)
+++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Thu Sep 16 15:51:41 2010
@@ -71,6 +71,8 @@
   
   /// SimplifyInstruction - See if we can compute a simplified version of this
   /// instruction.  If not, this returns null.
+  /// WARNING: If called on unreachable code, an instruction may be reported
+  /// to simplify to itself.
   Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0);
   
   

Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=114117&r1=114116&r2=114117&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
+++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Thu Sep 16 15:51:41 2010
@@ -69,6 +69,10 @@
 ///
 /// This returns true if it changed the code, note that it can delete
 /// instructions in other blocks as well in this block.
+///
+/// WARNING: Do not use this function on unreachable blocks, as recursive
+/// simplification is not able to handle corner-case scenarios that can
+/// arise in them.
 bool SimplifyInstructionsInBlock(BasicBlock *BB, const TargetData *TD = 0);
     
 //===----------------------------------------------------------------------===//

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=114117&r1=114116&r2=114117&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Thu Sep 16 15:51:41 2010
@@ -423,44 +423,31 @@
 /// SimplifyInstruction - See if we can compute a simplified version of this
 /// instruction.  If not, this returns null.
 Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
-  Value *Ret = 0;
   switch (I->getOpcode()) {
   default:
     return ConstantFoldInstruction(I, TD);
   case Instruction::Add:
-    Ret = SimplifyAddInst(I->getOperand(0), I->getOperand(1),
-                          cast<BinaryOperator>(I)->hasNoSignedWrap(),
-                          cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
-    break; 
+    return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
+                           cast<BinaryOperator>(I)->hasNoSignedWrap(),
+                           cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
   case Instruction::And:
-    Ret =  SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
-    break;
+    return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
   case Instruction::Or:
-    Ret = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
-    break;
+    return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
   case Instruction::ICmp:
-    Ret = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
-                           I->getOperand(0), I->getOperand(1), TD);
-    break;
+    return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
+                            I->getOperand(0), I->getOperand(1), TD);
   case Instruction::FCmp:
-    Ret = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
-                           I->getOperand(0), I->getOperand(1), TD);
-    break;
+    return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
+                            I->getOperand(0), I->getOperand(1), TD);
   case Instruction::Select:
-    Ret = SimplifySelectInst(I->getOperand(0), I->getOperand(1),
+    return SimplifySelectInst(I->getOperand(0), I->getOperand(1),
                               I->getOperand(2), TD);
-    break;
   case Instruction::GetElementPtr: {
     SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
-    Ret = SimplifyGEPInst(&Ops[0], Ops.size(), TD);
-    break;
+    return SimplifyGEPInst(&Ops[0], Ops.size(), TD);
   }
   }
-  
-  // It is possible, in situations involving unreachable loops, to
-  // have a replacement that, through recursive simplification, ends up
-  // simplifying to itself.
-  return Ret != I ? Ret : 0;
 }
 
 /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then





More information about the llvm-commits mailing list