diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 52fa0fa8c..a05eb0ae8 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -1330,7 +1330,7 @@ static void llvm_prune_optional(GenContext *c, LLVMBasicBlockRef discard_fail) // // Find the use of this block. - LLVMUseRef use = LLVMGetFirstUse(block_value); + LLVMUseRef use = LLVMHasUseList(block_value) ? LLVMGetFirstUse(block_value) : NULL; if (!use) return; LLVMValueRef maybe_br = LLVMGetUser(use); @@ -1356,7 +1356,8 @@ static void llvm_prune_optional(GenContext *c, LLVMBasicBlockRef discard_fail) LLVMInstructionEraseFromParent(maybe_br); // Optionally remove the comparison - if (!LLVMGetFirstUse(compared)) + + if (LLVMHasUseList(compared) && !LLVMGetFirstUse(compared)) { LLVMValueRef operand = NULL; if (LLVMGetInstructionOpcode(compared) == LLVMCall) @@ -5255,7 +5256,7 @@ void llvm_emit_parameter(GenContext *c, LLVMValueRef *args, unsigned *arg_count_ } LLVMValueRef val = be_value->value; // Maybe it's just created? Let's optimize codegen. - if (!LLVMGetFirstUse(val) && LLVMIsAInsertValueInst(val) && LLVMIsAInsertValueInst( + if (LLVMHasUseList(val) && !LLVMGetFirstUse(val) && LLVMIsAInsertValueInst(val) && LLVMIsAInsertValueInst( LLVMGetPreviousInstruction(val))) { LLVMValueRef prev = LLVMGetPreviousInstruction(val); diff --git a/wrapper/include/c3_llvm.h b/wrapper/include/c3_llvm.h index 8862ebb9e..4728e3aff 100644 --- a/wrapper/include/c3_llvm.h +++ b/wrapper/include/c3_llvm.h @@ -75,6 +75,7 @@ bool llvm_link_mingw(const char **args, int arg_count, const char **error_string bool llvm_ar(const char *out_name, const char **args, size_t count, int ArFormat); LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal); +bool LLVMHasUseList(LLVMValueRef value); void LLVMBuilderSetFastMathFlags(LLVMBuilderRef Builder, FastMathOption option); void LLVMSetDSOLocal(LLVMValueRef Global, bool value); void LLVMSetTargetMachineUseInitArray(LLVMTargetMachineRef ref, bool use_init_array); diff --git a/wrapper/src/wrapper.cpp b/wrapper/src/wrapper.cpp index 786d5d49d..52498113c 100644 --- a/wrapper/src/wrapper.cpp +++ b/wrapper/src/wrapper.cpp @@ -356,6 +356,12 @@ void LLVMBuilderSetFastMathFlags(LLVMBuilderRef Builder, FastMathOption option) llvm::unwrap(Builder)->setFastMathFlags(math_flags); } +bool LLVMHasUseList(LLVMValueRef value) +{ + llvm::Value *val = llvm::unwrap(value); + return val->hasUseList(); +} + LLVMValueRef LLVMConstBswap(LLVMValueRef ConstantVal) { llvm::Constant *Val = llvm::unwrap(ConstantVal);