diff options
| author | 2022-08-24 18:03:02 +0200 | |
|---|---|---|
| committer | 2022-08-24 18:03:02 +0200 | |
| commit | ee1bbd0204064a20cbf89003da15151f1214fb2a (patch) | |
| tree | 40dd207ab44b0a8e833414e648ed8f35ba2c0497 /src | |
| parent | a61dd9694409ef82fd24178bc99a794df55e1f04 (diff) | |
i don't know how to use phi nodes sorry
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm.cff | 38 |
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; |