On Feb 7, 2009, at 10:08 AM, Mike Stump wrote: > Author: mrs > Date: Sat Feb 7 12:08:12 2009 > New Revision: 64021 > > URL: http://llvm.org/viewvc/llvm-project?rev=64021&view=rev > Log: > Arrange to have the correct StackDepth for while statements.
Testcase? -Chris > > > Modified: > cfe/trunk/lib/CodeGen/CGStmt.cpp > cfe/trunk/lib/CodeGen/CodeGenFunction.h > > Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=64021&r1=64020&r2=64021&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Sat Feb 7 12:08:12 2009 > @@ -357,6 +357,14 @@ > // it. > llvm::BasicBlock *LoopHeader = createBasicBlock("while.cond"); > EmitBlock(LoopHeader); > + > + // Create an exit block for when the condition fails, create a > block for the > + // body of the loop. > + llvm::BasicBlock *ExitBlock = createBasicBlock("while.end"); > + llvm::BasicBlock *LoopBody = createBasicBlock("while.body"); > + > + // Store the blocks to use for break and continue. > + BreakContinuePush(ExitBlock, LoopHeader); > > // Evaluate the conditional in the while header. C99 6.8.5.1: The > // evaluation of the controlling expression takes place before each > @@ -370,18 +378,10 @@ > if (C->isOne()) > EmitBoolCondBranch = false; > > - // Create an exit block for when the condition fails, create a > block for the > - // body of the loop. > - llvm::BasicBlock *ExitBlock = createBasicBlock("while.end"); > - llvm::BasicBlock *LoopBody = createBasicBlock("while.body"); > - > // As long as the condition is true, go to the loop body. > if (EmitBoolCondBranch) > Builder.CreateCondBr(BoolCondVal, LoopBody, ExitBlock); > > - // Store the blocks to use for break and continue. > - BreakContinuePush(ExitBlock, LoopHeader); > - > // Emit the loop body. > EmitBlock(LoopBody); > EmitStmt(S.getBody()); > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=64021&r1=64020&r2=64021&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sat Feb 7 12:08:12 2009 > @@ -151,7 +151,10 @@ > /// LabelMap - This keeps track of the LLVM basic block for each C > label. > llvm::DenseMap<const LabelStmt*, llvm::BasicBlock*> LabelMap; > > - /// BreakContinuePush - Note a new break and continue level. > + /// BreakContinuePush - Note a new break and continue level. This > + /// must be called at the stack depth of the continue block. In > + /// particular, this must not be called after the controlling > + /// condition has possibly started a vla. > void BreakContinuePush(llvm::BasicBlock *bb, llvm::BasicBlock *cb) { > BreakContinueStack.push_back(BreakContinue(bb, cb, StackDepth, > ObjCEHStack.size())); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
