comparison gen/statements.cpp @ 308:6b62e8cdf970 trunk

[svn r329] Cleaned up a bunch of array code for handling special slice cases no longer relevant.
author lindquist
date Sat, 28 Jun 2008 05:57:16 +0200
parents 2b72433d5c8c
children d59c363fccad
comparison
equal deleted inserted replaced
307:7ade5e035beb 308:6b62e8cdf970
910 // what to iterate 910 // what to iterate
911 DValue* aggrval = aggr->toElem(p); 911 DValue* aggrval = aggr->toElem(p);
912 Type* aggrtype = DtoDType(aggr->type); 912 Type* aggrtype = DtoDType(aggr->type);
913 913
914 // get length and pointer 914 // get length and pointer
915 LLValue* val = 0; 915 LLValue* niters = DtoArrayLen(aggrval);
916 LLValue* niters = 0; 916 LLValue* val = DtoArrayPtr(aggrval);
917
918 // static array
919 if (aggrtype->ty == Tsarray)
920 {
921 Logger::println("foreach over static array");
922 val = aggrval->getRVal();
923 assert(isaPointer(val->getType()));
924 const llvm::ArrayType* arrty = isaArray(val->getType()->getContainedType(0));
925 assert(arrty);
926 size_t nelems = arrty->getNumElements();
927 if(nelems == 0)
928 return;
929 niters = llvm::ConstantInt::get(keytype,nelems,false);
930 }
931 // dynamic array
932 else if (aggrtype->ty == Tarray)
933 {
934 if (DSliceValue* slice = aggrval->isSlice()) {
935 Logger::println("foreach over slice");
936 niters = slice->len;
937 assert(niters);
938 val = slice->ptr;
939 assert(val);
940 }
941 else {
942 Logger::println("foreach over dynamic array");
943 val = aggrval->getRVal();
944 niters = DtoGEPi(val,0,0);
945 niters = DtoLoad(niters, "numiterations");
946 val = DtoGEPi(val,0,1);
947 val = DtoLoad(val, "collection");
948 }
949 }
950 else
951 {
952 assert(0 && "aggregate type is not Tarray or Tsarray");
953 }
954 917
955 if (niters->getType() != keytype) 918 if (niters->getType() != keytype)
956 { 919 {
957 size_t sz1 = getTypeBitSize(niters->getType()); 920 size_t sz1 = getTypeBitSize(niters->getType());
958 size_t sz2 = getTypeBitSize(keytype); 921 size_t sz2 = getTypeBitSize(keytype);
999 p->scope() = IRScope(bodybb,nextbb); 962 p->scope() = IRScope(bodybb,nextbb);
1000 963
1001 // get value for this iteration 964 // get value for this iteration
1002 LLConstant* zero = llvm::ConstantInt::get(keytype,0,false); 965 LLConstant* zero = llvm::ConstantInt::get(keytype,0,false);
1003 LLValue* loadedKey = p->ir->CreateLoad(keyvar,"tmp"); 966 LLValue* loadedKey = p->ir->CreateLoad(keyvar,"tmp");
1004 if (aggrtype->ty == Tsarray) 967 value->ir.irLocal->value = DtoGEP1(val,loadedKey);
1005 value->ir.irLocal->value = DtoGEP(val,zero,loadedKey,"tmp");
1006 else if (aggrtype->ty == Tarray)
1007 value->ir.irLocal->value = llvm::GetElementPtrInst::Create(val,loadedKey,"tmp",p->scopebb());
1008 968
1009 if (!value->isRef() && !value->isOut()) { 969 if (!value->isRef() && !value->isOut()) {
1010 DValue* dst = new DVarValue(value->type, valvar, true); 970 DValue* dst = new DVarValue(value->type, valvar, true);
1011 DValue* src = new DVarValue(value->type, value->ir.irLocal->value, true); 971 DValue* src = new DVarValue(value->type, value->ir.irLocal->value, true);
1012 DtoAssign(dst, src); 972 DtoAssign(dst, src);