comparison gen/toir.cpp @ 887:7f6eeb7b003e

Fix #163.
author Christian Kamm <kamm incasoftware de>
date Sat, 17 Jan 2009 14:53:32 +0100
parents af7a6faf9406
children 29c0d1194033
comparison
equal deleted inserted replaced
886:7ddd03a2ce02 887:7f6eeb7b003e
2097 LOG_SCOPE; 2097 LOG_SCOPE;
2098 2098
2099 Type* dtype = type->toBasetype(); 2099 Type* dtype = type->toBasetype();
2100 const LLType* resty = DtoType(dtype); 2100 const LLType* resty = DtoType(dtype);
2101 2101
2102 // allocate a temporary for the final result. failed to come up with a better way :/ 2102 DValue* dvv;
2103 LLValue* resval = DtoAlloca(resty,"condtmp"); 2103 // voids returns will need no storage
2104 DVarValue* dvv = new DVarValue(type, resval); 2104 if (dtype->ty != Tvoid) {
2105 // allocate a temporary for the final result. failed to come up with a better way :/
2106 LLValue* resval = DtoAlloca(resty,"condtmp");
2107 dvv = new DVarValue(type, resval);
2108 } else {
2109 dvv = new DConstValue(type, getNullValue(DtoTypeNotVoid(dtype)));
2110 }
2105 2111
2106 llvm::BasicBlock* oldend = p->scopeend(); 2112 llvm::BasicBlock* oldend = p->scopeend();
2107 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create("condtrue", gIR->topfunc(), oldend); 2113 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create("condtrue", gIR->topfunc(), oldend);
2108 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create("condfalse", gIR->topfunc(), oldend); 2114 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create("condfalse", gIR->topfunc(), oldend);
2109 llvm::BasicBlock* condend = llvm::BasicBlock::Create("condend", gIR->topfunc(), oldend); 2115 llvm::BasicBlock* condend = llvm::BasicBlock::Create("condend", gIR->topfunc(), oldend);
2112 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal(); 2118 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal();
2113 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb()); 2119 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb());
2114 2120
2115 p->scope() = IRScope(condtrue, condfalse); 2121 p->scope() = IRScope(condtrue, condfalse);
2116 DValue* u = e1->toElem(p); 2122 DValue* u = e1->toElem(p);
2117 DtoAssign(loc, dvv, u); 2123 if (dtype->ty != Tvoid)
2124 DtoAssign(loc, dvv, u);
2118 llvm::BranchInst::Create(condend,p->scopebb()); 2125 llvm::BranchInst::Create(condend,p->scopebb());
2119 2126
2120 p->scope() = IRScope(condfalse, condend); 2127 p->scope() = IRScope(condfalse, condend);
2121 DValue* v = e2->toElem(p); 2128 DValue* v = e2->toElem(p);
2122 DtoAssign(loc, dvv, v); 2129 if (dtype->ty != Tvoid)
2130 DtoAssign(loc, dvv, v);
2123 llvm::BranchInst::Create(condend,p->scopebb()); 2131 llvm::BranchInst::Create(condend,p->scopebb());
2124 2132
2125 p->scope() = IRScope(condend, oldend); 2133 p->scope() = IRScope(condend, oldend);
2126 return dvv; 2134 return dvv;
2127 } 2135 }