r199302 - CodeGen: Simplify CodeGenFunction::EmitCaseStmt

Justin Bogner mail at justinbogner.com
Tue Jan 14 23:30:30 PST 2014


Author: bogner
Date: Wed Jan 15 01:30:30 2014
New Revision: 199302

URL: http://llvm.org/viewvc/llvm-project?rev=199302&view=rev
Log:
CodeGen: Simplify CodeGenFunction::EmitCaseStmt

Way back in r129652 we tried to avoid emitting an empty block at -O0
for switch cases that did nothing but break. This led to a poor
debugging experience as reported in PR9796, so we disabled the
optimization for -O0 but left it in for higher optimization levels in
r154420.

Since the whole point of this was to improve -O0, it's silly to keep
the complexity at all.

Modified:
    cfe/trunk/lib/CodeGen/CGCleanup.cpp
    cfe/trunk/lib/CodeGen/CGStmt.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CGCleanup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCleanup.cpp?rev=199302&r1=199301&r2=199302&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCleanup.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCleanup.cpp Wed Jan 15 01:30:30 2014
@@ -883,29 +883,6 @@ void CodeGenFunction::PopCleanupBlock(bo
   }
 }
 
-/// isObviouslyBranchWithoutCleanups - Return true if a branch to the
-/// specified destination obviously has no cleanups to run.  'false' is always
-/// a conservatively correct answer for this method.
-bool CodeGenFunction::isObviouslyBranchWithoutCleanups(JumpDest Dest) const {
-  assert(Dest.getScopeDepth().encloses(EHStack.stable_begin())
-         && "stale jump destination");
-  
-  // Calculate the innermost active normal cleanup.
-  EHScopeStack::stable_iterator TopCleanup =
-    EHStack.getInnermostActiveNormalCleanup();
-  
-  // If we're not in an active normal cleanup scope, or if the
-  // destination scope is within the innermost active normal cleanup
-  // scope, we don't need to worry about fixups.
-  if (TopCleanup == EHStack.stable_end() ||
-      TopCleanup.encloses(Dest.getScopeDepth())) // works for invalid
-    return true;
-
-  // Otherwise, we might need some cleanups.
-  return false;
-}
-
-
 /// Terminate the current block by emitting a branch which might leave
 /// the current cleanup-protected scope.  The target scope may not yet
 /// be known, in which case this will require a fixup.

Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=199302&r1=199301&r2=199302&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGStmt.cpp Wed Jan 15 01:30:30 2014
@@ -1075,30 +1075,6 @@ void CodeGenFunction::EmitCaseStmt(const
   llvm::ConstantInt *CaseVal =
     Builder.getInt(S.getLHS()->EvaluateKnownConstInt(getContext()));
 
-  // If the body of the case is just a 'break', try to not emit an empty block.
-  // If we're profiling or we're not optimizing, leave the block in for better
-  // debug and coverage analysis.
-  if (!CGM.getCodeGenOpts().ProfileInstrGenerate &&
-      CGM.getCodeGenOpts().OptimizationLevel > 0 &&
-      isa<BreakStmt>(S.getSubStmt())) {
-    JumpDest Block = BreakContinueStack.back().BreakBlock;
-
-    // Only do this optimization if there are no cleanups that need emitting.
-    if (isObviouslyBranchWithoutCleanups(Block)) {
-      if (SwitchWeights)
-        SwitchWeights->push_back(CaseCnt.getCount() - CaseCnt.getParentCount());
-      SwitchInsn->addCase(CaseVal, Block.getBlock());
-
-      // If there was a fallthrough into this case, make sure to redirect it to
-      // the end of the switch as well.
-      if (Builder.GetInsertBlock()) {
-        Builder.CreateBr(Block.getBlock());
-        Builder.ClearInsertionPoint();
-      }
-      return;
-    }
-  }
-
   EmitBlock(createBasicBlock("sw.bb"));
   llvm::BasicBlock *CaseDest = Builder.GetInsertBlock();
   if (SwitchWeights)

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=199302&r1=199301&r2=199302&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Jan 15 01:30:30 2014
@@ -581,11 +581,6 @@ public:
   /// on to \arg Dest.
   void EmitBranchThroughCleanup(JumpDest Dest);
   
-  /// isObviouslyBranchWithoutCleanups - Return true if a branch to the
-  /// specified destination obviously has no cleanups to run.  'false' is always
-  /// a conservatively correct answer for this method.
-  bool isObviouslyBranchWithoutCleanups(JumpDest Dest) const;
-
   /// popCatchScope - Pops the catch scope at the top of the EHScope
   /// stack, emitting any required code (other than the catch handlers
   /// themselves).





More information about the cfe-commits mailing list