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);