aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-24 18:03:02 +0200
committerlemon <lsof@mailbox.org>2022-08-24 18:03:02 +0200
commitee1bbd0204064a20cbf89003da15151f1214fb2a (patch)
tree40dd207ab44b0a8e833414e648ed8f35ba2c0497 /src
parenta61dd9694409ef82fd24178bc99a794df55e1f04 (diff)
i don't know how to use phi nodes sorry
Diffstat (limited to 'src')
-rw-r--r--src/llvm.cff38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index e2659af..4644ee5 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -508,16 +508,18 @@ fn genexpr(f *Fn, ex *Expr) Value {
let id = orid++;
let lhs = genexpr(f, b.lhs);
let cnd = mktmp(ty_i1);
+ let tmpvar = mktmp(mkptrtype(ex.ty));
let res = mktmp(ex.ty);
- gen("\tbr label %%OrEntry%d\n", id);
- gen("OrEntry%d: ", id);
+ gen("\t%v = alloca %t\n", tmpvar, ex.ty);
+ gen("\tstore %t %v, %t %v\n", ex.ty, lhs, tmpvar.ty, tmpvar);
gen("\t%v = icmp ne %t %v, 0\n", cnd, lhs.ty, lhs);
gen("\tbr i1 %v, label %%OrT%d, label %%OrF%d\n", cnd, id, id);
gen("OrF%d: ", id);
let rhs = genexpr(f, b.rhs);
+ gen("\tstore %t %v, %t %v\n", ex.ty, rhs, tmpvar.ty, tmpvar);
gen("\tbr label %%OrT%d\n", cnd, id, id);
gen("OrT%d: ", id);
- gen("\t%v = phi %t [ %v, %%OrEntry%d ], [ %v, %%OrF%d ]\n", res, ex.ty, lhs, id, rhs, id);
+ gen("\t%v = load %t, %t %v\n", res, ex.ty, tmpvar.ty, tmpvar);
return res;
case 'and';
@@ -525,21 +527,45 @@ fn genexpr(f *Fn, ex *Expr) Value {
let id = andid++;
let lhs = genexpr(f, b.lhs);
let cnd = mktmp(ty_i1);
+ let tmpvar = mktmp(mkptrtype(ex.ty));
let res = mktmp(ex.ty);
- gen("\tbr label %%AndEntry%d\n", id);
- gen("AndEntry%d: ", id);
+ gen("\t%v = alloca %t\n", tmpvar, ex.ty);
+ gen("\tstore %t %v, %t %v\n", ex.ty, lhs, tmpvar.ty, tmpvar);
gen("\t%v = icmp ne %t %v, 0\n", cnd, lhs.ty, lhs);
gen("\tbr i1 %v, label %%AndT%d, label %%AndF%d\n", cnd, id, id);
gen("AndT%d: ", id);
let rhs = genexpr(f, b.rhs);
+ gen("\tstore %t %v, %t %v\n", ex.ty, rhs, tmpvar.ty, tmpvar);
gen("\tbr label %%AndF%d\n", cnd, id, id);
gen("AndF%d: ", id);
- gen("\t%v = phi %t [ %v, %%AndEntry%d ], [ %v, %%AndT%d ]\n", res, ex.ty, lhs, id, rhs, id);
+ gen("\t%v = load %t, %t %v\n", res, ex.ty, tmpvar.ty, tmpvar);
return res;
case else
assert(#f, "binop? %c", b.op);
}
+ case Cond cond;
+ static condid int = {};
+ let id = condid++;
+ let lhs = genexpr(f, cond.test);
+ let cnd = mktmp(ty_i1);
+ let tmpvar = mktmp(mkptrtype(ex.ty));
+ let res = mktmp(ex.ty);
+ gen("\t%v = alloca %t\n", tmpvar, ex.ty);
+ gen("\t%v = icmp ne %t %v, 0\n", cnd, lhs.ty, lhs);
+ gen("\tbr i1 %v, label %%CondT%d, label %%CondF%d\n", cnd, id, id);
+ gen("CondT%d: ", id);
+ let t = convert(f, ex.ty, cond.t);
+ gen("\tstore %t %v, %t %v\n", ex.ty, t, tmpvar.ty, tmpvar);
+ gen("\tbr label %%CondFin%d\n", cnd, id, id);
+ gen("CondF%d: ", id);
+ let f = convert(f, ex.ty, cond.f);
+ gen("\tstore %t %v, %t %v\n", ex.ty, f, tmpvar.ty, tmpvar);
+ gen("\tbr label %%CondFin%d\n", cnd, id, id);
+ gen("CondFin%d: ", id);
+ gen("\t%v = load %t, %t %v\n", res, ex.ty, tmpvar.ty, tmpvar);
+ return res;
+
case UnOp un;
switch un.op {
case :neg;