From dc5fffbddc30a4a813b9d723ee73f6a6005c3ee4 Mon Sep 17 00:00:00 2001 From: Stefano Sanfilippo Date: Mon, 9 Mar 2015 21:41:11 +0100 Subject: [PATCH] Cast the expression before deducing truth value in isTrue() --- BitcodeEmitter.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/BitcodeEmitter.cpp b/BitcodeEmitter.cpp index 168b150..1eda9f3 100644 --- a/BitcodeEmitter.cpp +++ b/BitcodeEmitter.cpp @@ -68,15 +68,6 @@ llvm::AllocaInst* allocateReturnVariable(llvm::Function *func) { return builder.CreateAlloca(func->getReturnType(), 0, "result"); } -static -llvm::Value* isTrue(llvm::IRBuilder<> &builder, llvm::Value* test, llvm::Twine const& label="") { - return builder.CreateICmpNE( - test, - llvm::ConstantInt::get(getGlobalContext(), llvm::APInt(1, 0)), - label - ); -} - static bool reportError(std::initializer_list const& what) { for (std::string const& chunk: what) { @@ -202,6 +193,14 @@ llvm::Value* coerce(BitcodeEmitter::Private *d, llvm::Value *val, llvm::Type *to return nullptr; } +static +llvm::Value* isTrue(BitcodeEmitter::Private *d, llvm::Value* test, llvm::Twine const& label="") { + llvm::Value *one = llvm::ConstantInt::get(getGlobalContext(), llvm::APInt(1, 0)); + return d->builder.CreateICmpNE( + coerce(d, test, one->getType()), one, label + ); +} + static const std::map PUT_NAMES = {{ {Type::BOOL, "__Monicelli_putBool"}, {Type::CHAR, "__Monicelli_putChar"}, @@ -272,7 +271,7 @@ bool BitcodeEmitter::emit(Loop const& node) { GUARDED(node.getCondition().emit(this)); - llvm::Value *loopTest = isTrue(d->builder, d->retval, "looptest"); + llvm::Value *loopTest = isTrue(d, d->retval, "looptest"); llvm::BasicBlock *after = llvm::BasicBlock::Create( getGlobalContext(), "afterloop", father @@ -465,7 +464,7 @@ bool BitcodeEmitter::emit(Branch const& node) { for (BranchCase const& cas: body.getCases()) { emitSemiExpression(node.getVar(), cas.getCondition()); d->builder.CreateCondBr( - isTrue(d->builder, d->retval, "condition"), thenbb, elsebb + isTrue(d, d->retval, "condition"), thenbb, elsebb ); d->builder.SetInsertPoint(thenbb); d->scope.enter();