@@ -4651,14 +4651,48 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
4651
4651
llvm::Value *left_val = tmp;
4652
4652
this ->visit_expr_wrapper (x.m_right , true );
4653
4653
llvm::Value *right_val = tmp;
4654
- LCOMPILERS_ASSERT (ASRUtils::is_logical (*x.m_type ))
4654
+ llvm::Value *zero, *cond;
4655
+ if (ASRUtils::is_integer (*x.m_type )) {
4656
+ int a_kind = down_cast<ASR::Integer_t>(x.m_type )->m_kind ;
4657
+ int init_value_bits = 8 *a_kind;
4658
+ zero = llvm::ConstantInt::get (context,
4659
+ llvm::APInt (init_value_bits, 0 ));
4660
+ cond = builder->CreateICmpEQ (left_val, zero);
4661
+ } else if (ASRUtils::is_real (*x.m_type )) {
4662
+ int a_kind = down_cast<ASR::Real_t>(x.m_type )->m_kind ;
4663
+ int init_value_bits = 8 *a_kind;
4664
+ if (init_value_bits == 32 ) {
4665
+ zero = llvm::ConstantFP::get (context,
4666
+ llvm::APFloat ((float )0 ));
4667
+ } else {
4668
+ zero = llvm::ConstantFP::get (context,
4669
+ llvm::APFloat ((double )0 ));
4670
+ }
4671
+ cond = builder->CreateFCmpUEQ (left_val, zero);
4672
+ } else if (ASRUtils::is_character (*x.m_type )) {
4673
+ zero = llvm::Constant::getNullValue (character_type);
4674
+ cond = lfortran_str_cmp (left_val, zero, " _lpython_str_compare_eq" );
4675
+ } else if (ASRUtils::is_logical (*x.m_type )) {
4676
+ zero = llvm::ConstantInt::get (context,
4677
+ llvm::APInt (1 , 0 ));
4678
+ cond = builder->CreateICmpEQ (left_val, zero);
4679
+ } else {
4680
+ throw CodeGenError (" Only Integer, Real, Strings and Logical types are supported "
4681
+ " in logical binary operation." , x.base .base .loc );
4682
+ }
4655
4683
switch (x.m_op ) {
4656
4684
case ASR::logicalbinopType::And: {
4657
- tmp = builder->CreateAnd (left_val, right_val);
4685
+ tmp = right_val;
4686
+ create_if_else (cond, [=]() {
4687
+ tmp = left_val;
4688
+ }, []() {});
4658
4689
break ;
4659
4690
};
4660
4691
case ASR::logicalbinopType::Or: {
4661
- tmp = builder->CreateOr (left_val, right_val);
4692
+ tmp = left_val;
4693
+ create_if_else (cond, [=]() {
4694
+ tmp = right_val;
4695
+ }, []() {});
4662
4696
break ;
4663
4697
};
4664
4698
case ASR::logicalbinopType::Xor: {
0 commit comments