Skip to content

Commit

Permalink
cilkcc: codegen supports ternary op
Browse files Browse the repository at this point in the history
  • Loading branch information
maekawatoshiki committed Oct 5, 2020
1 parent c85081f commit 44e72ed
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
39 changes: 39 additions & 0 deletions cilkcc/src/codegen.rs
Expand Up @@ -154,6 +154,9 @@ impl<'a> FunctionCodeGenerator<'a> {
ast::Kind::Assign { dst, src } => self.generate_assign(dst, src),
ast::Kind::Load(val) => self.generate_load(val),
ast::Kind::BinaryOp(op, lhs, rhs) => self.generate_binary_op(*op, lhs, rhs),
ast::Kind::TernaryOp(cond, then_, else_) => {
self.generate_ternary_op(cond, then_, else_)
}
ast::Kind::FuncCall(f, args) => self.generate_func_call(f, args),
ast::Kind::Return(val) => self.generate_return(val.as_ref().map(|v| &**v)),
_ => panic!(),
Expand Down Expand Up @@ -285,6 +288,42 @@ impl<'a> FunctionCodeGenerator<'a> {
}
}

fn generate_ternary_op(&mut self, cond: &AST, then_: &AST, else_: &AST) -> Result<Value> {
let cond = self.generate(cond)?;

let then_block = self.builder.append_basic_block();
let else_block = self.builder.append_basic_block();
let merge_block = self.builder.append_basic_block();

self.builder.build_cond_br(cond, then_block, else_block);

self.builder.set_insert_point(then_block);

let then_ = self.generate(then_)?;

if !self.builder.is_last_inst_terminator() {
self.builder.build_br(merge_block);
}

self.builder.set_insert_point(else_block);

let else_ = self.generate(else_)?;

if !self.builder.is_last_inst_terminator() {
self.builder.build_br(merge_block);
}

self.builder.set_insert_point(merge_block);

if matches!(then_, Value::None) || matches!(else_, Value::None) {
return Ok(Value::None);
}

Ok(self
.builder
.build_phi(vec![(then_, then_block), (else_, else_block)]))
}

fn generate_func_call(&mut self, f: &AST, args: &Vec<AST>) -> Result<Value> {
let f = retrieve_from_load(f);
let mut args_ = vec![];
Expand Down
9 changes: 6 additions & 3 deletions cilkcc/src/lib.rs
Expand Up @@ -40,7 +40,7 @@ pub fn compile(path: PathBuf) {
}
};

println!("{:#?}", nodes);
// println!("{:#?}", nodes);

let mut codegen = codegen::Codegenerator::new(&mut parser.compound_types);
for node in nodes {
Expand Down Expand Up @@ -109,8 +109,11 @@ fn assemble_and_run(c_parent: &str, s_target: &str) {
let execution = process::Command::new(output_name.as_str())
.status()
.unwrap();
println!("Exit code: {:?}", execution.code());
assert!(execution.success());
if let Some(code) = execution.code() {
println!("Exit code: {:?}", code);
} else {
assert!(execution.success());
}

fs::remove_file(output_name).unwrap();
fs::remove_file(parent_name).unwrap();
Expand Down

0 comments on commit 44e72ed

Please sign in to comment.