Skip to content

Commit 58deaa1

Browse files
committed
LLVM: Support logical binop for strings, int, real
1 parent 5ba2a2a commit 58deaa1

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4651,14 +4651,48 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
46514651
llvm::Value *left_val = tmp;
46524652
this->visit_expr_wrapper(x.m_right, true);
46534653
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+
}
46554683
switch (x.m_op) {
46564684
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+
}, []() {});
46584689
break;
46594690
};
46604691
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+
}, []() {});
46624696
break;
46634697
};
46644698
case ASR::logicalbinopType::Xor: {

0 commit comments

Comments
 (0)