Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
50:6fcc08a4d406 | 51:61bc1b4ad3c4 |
---|---|
67 elem* e = exp->toElem(p); | 67 elem* e = exp->toElem(p); |
68 p->lvals.pop_back(); | 68 p->lvals.pop_back(); |
69 | 69 |
70 if (expty == Tstruct) { | 70 if (expty == Tstruct) { |
71 if (!e->inplace) { | 71 if (!e->inplace) { |
72 TypeStruct* ts = (TypeStruct*)exptype; | |
73 assert(e->mem); | 72 assert(e->mem); |
74 LLVM_DtoStructCopy(ts,f->llvmRetArg,e->mem); | 73 LLVM_DtoStructCopy(f->llvmRetArg,e->mem); |
75 } | 74 } |
76 } | 75 } |
77 else if (expty == Tdelegate) { | 76 else if (expty == Tdelegate) { |
78 LLVM_DtoDelegateCopy(f->llvmRetArg,e->mem); | 77 LLVM_DtoDelegateCopy(f->llvmRetArg,e->mem); |
79 } | 78 } |
647 const llvm::Type* keytype = key ? LLVM_DtoType(key->type) : LLVM_DtoSize_t(); | 646 const llvm::Type* keytype = key ? LLVM_DtoType(key->type) : LLVM_DtoSize_t(); |
648 llvm::Value* keyvar = new llvm::AllocaInst(keytype, "foreachkey", p->topallocapoint()); | 647 llvm::Value* keyvar = new llvm::AllocaInst(keytype, "foreachkey", p->topallocapoint()); |
649 if (key) key->llvmValue = keyvar; | 648 if (key) key->llvmValue = keyvar; |
650 | 649 |
651 const llvm::Type* valtype = LLVM_DtoType(value->type); | 650 const llvm::Type* valtype = LLVM_DtoType(value->type); |
652 llvm::Value* valvar = new llvm::AllocaInst(keytype, "foreachval", p->topallocapoint()); | 651 llvm::Value* valvar = !value->isRef() ? new llvm::AllocaInst(valtype, "foreachval", p->topallocapoint()) : NULL; |
653 | 652 |
654 Type* aggrtype = LLVM_DtoDType(aggr->type); | 653 Type* aggrtype = LLVM_DtoDType(aggr->type); |
655 if (aggrtype->ty == Tsarray) | 654 if (aggrtype->ty == Tsarray) |
656 { | 655 { |
657 assert(llvm::isa<llvm::PointerType>(val->getType())); | 656 assert(llvm::isa<llvm::PointerType>(val->getType())); |
706 // begin | 705 // begin |
707 p->scope() = IRScope(begbb,nexbb); | 706 p->scope() = IRScope(begbb,nexbb); |
708 | 707 |
709 // get value for this iteration | 708 // get value for this iteration |
710 llvm::Constant* zero = llvm::ConstantInt::get(keytype,0,false); | 709 llvm::Constant* zero = llvm::ConstantInt::get(keytype,0,false); |
710 llvm::Value* loadedKey = p->ir->CreateLoad(keyvar,"tmp"); | |
711 if (aggrtype->ty == Tsarray) | 711 if (aggrtype->ty == Tsarray) |
712 value->llvmValue = LLVM_DtoGEP(val,zero,new llvm::LoadInst(keyvar,"tmp",p->scopebb()),"tmp",p->scopebb()); | 712 value->llvmValue = LLVM_DtoGEP(val,zero,loadedKey,"tmp"); |
713 else if (aggrtype->ty == Tarray) | 713 else if (aggrtype->ty == Tarray) |
714 value->llvmValue = new llvm::GetElementPtrInst(val,new llvm::LoadInst(keyvar,"tmp",p->scopebb()),"tmp",p->scopebb()); | 714 value->llvmValue = new llvm::GetElementPtrInst(val,loadedKey,"tmp",p->scopebb()); |
715 | |
716 if (!value->isRef()) { | |
717 elem* e = new elem; | |
718 e->mem = value->llvmValue; | |
719 e->type = elem::VAR; | |
720 LLVM_DtoAssign(LLVM_DtoDType(value->type), valvar, e->getValue()); | |
721 delete e; | |
722 value->llvmValue = valvar; | |
723 } | |
715 | 724 |
716 // body | 725 // body |
717 p->scope() = IRScope(p->scopebb(),endbb); | 726 p->scope() = IRScope(p->scopebb(),endbb); |
718 p->loopbbs.push_back(IRScope(nexbb,endbb)); | 727 p->loopbbs.push_back(IRScope(nexbb,endbb)); |
719 body->toIR(p); | 728 body->toIR(p); |