Mercurial > projects > ldc
changeset 365:bfb9d28f045a trunk
[svn r386] Fixed broken DtoBoolean.
Some code cleanup.
author | lindquist |
---|---|
date | Tue, 15 Jul 2008 00:17:03 +0200 |
parents | 8014dbd24605 |
children | 1d3026702f65 |
files | gen/arrays.cpp gen/llvmhelpers.cpp gen/llvmhelpers.h gen/statements.cpp gen/toir.cpp gen/tollvm.cpp gen/tollvm.h |
diffstat | 7 files changed, 81 insertions(+), 58 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/arrays.cpp Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/arrays.cpp Tue Jul 15 00:17:03 2008 +0200 @@ -758,7 +758,7 @@ LLValue* DtoArrayEquals(TOK op, DValue* l, DValue* r) { LLValue* res = DtoArrayEqCmp_impl("_adEq", l, r, true); - res = new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, res, DtoConstInt(0), "tmp", gIR->scopebb()); + res = gIR->ir->CreateICmpNE(res, DtoConstInt(0), "tmp"); if (op == TOKnotequal) res = gIR->ir->CreateNot(res, "tmp"); @@ -817,7 +817,7 @@ res = DtoArrayEqCmp_impl("_adCmpChar", l, r, false); else res = DtoArrayEqCmp_impl("_adCmp", l, r, true); - res = new llvm::ICmpInst(cmpop, res, DtoConstInt(0), "tmp", gIR->scopebb()); + res = gIR->ir->CreateICmp(cmpop, res, DtoConstInt(0), "tmp"); } assert(res); @@ -859,12 +859,12 @@ // compare lengths len1 = DtoArrayLen(l); len2 = DtoArrayLen(r); - LLValue* b1 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,len1,len2,"tmp"); + LLValue* b1 = gIR->ir->CreateICmpEQ(len1,len2,"tmp"); // compare pointers ptr1 = DtoArrayPtr(l); ptr2 = DtoArrayPtr(r); - LLValue* b2 = gIR->ir->CreateICmp(llvm::ICmpInst::ICMP_EQ,ptr1,ptr2,"tmp"); + LLValue* b2 = gIR->ir->CreateICmpEQ(ptr1,ptr2,"tmp"); // combine LLValue* res = gIR->ir->CreateAnd(b1,b2,"tmp");
--- a/gen/llvmhelpers.cpp Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/llvmhelpers.cpp Tue Jul 15 00:17:03 2008 +0200 @@ -4,6 +4,7 @@ #include "mars.h" #include "init.h" #include "id.h" +#include "expression.h" #include "gen/tollvm.h" #include "gen/llvmhelpers.h" @@ -1312,3 +1313,58 @@ global.params.llvmArch = const_cast<char*>(e->Name); } } + +////////////////////////////////////////////////////////////////////////////////////////// + +LLValue* DtoBoolean(DValue* dval) +{ + Type* dtype = dval->getType()->toBasetype(); + TY ty = dtype->ty; + + // integer + if (dtype->isintegral()) + { + LLValue* val = dval->getRVal(); + if (val->getType() == LLType::Int1Ty) + return val; + else { + LLValue* zero = LLConstantInt::get(val->getType(), 0, false); + return gIR->ir->CreateICmpNE(val, zero, "tmp"); + } + } + // complex + else if (dtype->iscomplex()) + { + // huh? + return DtoComplexEquals(TOKnotequal, dval, DtoComplex(dtype, new DNullValue(Type::tint8, llvm::ConstantInt::get(LLType::Int8Ty, 0)))); + } + // floating point + else if (dtype->isfloating()) + { + LLValue* val = dval->getRVal(); + LLValue* zero = LLConstant::getNullValue(val->getType()); + return gIR->ir->CreateFCmpONE(val, zero, "tmp"); + } + // pointer/class + else if (ty == Tpointer || ty == Tclass) { + LLValue* val = dval->getRVal(); + LLValue* zero = LLConstant::getNullValue(val->getType()); + return gIR->ir->CreateICmpNE(val, zero, "tmp"); + } + // dynamic array + else if (ty == Tarray) + { + // return (arr.length != 0) + return gIR->ir->CreateICmpNE(DtoArrayLen(dval), DtoConstSize_t(0), "tmp"); + } + // delegate + else if (ty == Tdelegate) + { + // return (dg !is null) + return DtoDelegateEquals(TOKnotequal, dval->getRVal(), NULL); + } + // unknown + std::cout << "unsupported -> bool : " << dtype->toChars() << '\n'; + assert(0); + return 0; +}
--- a/gen/llvmhelpers.h Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/llvmhelpers.h Tue Jul 15 00:17:03 2008 +0200 @@ -98,4 +98,7 @@ */ DValue* DtoCallDFunc(FuncDeclaration* fdecl, Array* arguments, TypeClass* type=0, LLValue* thismem=0); +/// Converts any value to a boolean (llvm i1) +LLValue* DtoBoolean(DValue* dval); + #endif
--- a/gen/statements.cpp Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/statements.cpp Tue Jul 15 00:17:03 2008 +0200 @@ -967,12 +967,12 @@ LLValue* done = 0; LLValue* load = DtoLoad(keyvar); if (op == TOKforeach) { - done = new llvm::ICmpInst(llvm::ICmpInst::ICMP_ULT, load, niters, "tmp", p->scopebb()); + done = p->ir->CreateICmpULT(load, niters, "tmp"); } else if (op == TOKforeach_reverse) { - done = new llvm::ICmpInst(llvm::ICmpInst::ICMP_UGT, load, zerokey, "tmp", p->scopebb()); - load = llvm::BinaryOperator::createSub(load,llvm::ConstantInt::get(keytype, 1, false),"tmp",p->scopebb()); - new llvm::StoreInst(load, keyvar, p->scopebb()); + done = p->ir->CreateICmpUGT(load, zerokey, "tmp"); + load = p->ir->CreateSub(load, llvm::ConstantInt::get(keytype, 1, false), "tmp"); + DtoStore(load, keyvar); } llvm::BranchInst::Create(bodybb, endbb, done, p->scopebb());
--- a/gen/toir.cpp Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/toir.cpp Tue Jul 15 00:17:03 2008 +0200 @@ -1610,7 +1610,7 @@ LLValue* b = r->getRVal(); Logger::cout() << "type 1: " << *a << '\n'; Logger::cout() << "type 2: " << *b << '\n'; - eval = new llvm::ICmpInst(cmpop, a, b, "tmp", p->scopebb()); + eval = p->ir->CreateICmp(cmpop, a, b, "tmp"); } } else if (t->isfloating()) @@ -1646,7 +1646,7 @@ default: assert(0); } - eval = new llvm::FCmpInst(cmpop, l->getRVal(), r->getRVal(), "tmp", p->scopebb()); + eval = p->ir->CreateFCmp(cmpop, l->getRVal(), r->getRVal(), "tmp"); } else if (t->ty == Tsarray || t->ty == Tarray) { @@ -1697,7 +1697,7 @@ if (rv->getType() != lv->getType()) { rv = DtoBitCast(rv, lv->getType()); } - eval = new llvm::ICmpInst(cmpop, lv, rv, "tmp", p->scopebb()); + eval = p->ir->CreateICmp(cmpop, lv, rv, "tmp"); } else if (t->iscomplex()) { @@ -1719,7 +1719,7 @@ default: assert(0); } - eval = new llvm::FCmpInst(cmpop, l->getRVal(), r->getRVal(), "tmp", p->scopebb()); + eval = p->ir->CreateFCmp(cmpop, l->getRVal(), r->getRVal(), "tmp"); } else if (t->ty == Tsarray || t->ty == Tarray) { @@ -1996,7 +1996,7 @@ LLValue* b = DtoBoolean(u); - LLConstant* zero = llvm::ConstantInt::get(LLType::Int1Ty, 0, true); + LLConstant* zero = DtoConstBool(false); b = p->ir->CreateICmpEQ(b,zero); return new DImValue(type, b); @@ -2262,8 +2262,9 @@ } else if (t1->isfloating()) { - llvm::FCmpInst::Predicate pred = (op == TOKidentity) ? llvm::FCmpInst::FCMP_OEQ : llvm::FCmpInst::FCMP_ONE; - eval = new llvm::FCmpInst(pred, l, r, "tmp", p->scopebb()); + eval = (op == TOKidentity) + ? p->ir->CreateFCmpOEQ(l,r,"tmp") + : p->ir->CreateFCmpONE(l,r,"tmp"); } else if (t1->ty == Tpointer) { @@ -2273,13 +2274,14 @@ else r = DtoBitCast(r, l->getType()); } - llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; - eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); + eval = (op == TOKidentity) + ? p->ir->CreateICmpEQ(l,r,"tmp") + : p->ir->CreateICmpNE(l,r,"tmp"); } else { - llvm::ICmpInst::Predicate pred = (op == TOKidentity) ? llvm::ICmpInst::ICMP_EQ : llvm::ICmpInst::ICMP_NE; - //Logger::cout() << "l = " << *l << " r = " << *r << '\n'; - eval = new llvm::ICmpInst(pred, l, r, "tmp", p->scopebb()); + eval = (op == TOKidentity) + ? p->ir->CreateICmpEQ(l,r,"tmp") + : p->ir->CreateICmpNE(l,r,"tmp"); } return new DImValue(type, eval); }
--- a/gen/tollvm.cpp Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/tollvm.cpp Tue Jul 15 00:17:03 2008 +0200 @@ -326,41 +326,6 @@ ////////////////////////////////////////////////////////////////////////////////////////// -LLValue* DtoBoolean(DValue* dval) -{ - Type* dtype = dval->getType()->toBasetype(); - LLValue* val = dval->getRVal(); - const LLType* t = val->getType(); - - if (dtype->isintegral()) - { - if (t == LLType::Int1Ty) - return val; - else { - LLValue* zero = llvm::ConstantInt::get(t, 0, false); - return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); - } - } - else if (dtype->iscomplex()) - { - return DtoComplexEquals(TOKnotequal, dval, DtoComplex(dtype, new DNullValue(Type::tint8, llvm::ConstantInt::get(LLType::Int8Ty, 0)))); - } - else if (dtype->isfloating()) - { - LLValue* zero = llvm::Constant::getNullValue(t); - return new llvm::FCmpInst(llvm::FCmpInst::FCMP_ONE, val, zero, "tmp", gIR->scopebb()); - } - else if (dtype->ty == Tpointer) { - LLValue* zero = llvm::Constant::getNullValue(t); - return new llvm::ICmpInst(llvm::ICmpInst::ICMP_NE, val, zero, "tmp", gIR->scopebb()); - } - std::cout << "unsupported -> bool : " << dtype->toChars() << " " << *t << '\n'; - assert(0); - return 0; -} - -////////////////////////////////////////////////////////////////////////////////////////// - const LLType* DtoSize_t() { // the type of size_t does not change once set
--- a/gen/tollvm.h Mon Jul 14 22:48:03 2008 +0200 +++ b/gen/tollvm.h Tue Jul 15 00:17:03 2008 +0200 @@ -40,9 +40,6 @@ // TODO: this one should be removed!!! LLValue* DtoPointedType(LLValue* ptr, LLValue* val); -// casts any value to a boolean -LLValue* DtoBoolean(DValue* dval); - // some types const LLType* DtoSize_t(); const LLStructType* DtoInterfaceInfoType();