@@ -4652,12 +4652,14 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
4652
4652
this ->visit_expr_wrapper (x.m_right , true );
4653
4653
llvm::Value *right_val = tmp;
4654
4654
llvm::Value *zero, *cond;
4655
+ llvm::AllocaInst *result;
4655
4656
if (ASRUtils::is_integer (*x.m_type )) {
4656
4657
int a_kind = down_cast<ASR::Integer_t>(x.m_type )->m_kind ;
4657
4658
int init_value_bits = 8 *a_kind;
4658
4659
zero = llvm::ConstantInt::get (context,
4659
4660
llvm::APInt (init_value_bits, 0 ));
4660
4661
cond = builder->CreateICmpEQ (left_val, zero);
4662
+ result = builder->CreateAlloca (getIntType (a_kind), nullptr );
4661
4663
} else if (ASRUtils::is_real (*x.m_type )) {
4662
4664
int a_kind = down_cast<ASR::Real_t>(x.m_type )->m_kind ;
4663
4665
int init_value_bits = 8 *a_kind;
@@ -4668,31 +4670,39 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
4668
4670
zero = llvm::ConstantFP::get (context,
4669
4671
llvm::APFloat ((double )0 ));
4670
4672
}
4673
+ result = builder->CreateAlloca (getFPType (a_kind), nullptr );
4671
4674
cond = builder->CreateFCmpUEQ (left_val, zero);
4672
4675
} else if (ASRUtils::is_character (*x.m_type )) {
4673
4676
zero = llvm::Constant::getNullValue (character_type);
4674
4677
cond = lfortran_str_cmp (left_val, zero, " _lpython_str_compare_eq" );
4678
+ result = builder->CreateAlloca (character_type, nullptr );
4675
4679
} else if (ASRUtils::is_logical (*x.m_type )) {
4676
4680
zero = llvm::ConstantInt::get (context,
4677
4681
llvm::APInt (1 , 0 ));
4678
4682
cond = builder->CreateICmpEQ (left_val, zero);
4683
+ result = builder->CreateAlloca (getIntType (1 ), nullptr );
4679
4684
} else {
4680
4685
throw CodeGenError (" Only Integer, Real, Strings and Logical types are supported "
4681
4686
" in logical binary operation." , x.base .base .loc );
4682
4687
}
4683
4688
switch (x.m_op ) {
4684
4689
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);
4689
4696
break ;
4690
4697
};
4691
4698
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);
4696
4706
break ;
4697
4707
};
4698
4708
case ASR::logicalbinopType::Xor: {
0 commit comments