Skip to content

Commit

Permalink
fix C-IR conditional assignment extract transform
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-s168 committed May 1, 2024
1 parent 32f0957 commit 9c62d7d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
8 changes: 8 additions & 0 deletions ir/ir.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ typedef struct SsaOp_s SsaOp;

typedef size_t SsaVar;

typedef struct {
SsaVar var;
bool present;
} OptSsaVar;

#define SSAVAR_OPT_NONE (OptSsaVar) {.present = false,.var = 0}
#define SSAVAR_OPT_SOME(v) (OptSsaVar) {.present = true,.var = v}

typedef const char *SsaType;

struct SsaBlock_s;
Expand Down
19 changes: 14 additions & 5 deletions ir/transform/single_assign_conditional.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
* @param ifOp the if op that contains the conditional block
* @param var affected variable
*/
static void megic(SsaBlock *outer, const size_t outerOff, SsaBlock *conditional, const size_t condOff, SsaOp *ifOp, const SsaVar var) {
static SsaVar megic(SsaBlock *outer, const size_t outerOff, SsaBlock *conditional, const size_t condOff, SsaOp *ifOp, const SsaVar var, const OptSsaVar manipIn) {
// stage 1
const SsaVar manipulate = irblock_new_var(outer, ifOp);
{
Expand Down Expand Up @@ -112,13 +112,20 @@ static void megic(SsaBlock *outer, const size_t outerOff, SsaBlock *conditional,
}

irop_add_out(ifOp, manipulate, type);
irblock_add_out(then, last_cond_assign);
if (manipIn.present)
irblock_add_out(then, manipIn.var);
else
irblock_add_out(then, last_cond_assign);
irblock_add_out(els, var);

return manipulate;
}

// call megic somehow
// detect the patter from the inside out!!
void cirblock_mksa_states(SsaBlock *block) {
OptSsaVar cirblock_mksa_states(SsaBlock *block) {
OptSsaVar rvar = SSAVAR_OPT_NONE;

for (size_t i = 0; i < block->ops_len; i ++) {
SsaOp *ifOp = &block->ops[i];
if (ifOp->id != SSA_OP_IF)
Expand All @@ -132,7 +139,7 @@ void cirblock_mksa_states(SsaBlock *block) {
continue;

SsaBlock *conditional = ifOp->params[j].val.block;
cirblock_mksa_states(conditional);
OptSsaVar manip = cirblock_mksa_states(conditional);

// TODO: make work if we have a else block and assign there too!!!!

Expand All @@ -145,9 +152,11 @@ void cirblock_mksa_states(SsaBlock *block) {
const SsaOp *alwaysAssignOp = irblock_inside_out_vardecl_before(block, var, i);
if (alwaysAssignOp == NULL)
continue;
megic(alwaysAssignOp->parent, alwaysAssignOp->parent->ops - alwaysAssignOp, conditional, k, ifOp, var);
rvar = SSAVAR_OPT_SOME(megic(alwaysAssignOp->parent, alwaysAssignOp->parent->ops - alwaysAssignOp, conditional, k, ifOp, var, manip));
}
}
}
}

return rvar;
}

0 comments on commit 9c62d7d

Please sign in to comment.