From 439e2c92426c59f84d51bfb594e9ac86d496c708 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 29 Mar 2021 23:15:31 +0100 Subject: Fix shifting limits and LLVM code gen bug relating to shifts --- src/llvm_backend.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/llvm_backend.cpp') diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 14a49b7da..92b180f73 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -6599,13 +6599,14 @@ handle_op: LLVMValueRef lhsval = lhs.value; LLVMValueRef bits = rhs.value; - LLVMValueRef max = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type), false); + LLVMValueRef bit_size = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type), false); + LLVMValueRef max = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type)-1, false); - LLVMValueRef less_equal_width = LLVMBuildICmp(p->builder, LLVMIntULT, bits, max, ""); + LLVMValueRef width_test = LLVMBuildICmp(p->builder, LLVMIntULT, bits, bit_size, ""); res.value = LLVMBuildShl(p->builder, lhsval, bits, ""); LLVMValueRef zero = LLVMConstNull(lb_type(p->module, lhs.type)); - res.value = LLVMBuildSelect(p->builder, less_equal_width, res.value, zero, ""); + res.value = LLVMBuildSelect(p->builder, width_test, res.value, zero, ""); return res; } case Token_Shr: @@ -6615,11 +6616,12 @@ handle_op: LLVMValueRef bits = rhs.value; bool is_unsigned = is_type_unsigned(type); - LLVMValueRef max = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type), false); + LLVMValueRef bit_size = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type), false); + LLVMValueRef max = LLVMConstInt(lb_type(p->module, rhs.type), 8*type_size_of(lhs.type)-1, false); - LLVMValueRef less_equal_width = LLVMBuildICmp(p->builder, LLVMIntULT, bits, max, ""); + LLVMValueRef width_test = LLVMBuildICmp(p->builder, LLVMIntULT, bits, bit_size, ""); - bits = LLVMBuildSelect(p->builder, less_equal_width, bits, max, ""); + bits = LLVMBuildSelect(p->builder, width_test, bits, max, ""); if (is_unsigned) { res.value = LLVMBuildLShr(p->builder, lhs.value, bits, ""); } else { -- cgit v1.2.3