Mercurial > projects > ldc
diff gen/statements.c @ 51:61bc1b4ad3c4 trunk
[svn r55] Foreach was always generating code as if the value variable was 'ref'
Other not-so-major improvements
author | lindquist |
---|---|
date | Mon, 22 Oct 2007 17:25:44 +0200 |
parents | ff359b65fa62 |
children | 28e99b04a132 |
line wrap: on
line diff
--- a/gen/statements.c Mon Oct 22 15:40:56 2007 +0200 +++ b/gen/statements.c Mon Oct 22 17:25:44 2007 +0200 @@ -69,9 +69,8 @@ if (expty == Tstruct) { if (!e->inplace) { - TypeStruct* ts = (TypeStruct*)exptype; assert(e->mem); - LLVM_DtoStructCopy(ts,f->llvmRetArg,e->mem); + LLVM_DtoStructCopy(f->llvmRetArg,e->mem); } } else if (expty == Tdelegate) { @@ -649,7 +648,7 @@ if (key) key->llvmValue = keyvar; const llvm::Type* valtype = LLVM_DtoType(value->type); - llvm::Value* valvar = new llvm::AllocaInst(keytype, "foreachval", p->topallocapoint()); + llvm::Value* valvar = !value->isRef() ? new llvm::AllocaInst(valtype, "foreachval", p->topallocapoint()) : NULL; Type* aggrtype = LLVM_DtoDType(aggr->type); if (aggrtype->ty == Tsarray) @@ -708,10 +707,20 @@ // get value for this iteration llvm::Constant* zero = llvm::ConstantInt::get(keytype,0,false); + llvm::Value* loadedKey = p->ir->CreateLoad(keyvar,"tmp"); if (aggrtype->ty == Tsarray) - value->llvmValue = LLVM_DtoGEP(val,zero,new llvm::LoadInst(keyvar,"tmp",p->scopebb()),"tmp",p->scopebb()); + value->llvmValue = LLVM_DtoGEP(val,zero,loadedKey,"tmp"); else if (aggrtype->ty == Tarray) - value->llvmValue = new llvm::GetElementPtrInst(val,new llvm::LoadInst(keyvar,"tmp",p->scopebb()),"tmp",p->scopebb()); + value->llvmValue = new llvm::GetElementPtrInst(val,loadedKey,"tmp",p->scopebb()); + + if (!value->isRef()) { + elem* e = new elem; + e->mem = value->llvmValue; + e->type = elem::VAR; + LLVM_DtoAssign(LLVM_DtoDType(value->type), valvar, e->getValue()); + delete e; + value->llvmValue = valvar; + } // body p->scope() = IRScope(p->scopebb(),endbb);