Skip to content

Commit 2f1ac30

Browse files
committed
Fix assignment
1 parent 58deaa1 commit 2f1ac30

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4652,12 +4652,14 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
46524652
this->visit_expr_wrapper(x.m_right, true);
46534653
llvm::Value *right_val = tmp;
46544654
llvm::Value *zero, *cond;
4655+
llvm::AllocaInst *result;
46554656
if (ASRUtils::is_integer(*x.m_type)) {
46564657
int a_kind = down_cast<ASR::Integer_t>(x.m_type)->m_kind;
46574658
int init_value_bits = 8*a_kind;
46584659
zero = llvm::ConstantInt::get(context,
46594660
llvm::APInt(init_value_bits, 0));
46604661
cond = builder->CreateICmpEQ(left_val, zero);
4662+
result = builder->CreateAlloca(getIntType(a_kind), nullptr);
46614663
} else if (ASRUtils::is_real(*x.m_type)) {
46624664
int a_kind = down_cast<ASR::Real_t>(x.m_type)->m_kind;
46634665
int init_value_bits = 8*a_kind;
@@ -4668,31 +4670,39 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
46684670
zero = llvm::ConstantFP::get(context,
46694671
llvm::APFloat((double)0));
46704672
}
4673+
result = builder->CreateAlloca(getFPType(a_kind), nullptr);
46714674
cond = builder->CreateFCmpUEQ(left_val, zero);
46724675
} else if (ASRUtils::is_character(*x.m_type)) {
46734676
zero = llvm::Constant::getNullValue(character_type);
46744677
cond = lfortran_str_cmp(left_val, zero, "_lpython_str_compare_eq");
4678+
result = builder->CreateAlloca(character_type, nullptr);
46754679
} else if (ASRUtils::is_logical(*x.m_type)) {
46764680
zero = llvm::ConstantInt::get(context,
46774681
llvm::APInt(1, 0));
46784682
cond = builder->CreateICmpEQ(left_val, zero);
4683+
result = builder->CreateAlloca(getIntType(1), nullptr);
46794684
} else {
46804685
throw CodeGenError("Only Integer, Real, Strings and Logical types are supported "
46814686
"in logical binary operation.", x.base.base.loc);
46824687
}
46834688
switch (x.m_op) {
46844689
case ASR::logicalbinopType::And: {
4685-
tmp = right_val;
4686-
create_if_else(cond, [=]() {
4687-
tmp = left_val;
4688-
}, []() {});
4690+
create_if_else(cond, [&, result, left_val]() {
4691+
LLVM::CreateStore(*builder, left_val, result);
4692+
}, [&, result, right_val]() {
4693+
LLVM::CreateStore(*builder, right_val, result);
4694+
});
4695+
tmp = LLVM::CreateLoad(*builder, result);
46894696
break;
46904697
};
46914698
case ASR::logicalbinopType::Or: {
4692-
tmp = left_val;
4693-
create_if_else(cond, [=]() {
4694-
tmp = right_val;
4695-
}, []() {});
4699+
create_if_else(cond, [&, result, right_val]() {
4700+
LLVM::CreateStore(*builder, right_val, result);
4701+
4702+
}, [&, result, left_val]() {
4703+
LLVM::CreateStore(*builder, left_val, result);
4704+
});
4705+
tmp = LLVM::CreateLoad(*builder, result);
46964706
break;
46974707
};
46984708
case ASR::logicalbinopType::Xor: {

0 commit comments

Comments
 (0)