Mercurial > projects > ldc
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 } |