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