comparison gen/toir.cpp @ 167:adca7f32fb6d trunk

[svn r183] Fixed broken identity expressions with two pointers of different types. Fixed broken pointer arithmetic for subtraction (tango.text.Util unittest now passes)
author lindquist
date Tue, 06 May 2008 01:23:02 +0200
parents a64becf2a702
children 2df270e1ba59
comparison
equal deleted inserted replaced
166:a2c4dc388d5e 167:adca7f32fb6d
662 662
663 DValue* l = e1->toElem(p); 663 DValue* l = e1->toElem(p);
664 DValue* r = e2->toElem(p); 664 DValue* r = e2->toElem(p);
665 665
666 Type* t = DtoDType(type); 666 Type* t = DtoDType(type);
667 667 Type* t1 = DtoDType(e1->type);
668 if (DtoDType(e1->type)->ty == Tpointer) { 668 Type* t2 = DtoDType(e2->type);
669
670 if (t1->ty == Tpointer && t2->ty == Tpointer) {
669 llvm::Value* lv = l->getRVal(); 671 llvm::Value* lv = l->getRVal();
670 llvm::Value* rv = r->getRVal(); 672 llvm::Value* rv = r->getRVal();
671 Logger::cout() << "lv: " << *lv << " rv: " << *rv << '\n'; 673 Logger::cout() << "lv: " << *lv << " rv: " << *rv << '\n';
672 if (isaPointer(lv)) 674 lv = p->ir->CreatePtrToInt(lv, DtoSize_t(), "tmp");
673 lv = p->ir->CreatePtrToInt(lv, DtoSize_t(), "tmp"); 675 rv = p->ir->CreatePtrToInt(rv, DtoSize_t(), "tmp");
674 if (isaPointer(rv))
675 rv = p->ir->CreatePtrToInt(rv, DtoSize_t(), "tmp");
676 llvm::Value* diff = p->ir->CreateSub(lv,rv,"tmp"); 676 llvm::Value* diff = p->ir->CreateSub(lv,rv,"tmp");
677 if (diff->getType() != DtoType(type)) 677 if (diff->getType() != DtoType(type))
678 diff = p->ir->CreateIntToPtr(diff, DtoType(type)); 678 diff = p->ir->CreateIntToPtr(diff, DtoType(type), "tmp");
679 return new DImValue(type, diff); 679 return new DImValue(type, diff);
680 }
681 else if (t1->ty == Tpointer) {
682 llvm::Value* idx = p->ir->CreateNeg(r->getRVal(), "tmp");
683 llvm::Value* v = new llvm::GetElementPtrInst(l->getRVal(), idx, "tmp", p->scopebb());
684 return new DImValue(type, v);
680 } 685 }
681 else if (t->iscomplex()) { 686 else if (t->iscomplex()) {
682 return DtoComplexSub(type, l, r); 687 return DtoComplexSub(type, l, r);
683 } 688 }
684 else { 689 else {
2306 else if (t1->isfloating()) 2311 else if (t1->isfloating())
2307 { 2312 {
2308 llvm::FCmpInst::Predicate pred = (op == TOKidentity) ? llvm::FCmpInst::FCMP_OEQ : llvm::FCmpInst::FCMP_ONE; 2313 llvm::FCmpInst::Predicate pred = (op == TOKidentity) ? llvm::FCmpInst::FCMP_OEQ : llvm::FCmpInst::FCMP_ONE;
2309 eval = new llvm::FCmpInst(pred, l, r, "tmp", p->scopebb()); 2314 eval = new llvm::FCmpInst(pred, l, r, "tmp", p->scopebb());
2310 } 2315 }
2316 else if (t1->ty == Tpointer)
2317 {
2318 if (l->getType() != r->getType()) {
2319 if (v->isNull())
2320 r = llvm::ConstantPointerNull::get(isaPointer(l->getType()));
2321 else
2322 r = DtoBitCast(r, l->getType(), "tmp");
2323 }
2324 llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
2325 eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb());
2326 }
2311 else { 2327 else {
2312 llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; 2328 llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
2313 if (t1->ty == Tpointer && v->isNull() && l->getType() != r->getType()) {
2314 r = llvm::ConstantPointerNull::get(isaPointer(l->getType()));
2315 }
2316 //Logger::cout() << "l = " << *l << " r = " << *r << '\n'; 2329 //Logger::cout() << "l = " << *l << " r = " << *r << '\n';
2317 eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); 2330 eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb());
2318 } 2331 }
2319 return new DImValue(type, eval); 2332 return new DImValue(type, eval);
2320 } 2333 }