comparison gen/statements.c @ 78:2332006e1fa4 trunk

[svn r82] Fixed: Fall-through switch cases were broken.
author lindquist
date Wed, 31 Oct 2007 20:50:21 +0100
parents b706170e24a9
children 875617f89c51
comparison
equal deleted inserted replaced
77:714057ff2dbb 78:2332006e1fa4
253 LOG_SCOPE; 253 LOG_SCOPE;
254 254
255 // create while blocks 255 // create while blocks
256 llvm::BasicBlock* oldend = gIR->scopeend(); 256 llvm::BasicBlock* oldend = gIR->scopeend();
257 llvm::BasicBlock* whilebb = new llvm::BasicBlock("whilecond", gIR->topfunc(), oldend); 257 llvm::BasicBlock* whilebb = new llvm::BasicBlock("whilecond", gIR->topfunc(), oldend);
258 llvm::BasicBlock* whilebodybb = new llvm::BasicBlock("whilebody", gIR->topfunc(), oldend);
258 llvm::BasicBlock* endbb = new llvm::BasicBlock("endwhile", gIR->topfunc(), oldend); 259 llvm::BasicBlock* endbb = new llvm::BasicBlock("endwhile", gIR->topfunc(), oldend);
259 260
260 // move into the while block 261 // move into the while block
261 p->ir->CreateBr(whilebb); 262 p->ir->CreateBr(whilebb);
262 //new llvm::BranchInst(whilebb, gIR->scopebegin()); 263 //new llvm::BranchInst(whilebb, gIR->scopebegin());
267 // create the condition 268 // create the condition
268 elem* cond_e = condition->toElem(p); 269 elem* cond_e = condition->toElem(p);
269 llvm::Value* cond_val = LLVM_DtoBoolean(cond_e->getValue()); 270 llvm::Value* cond_val = LLVM_DtoBoolean(cond_e->getValue());
270 delete cond_e; 271 delete cond_e;
271 272
272 // while body block
273 llvm::BasicBlock* whilebodybb = new llvm::BasicBlock("whilebody", gIR->topfunc(), endbb);
274
275 // conditional branch 273 // conditional branch
276 llvm::Value* ifbreak = new llvm::BranchInst(whilebodybb, endbb, cond_val, whilebb); 274 llvm::Value* ifbreak = new llvm::BranchInst(whilebodybb, endbb, cond_val, p->scopebb());
277 275
278 // rewrite scope 276 // rewrite scope
279 gIR->scope() = IRScope(whilebodybb,endbb); 277 gIR->scope() = IRScope(whilebodybb,endbb);
280 278
281 // do while body code 279 // do while body code
578 p->loopbbs.push_back(IRScope(p->scopebb(),endbb)); 576 p->loopbbs.push_back(IRScope(p->scopebb(),endbb));
579 static_cast<CaseStatement*>(cases->data[i])->statement->toIR(p); 577 static_cast<CaseStatement*>(cases->data[i])->statement->toIR(p);
580 p->loopbbs.pop_back(); 578 p->loopbbs.pop_back();
581 579
582 llvm::BasicBlock* curbb = p->scopebb(); 580 llvm::BasicBlock* curbb = p->scopebb();
583 if (!curbb->empty() && !curbb->back().isTerminator()) 581 if (curbb->empty() || !curbb->back().isTerminator())
584 { 582 {
585 new llvm::BranchInst(nextbb, curbb); 583 new llvm::BranchInst(nextbb, curbb);
586 } 584 }
587 } 585 }
588 586
589 // default statement 587 // default statement
590 if (defbb) 588 if (defbb)
591 { 589 {
592 p->scope() = IRScope(defbb,endbb); 590 p->scope() = IRScope(defbb,endbb);
593 p->loopbbs.push_back(IRScope(defbb,endbb)); 591 p->loopbbs.push_back(IRScope(defbb,endbb));
592 Logger::println("doing default statement");
594 sdefault->statement->toIR(p); 593 sdefault->statement->toIR(p);
595 p->loopbbs.pop_back(); 594 p->loopbbs.pop_back();
596 595
597 llvm::BasicBlock* curbb = p->scopebb(); 596 llvm::BasicBlock* curbb = p->scopebb();
598 if (!curbb->empty() && !curbb->back().isTerminator()) 597 if (curbb->empty() || !curbb->back().isTerminator())
599 { 598 {
600 new llvm::BranchInst(endbb, curbb); 599 new llvm::BranchInst(endbb, curbb);
601 } 600 }
602 } 601 }
603 602