# HG changeset patch # User lindquist # Date 1210029782 -7200 # Node ID adca7f32fb6d90e0ce3742f5832f122cb830e9fe # Parent a2c4dc388d5e9b445f2f09aecb951dd1142b778b [svn r183] Fixed broken identity expressions with two pointers of different types. Fixed broken pointer arithmetic for subtraction (tango.text.Util unittest now passes) diff -r a2c4dc388d5e -r adca7f32fb6d gen/toir.cpp --- a/gen/toir.cpp Tue May 06 00:03:55 2008 +0200 +++ b/gen/toir.cpp Tue May 06 01:23:02 2008 +0200 @@ -664,20 +664,25 @@ DValue* r = e2->toElem(p); Type* t = DtoDType(type); - - if (DtoDType(e1->type)->ty == Tpointer) { + Type* t1 = DtoDType(e1->type); + Type* t2 = DtoDType(e2->type); + + if (t1->ty == Tpointer && t2->ty == Tpointer) { llvm::Value* lv = l->getRVal(); llvm::Value* rv = r->getRVal(); Logger::cout() << "lv: " << *lv << " rv: " << *rv << '\n'; - if (isaPointer(lv)) - lv = p->ir->CreatePtrToInt(lv, DtoSize_t(), "tmp"); - if (isaPointer(rv)) - rv = p->ir->CreatePtrToInt(rv, DtoSize_t(), "tmp"); + lv = p->ir->CreatePtrToInt(lv, DtoSize_t(), "tmp"); + rv = p->ir->CreatePtrToInt(rv, DtoSize_t(), "tmp"); llvm::Value* diff = p->ir->CreateSub(lv,rv,"tmp"); if (diff->getType() != DtoType(type)) - diff = p->ir->CreateIntToPtr(diff, DtoType(type)); + diff = p->ir->CreateIntToPtr(diff, DtoType(type), "tmp"); return new DImValue(type, diff); } + else if (t1->ty == Tpointer) { + llvm::Value* idx = p->ir->CreateNeg(r->getRVal(), "tmp"); + llvm::Value* v = new llvm::GetElementPtrInst(l->getRVal(), idx, "tmp", p->scopebb()); + return new DImValue(type, v); + } else if (t->iscomplex()) { return DtoComplexSub(type, l, r); } @@ -2308,11 +2313,19 @@ llvm::FCmpInst::Predicate pred = (op == TOKidentity) ? llvm::FCmpInst::FCMP_OEQ : llvm::FCmpInst::FCMP_ONE; eval = new llvm::FCmpInst(pred, l, r, "tmp", p->scopebb()); } + else if (t1->ty == Tpointer) + { + if (l->getType() != r->getType()) { + if (v->isNull()) + r = llvm::ConstantPointerNull::get(isaPointer(l->getType())); + else + r = DtoBitCast(r, l->getType(), "tmp"); + } + llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; + eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); + } else { llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; - if (t1->ty == Tpointer && v->isNull() && l->getType() != r->getType()) { - r = llvm::ConstantPointerNull::get(isaPointer(l->getType())); - } //Logger::cout() << "l = " << *l << " r = " << *r << '\n'; eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); }