Skip to content

Commit

Permalink
some stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander.nutz committed Aug 7, 2024
1 parent 5d6b1e7 commit 1ffee62
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 10 deletions.
2 changes: 2 additions & 0 deletions ir/cir.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ TRANSFORM_PASS void vx_CIrBlock_normalize(vx_IrBlock *);
TRANSFORM_PASS vx_OptIrVar vx_CIrBlock_mksa_states(vx_IrBlock *);
TRANSFORM_PASS void vx_CIrBlock_mksa_final(vx_IrBlock *);

void vx_CIrBlock_fix(vx_IrBlock*);

vx_Errors vx_CIrBlock_verify(vx_IrBlock *block);

static int vx_cir_verify(vx_IrBlock *block) {
Expand Down
32 changes: 32 additions & 0 deletions ir/ir.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "ir.h"
#include "cir.h"
#include "llir.h"

#include <assert.h>
Expand Down Expand Up @@ -29,6 +30,37 @@ void vx_IrBlock_llir_compact(vx_IrBlock *root) {
}
}

typedef struct {
vx_IrVar var;
vx_IrOp* decl;
} vx_CIrBlock_fix_state;

bool vx_CIrBlock_fix_iter(vx_IrOp* op, void* param) {
vx_CIrBlock_fix_state* state = param;

for (size_t i = 0; i < op->outs_len; i ++) {
if (op->outs[i].var == state->var) {
state->decl = op;
return true;
}
}
return false;
}

void vx_CIrBlock_fix(vx_IrBlock *root) {
assert(root->is_root);

for (vx_IrVar var = 0; var < root->as_root.vars_len; var ++) {
vx_CIrBlock_fix_state state;
state.var = var;
state.decl = NULL;

vx_IrBlock_deep_traverse(root, vx_CIrBlock_fix_iter, &state);

root->as_root.vars[var].decl = state.decl;
}
}

void vx_IrBlock_llir_fix_decl(vx_IrBlock *root) {
assert(root->is_root);

Expand Down
10 changes: 10 additions & 0 deletions ir/ir.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>


#ifndef VX_BASE_TYPES
Expand Down Expand Up @@ -40,6 +41,15 @@ typedef struct {
#define VX_IRVAR_OPT_NONE (vx_OptIrVar) {.present = false,.var = 0}
#define VX_IRVAR_OPT_SOME(v) (vx_OptIrVar) {.present = true,.var = v}

static const char * vx_OptIrVar_debug(vx_OptIrVar var) {
if (var.present) {
static char c[8];
sprintf(c, "%zu", var.var);
return c;
}
return "none";
}

typedef struct vx_IrType_s vx_IrType;

// only in C IR
Expand Down
9 changes: 5 additions & 4 deletions ir/transform/single_assign_conditional.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,16 @@
* @param manipIn
*/
static vx_IrVar megic(vx_IrBlock *outer,
vx_IrOp *orig_assign,
vx_IrOp *orig_assign,
vx_IrBlock *conditional,
vx_IrOp *cond_op,
vx_IrOp *ifOp,
const vx_IrVar var,
vx_IrOp *cond_op,
vx_IrOp *ifOp,
const vx_IrVar var,
const vx_OptIrVar manipIn)
{
// stage 1
const vx_IrVar manipulate = vx_IrBlock_new_var(outer, ifOp);
printf("var: %zu\nmanipulate: %zu\n", var, manipulate);
{
vx_IrOp *oldstart = outer->first;
outer->first = orig_assign->next;
Expand Down
2 changes: 1 addition & 1 deletion ir/verify_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ void vx_IrBlock_verify_ssa_based(vx_Errors *dest, vx_IrBlock *block) {
.additional = buf
};
vx_Errors_add(dest, &error);
} else if (var >= root->as_root.vars_len || root->as_root.vars[var].decl == NULL) {
} else if (root->as_root.vars[var].decl == NULL) {
if (!vx_IrBlock_vardecl_is_in_ins(block, var)) {
static char buf[256];
sprintf(buf, "Variable %%%zu is never declared!", var);
Expand Down
3 changes: 2 additions & 1 deletion ir/verify_ssa.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ vx_Errors vx_IrBlock_verify(vx_IrBlock *block) {
vx_IrBlock_deep_traverse(block, verify_vardecls_deeptraverse, &dat);
// TODO: NEED TO SEARCH FROM ROOT

assert(dat.declcount > 0); // WE REMOVED VAR DECL WITHOUT REMOVING IT FROM INDEX
// TODO: ?
// assert(dat.declcount > 0); // WE REMOVED VAR DECL WITHOUT REMOVING IT FROM INDEX

if (dat.declcount > 1) {
static char buf[256];
Expand Down
9 changes: 5 additions & 4 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,15 @@ void eq(int a, int b, int c, int d) {
}

static int cir_test(vx_IrBlock *block) {
if (vx_cir_verify(block) != 0)
return 1;

printf("Input:\n");
vx_IrBlock_dump(block, stdout, 0);

if (vx_cir_verify(block) != 0)
return 1;

vx_CIrBlock_mksa_states(block);
vx_CIrBlock_mksa_final(block);
// vx_CIrBlock_mksa_final(block);
vx_CIrBlock_fix(block); // TODO: why...

printf("After C IR lower:\n");
vx_IrBlock_dump(block, stdout, 0);
Expand Down

0 comments on commit 1ffee62

Please sign in to comment.