Skip to content

Commit

Permalink
Refactor bool to use BlockExt (lambdaclass#563)
Browse files Browse the repository at this point in the history
* Refactor

* Ran fmt and check

* Ran make check

---------

Co-authored-by: Iñaki Garay <igarai@gmail.com>
  • Loading branch information
2 people authored and Gerson2102 committed May 15, 2024
1 parent f2824ab commit 36d8951
Showing 1 changed file with 40 additions and 110 deletions.
150 changes: 40 additions & 110 deletions src/libfuncs/bool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
use super::LibfuncHelper;
use crate::{
error::Result, metadata::MetadataStorage, types::TypeBuilder, utils::ProgramRegistryExt,
block_ext::BlockExt, error::Result, metadata::MetadataStorage, types::TypeBuilder,
utils::ProgramRegistryExt,
};
use cairo_lang_sierra::{
extensions::{
Expand All @@ -15,11 +16,7 @@ use cairo_lang_sierra::{
};
use melior::{
dialect::{arith, llvm},
ir::{
attribute::{DenseI64ArrayAttribute, IntegerAttribute},
r#type::IntegerType,
Block, Location,
},
ir::{r#type::IntegerType, Block, Location},
Context,
};

Expand Down Expand Up @@ -104,57 +101,28 @@ fn build_bool_binary<'ctx, 'this>(
let lhs = entry.argument(0)?.into();
let rhs = entry.argument(1)?.into();

let lhs_tag = entry
.append_operation(llvm::extract_value(
context,
lhs,
DenseI64ArrayAttribute::new(context, &[0]),
tag_ty,
location,
))
.result(0)?
.into();
let rhs_tag = entry
.append_operation(llvm::extract_value(
context,
rhs,
DenseI64ArrayAttribute::new(context, &[0]),
tag_ty,
location,
))
.result(0)?
.into();

let op = match bin_op {
BoolOp::And => entry.append_operation(arith::andi(lhs_tag, rhs_tag, location)),
BoolOp::Xor => entry.append_operation(arith::xori(lhs_tag, rhs_tag, location)),
BoolOp::Or => entry.append_operation(arith::ori(lhs_tag, rhs_tag, location)),
let lhs_tag = entry.extract_value(context, location, lhs, tag_ty, 0)?;

let rhs_tag = entry.extract_value(context, location, rhs, tag_ty, 0)?;

let new_tag_value = match bin_op {
BoolOp::And => entry.append_op_result(arith::andi(lhs_tag, rhs_tag, location))?,
BoolOp::Xor => entry.append_op_result(arith::xori(lhs_tag, rhs_tag, location))?,
BoolOp::Or => entry.append_op_result(arith::ori(lhs_tag, rhs_tag, location))?,
};
let new_tag_value = op.result(0)?.into();

let res = entry
.append_operation(llvm::undef(
enum_ty.build(
context,
helper,
registry,
metadata,
&info.param_signatures()[0].ty,
)?,
location,
))
.result(0)?
.into();
let res = entry
.append_operation(llvm::insert_value(

let res = entry.append_op_result(llvm::undef(
enum_ty.build(
context,
res,
DenseI64ArrayAttribute::new(context, &[0]),
new_tag_value,
location,
))
.result(0)?
.into();
helper,
registry,
metadata,
&info.param_signatures()[0].ty,
)?,
location,
))?;

let res = entry.insert_value(context, location, res, new_tag_value, 0)?;

entry.append_operation(helper.br(0, &[res], location));
Ok(())
Expand All @@ -180,50 +148,23 @@ pub fn build_bool_not<'ctx, 'this>(
let tag_ty = IntegerType::new(context, tag_bits).into();

let value = entry.argument(0)?.into();
let tag_value = entry
.append_operation(llvm::extract_value(
context,
value,
DenseI64ArrayAttribute::new(context, &[0]),
tag_ty,
location,
))
.result(0)?
.into();
let tag_value = entry.extract_value(context, location, value, tag_ty, 0)?;

let op = entry.append_operation(arith::constant(
context,
IntegerAttribute::new(tag_ty, 1).into(),
location,
));
let const_1 = op.result(0)?.into();

let op = entry.append_operation(arith::xori(tag_value, const_1, location));
let new_tag_value = op.result(0)?.into();

let res = entry
.append_operation(llvm::undef(
enum_ty.build(
context,
helper,
registry,
metadata,
&info.param_signatures()[0].ty,
)?,
location,
))
.result(0)?
.into();
let res = entry
.append_operation(llvm::insert_value(
let const_1 = entry.const_int_from_type(context, location, 1, tag_ty)?;

let new_tag_value = entry.append_op_result(arith::xori(tag_value, const_1, location))?;

let res = entry.append_op_result(llvm::undef(
enum_ty.build(
context,
res,
DenseI64ArrayAttribute::new(context, &[0]),
new_tag_value,
location,
))
.result(0)?
.into();
helper,
registry,
metadata,
&info.param_signatures()[0].ty,
)?,
location,
))?;
let res = entry.insert_value(context, location, res, new_tag_value, 0)?;

entry.append_operation(helper.br(0, &[res], location));
Ok(())
Expand Down Expand Up @@ -257,20 +198,9 @@ pub fn build_bool_to_felt252<'ctx, 'this>(
let tag_ty = IntegerType::new(context, tag_bits).into();

let value = entry.argument(0)?.into();
let tag_value = entry
.append_operation(llvm::extract_value(
context,
value,
DenseI64ArrayAttribute::new(context, &[0]),
tag_ty,
location,
))
.result(0)?
.into();

let op = entry.append_operation(arith::extui(tag_value, felt252_ty, location));
let tag_value = entry.extract_value(context, location, value, tag_ty, 0)?;

let result = op.result(0)?.into();
let result = entry.append_op_result(arith::extui(tag_value, felt252_ty, location))?;

entry.append_operation(helper.br(0, &[result], location));
Ok(())
Expand Down

0 comments on commit 36d8951

Please sign in to comment.