changeset 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 a2c4dc388d5e
children 08cfde5f70d3
files gen/toir.cpp
diffstat 1 files changed, 23 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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());
     }