diff gen/arrays.c @ 69:2b5a2eaa88be trunk

[svn r73] Identity expression for dynamic array and null was broken.
author lindquist
date Sun, 28 Oct 2007 04:23:38 +0100
parents b688ad419f8c
children 3587401b6eeb
line wrap: on
line diff
--- a/gen/arrays.c	Sun Oct 28 03:14:29 2007 +0100
+++ b/gen/arrays.c	Sun Oct 28 04:23:38 2007 +0100
@@ -409,7 +409,7 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr)
+llvm::Constant* LLVM_DtoConstSlice(llvm::Constant* dim, llvm::Constant* ptr)
 {
     std::vector<const llvm::Type*> types;
     types.push_back(dim->getType());
@@ -622,31 +622,46 @@
 //////////////////////////////////////////////////////////////////////////////////////////
 llvm::Value* LLVM_DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r)
 {
-    assert(l->getType() == r->getType());
-
     llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
 
-    llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
-    llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
-    llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+    if (r == NULL) {
+        llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
+        llvm::Value* rl = LLVM_DtoConstSize_t(0);
+        llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+
+        llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
+        const llvm::PointerType* pty = llvm::cast<llvm::PointerType>(lp->getType());
+        llvm::Value* rp = llvm::ConstantPointerNull::get(pty);
+        llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
 
-    llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
-    llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
-    llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
+        llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
+        return b;
+    }
+    else {
+        assert(l->getType() == r->getType());
 
-    llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
-    return b;
+        llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
+        llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
+        llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
+
+        llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
+        llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
+        llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
+
+        llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
+        return b;
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-llvm::Constant* LLVM_DtoConstantStaticArray(const llvm::Type* t, llvm::Constant* c)
+llvm::Constant* LLVM_DtoConstStaticArray(const llvm::Type* t, llvm::Constant* c)
 {
     assert(llvm::isa<llvm::ArrayType>(t));
     const llvm::ArrayType* at = llvm::cast<llvm::ArrayType>(t);
 
     if (llvm::isa<llvm::ArrayType>(at->getElementType()))
     {
-        c = LLVM_DtoConstantStaticArray(at->getElementType(), c);
+        c = LLVM_DtoConstStaticArray(at->getElementType(), c);
     }
     else {
         assert(at->getElementType() == c->getType());