comparison 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
comparison
equal deleted inserted replaced
68:c4b3f5d2cd9b 69:2b5a2eaa88be
407 407
408 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); 408 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
409 } 409 }
410 410
411 ////////////////////////////////////////////////////////////////////////////////////////// 411 //////////////////////////////////////////////////////////////////////////////////////////
412 llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr) 412 llvm::Constant* LLVM_DtoConstSlice(llvm::Constant* dim, llvm::Constant* ptr)
413 { 413 {
414 std::vector<const llvm::Type*> types; 414 std::vector<const llvm::Type*> types;
415 types.push_back(dim->getType()); 415 types.push_back(dim->getType());
416 types.push_back(ptr->getType()); 416 types.push_back(ptr->getType());
417 const llvm::StructType* type = llvm::StructType::get(types); 417 const llvm::StructType* type = llvm::StructType::get(types);
620 } 620 }
621 621
622 ////////////////////////////////////////////////////////////////////////////////////////// 622 //////////////////////////////////////////////////////////////////////////////////////////
623 llvm::Value* LLVM_DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r) 623 llvm::Value* LLVM_DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r)
624 { 624 {
625 assert(l->getType() == r->getType());
626
627 llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; 625 llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE;
628 626
629 llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp"); 627 if (r == NULL) {
630 llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp"); 628 llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
631 llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp"); 629 llvm::Value* rl = LLVM_DtoConstSize_t(0);
632 630 llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
633 llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp"); 631
634 llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp"); 632 llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
635 llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp"); 633 const llvm::PointerType* pty = llvm::cast<llvm::PointerType>(lp->getType());
636 634 llvm::Value* rp = llvm::ConstantPointerNull::get(pty);
637 llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp"); 635 llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
638 return b; 636
639 } 637 llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
640 638 return b;
641 ////////////////////////////////////////////////////////////////////////////////////////// 639 }
642 llvm::Constant* LLVM_DtoConstantStaticArray(const llvm::Type* t, llvm::Constant* c) 640 else {
641 assert(l->getType() == r->getType());
642
643 llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
644 llvm::Value* rl = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
645 llvm::Value* b1 = gIR->ir->CreateICmp(pred,ll,rl,"tmp");
646
647 llvm::Value* lp = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
648 llvm::Value* rp = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
649 llvm::Value* b2 = gIR->ir->CreateICmp(pred,lp,rp,"tmp");
650
651 llvm::Value* b = gIR->ir->CreateAnd(b1,b2,"tmp");
652 return b;
653 }
654 }
655
656 //////////////////////////////////////////////////////////////////////////////////////////
657 llvm::Constant* LLVM_DtoConstStaticArray(const llvm::Type* t, llvm::Constant* c)
643 { 658 {
644 assert(llvm::isa<llvm::ArrayType>(t)); 659 assert(llvm::isa<llvm::ArrayType>(t));
645 const llvm::ArrayType* at = llvm::cast<llvm::ArrayType>(t); 660 const llvm::ArrayType* at = llvm::cast<llvm::ArrayType>(t);
646 661
647 if (llvm::isa<llvm::ArrayType>(at->getElementType())) 662 if (llvm::isa<llvm::ArrayType>(at->getElementType()))
648 { 663 {
649 c = LLVM_DtoConstantStaticArray(at->getElementType(), c); 664 c = LLVM_DtoConstStaticArray(at->getElementType(), c);
650 } 665 }
651 else { 666 else {
652 assert(at->getElementType() == c->getType()); 667 assert(at->getElementType() == c->getType());
653 } 668 }
654 std::vector<llvm::Constant*> initvals; 669 std::vector<llvm::Constant*> initvals;