aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-10-16 00:26:53 +0100
committerGinger Bill <bill@gingerbill.org>2016-10-16 00:26:53 +0100
commitb9719df0ad97eea1ba67525a9ab1d3c89e95ee8c (patch)
tree1ece268be86209f50bc7b8df7b56d71705001e60 /src/codegen
parent79af939522da622a85a513747890e5221be1ae4f (diff)
Fix exact value bug when updating expressions
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/print_llvm.cpp9
-rw-r--r--src/codegen/ssa.cpp35
2 files changed, 26 insertions, 18 deletions
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index 1c2e0929d..95fd4fe5b 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -145,12 +145,10 @@ void ssa_print_type(ssaFileBuffer *f, ssaModule *m, Type *t) {
case Basic_i16: ssa_fprintf(f, "i16"); break;
case Basic_i32: ssa_fprintf(f, "i32"); break;
case Basic_i64: ssa_fprintf(f, "i64"); break;
- // case Basic_i128: ssa_fprintf(f, "i128"); break;
case Basic_u8: ssa_fprintf(f, "i8"); break;
case Basic_u16: ssa_fprintf(f, "i16"); break;
case Basic_u32: ssa_fprintf(f, "i32"); break;
case Basic_u64: ssa_fprintf(f, "i64"); break;
- // case Basic_u128: ssa_fprintf(f, "i128"); break;
case Basic_f32: ssa_fprintf(f, "float"); break;
case Basic_f64: ssa_fprintf(f, "double"); break;
case Basic_rawptr: ssa_fprintf(f, "%%..rawptr"); break;
@@ -176,12 +174,11 @@ void ssa_print_type(ssaFileBuffer *f, ssaModule *m, Type *t) {
ssa_print_type(f, m, t->Array.elem);
ssa_fprintf(f, "]");
break;
- case Type_Vector: {
- // TODO(bill): actually do correctly
+ case Type_Vector:
ssa_fprintf(f, "<%lld x ", t->Vector.count);
ssa_print_type(f, m, t->Vector.elem);
ssa_fprintf(f, ">");
- } break;
+ break;
case Type_Slice:
ssa_fprintf(f, "{");
ssa_print_type(f, m, t->Slice.elem);
@@ -278,7 +275,7 @@ void ssa_print_compound_element(ssaFileBuffer *f, ssaModule *m, ExactValue v, Ty
ssa_fprintf(f, " ");
}
- if (v.kind == ExactValue_Invalid) {
+ if (v.kind == ExactValue_Invalid || base_type(elem_type) == t_any) {
ssa_fprintf(f, "zeroinitializer");
} else if (v.kind == ExactValue_String) {
// HACK NOTE(bill): This is a hack but it works because strings are created at the very end
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index 20868d475..80f5b7e12 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -1418,6 +1418,7 @@ void ssa_end_procedure_body(ssaProcedure *proc) {
proc->curr_block = proc->decl_block;
ssa_emit_jump(proc, proc->entry_block);
+#if 0
ssa_optimize_blocks(proc);
ssa_build_referrers(proc);
ssa_build_dom_tree(proc);
@@ -1428,7 +1429,7 @@ void ssa_end_procedure_body(ssaProcedure *proc) {
// [ ] Local stored once? Replace loads with dominating store
// [ ] Convert to phi nodes
ssa_opt_mem2reg(proc);
-
+#endif
// Number registers
i32 reg_index = 0;
@@ -1923,6 +1924,7 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg
ev = exact_value_to_float(ev);
} else if (is_type_string(dst)) {
// Handled elsewhere
+ GB_ASSERT(ev.kind == ExactValue_String);
} else if (is_type_integer(dst)) {
ev = exact_value_to_integer(ev);
} else if (is_type_pointer(dst)) {
@@ -2479,7 +2481,10 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
case Type_Slice: et = bt->Slice.elem; break;
}
- auto is_elem_const = [](ssaModule *m, AstNode *elem) -> b32 {
+ auto is_elem_const = [](ssaModule *m, AstNode *elem, Type *elem_type) -> b32 {
+ if (base_type(elem_type) == t_any) {
+ return false;
+ }
if (elem->kind == AstNode_FieldValue) {
elem = elem->FieldValue.value;
}
@@ -2495,7 +2500,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssaValue *result = ssa_add_module_constant(proc->module, type, make_exact_value_compound(expr));
for_array(index, cl->elems) {
AstNode *elem = cl->elems[index];
- if (is_elem_const(proc->module, elem)) {
+ if (is_elem_const(proc->module, elem, et)) {
continue;
}
ssaValue *field_elem = ssa_build_expr(proc, elem);
@@ -2526,9 +2531,6 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssa_emit_store(proc, v, ssa_add_module_constant(proc->module, type, make_exact_value_compound(expr)));
for_array(field_index, cl->elems) {
AstNode *elem = cl->elems[field_index];
- if (is_elem_const(proc->module, elem)) {
- continue;
- }
ssaValue *field_expr = NULL;
Entity *field = NULL;
@@ -2538,17 +2540,23 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ast_node(fv, FieldValue, elem);
Selection sel = lookup_field(proc->module->allocator, bt, fv->field->Ident.string, false);
index = sel.index[0];
- field_expr = ssa_build_expr(proc, fv->value);
+ elem = fv->value;
} else {
TypeAndValue *tav = type_and_value_of_expression(proc->module->info, elem);
Selection sel = lookup_field(proc->module->allocator, bt, st->fields_in_src_order[field_index]->token.string, false);
index = sel.index[0];
- field_expr = ssa_build_expr(proc, elem);
}
+ field = st->fields[index];
+ if (is_elem_const(proc->module, elem, field->type)) {
+ continue;
+ }
+
+ field_expr = ssa_build_expr(proc, elem);
+
GB_ASSERT(ssa_type(field_expr)->kind != Type_Tuple);
- field = st->fields[index];
+
Type *ft = field->type;
ssaValue *fv = ssa_emit_conv(proc, field_expr, ft);
@@ -2562,7 +2570,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssa_emit_store(proc, v, ssa_add_module_constant(proc->module, type, make_exact_value_compound(expr)));
for_array(i, cl->elems) {
AstNode *elem = cl->elems[i];
- if (is_elem_const(proc->module, elem)) {
+ if (is_elem_const(proc->module, elem, et)) {
continue;
}
ssaValue *field_expr = ssa_build_expr(proc, elem);
@@ -2587,7 +2595,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
for_array(i, cl->elems) {
AstNode *elem = cl->elems[i];
- if (is_elem_const(proc->module,elem)) {
+ if (is_elem_const(proc->module, elem, et)) {
continue;
}
@@ -3034,12 +3042,15 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssa_emit_store(proc, ssa_emit_struct_gep(proc, slice, v_two32, t_int), len);
}
+ if (args[0]->kind == ssaValue_Constant) {
+ auto *c = &args[0]->Constant;
+ gb_printf_err("%s %d\n", type_to_string(c->type), c->value.kind);
+ }
arg_count = type->param_count;
args[arg_count-1] = ssa_emit_load(proc, slice);
}
-
return ssa_emit_call(proc, value, args, arg_count);
case_end;