From ef5206b53d06465ef10cb3afac435f9eec17db01 Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=B6tz=20Lindenmaier?= Date: Mon, 12 Mar 2001 16:03:34 +0000 Subject: [PATCH] explored why cse makes if_while_example abort: It's the endless loop [r127] --- testprograms/if_else_example.c | 2 +- testprograms/if_example.c | 1 + testprograms/if_while_example.c | 19 +---- testprograms/oo_program_example.c | 5 +- testprograms/while_example.c | 126 ++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 testprograms/while_example.c diff --git a/testprograms/if_else_example.c b/testprograms/if_else_example.c index 4a2325d9a..ab1990749 100644 --- a/testprograms/if_else_example.c +++ b/testprograms/if_else_example.c @@ -122,7 +122,7 @@ int main(int argc, char **argv) printf("\nOptimizing ...\n"); local_optimize_graph(irg); - //dead_node_elimination(irg); + dead_node_elimination(irg); /* verify the graph */ irg_vrfy(irg); diff --git a/testprograms/if_example.c b/testprograms/if_example.c index 672f08d50..c93abed9c 100644 --- a/testprograms/if_example.c +++ b/testprograms/if_example.c @@ -104,6 +104,7 @@ main(void) printf("Optimizing ...\n"); + local_optimize_graph(irg); dead_node_elimination(irg); /* verify the graph */ diff --git a/testprograms/if_while_example.c b/testprograms/if_while_example.c index 8078f419f..33991b6e0 100644 --- a/testprograms/if_while_example.c +++ b/testprograms/if_while_example.c @@ -20,7 +20,7 @@ *** if (0 == 0) *** { a = 2; } *** -*** while (0 == 0) loop { +*** while (0 == 0) loop { // 0 == 0 aborts libfirm: Bad pred of Endblock *** h = a; *** a = b; *** b = h; @@ -42,10 +42,11 @@ main(void) printf("\nCreating an IR graph: IF_WHILE_EXAMPLE...\n"); init_firm (); + turn_of_edge_labels(); set_optimize(1); set_opt_constant_folding(0); /* so that the stupid tests are not optimized. */ - /* if 1 aborts ????? @@@ */ + /* if optimized no path to End remains!! */ set_opt_cse(1); set_opt_dead_node_elimination (1); @@ -67,22 +68,10 @@ main(void) mature_block (get_irg_current_block(irg)); /* Generate a conditional branch */ - x = new_Cond (new_Proj(new_Cmp(new_Const (mode_I, tarval_from_long (mode_i, 0)), - new_Const (mode_I, tarval_from_long (mode_i, 0))), - mode_b, Eq)); - f = new_Proj (x, mode_X, 0); - t = new_Proj (x, mode_X, 1); - - /* generate and fill the then block */ - r = new_immBlock (); - add_in_edge (r, t); - set_value (0, new_Const (mode_I, tarval_from_long (mode_i, 2))); - mature_block (r); - x = new_Jmp (); + x = new_Jmp(); /* generate the fall through block and add all cfg edges */ r = new_immBlock (); - add_in_edge (r, f); add_in_edge (r, x); mature_block (r); x = new_Jmp (); diff --git a/testprograms/oo_program_example.c b/testprograms/oo_program_example.c index 0f5ff93dd..852dd6663 100644 --- a/testprograms/oo_program_example.c +++ b/testprograms/oo_program_example.c @@ -200,9 +200,10 @@ main(void) irg_vrfy(main_irg); printf("Optimizing ...\n"); - for (i = 0; i < get_irp_n_irgs(); i++) + for (i = 0; i < get_irp_n_irgs(); i++) { + local_optimize_graph(get_irp_irg(i)); dead_node_elimination(get_irp_irg(i)); - + } /****************************************************************************/ printf("Dumping graphs of all procedures.\n"); diff --git a/testprograms/while_example.c b/testprograms/while_example.c new file mode 100644 index 000000000..e931c3560 --- /dev/null +++ b/testprograms/while_example.c @@ -0,0 +1,126 @@ +/* Copyright (C) 2001 by Universitaet Karlsruhe +** All rights reserved. +** +** Authors: Goetz Lindenmaier +** +** testprogram. +*/ + +# include "irdump.h" +# include "firm.h" + +/** +*** This file constructs the ir for the following pseudo-program: +*** +*** main(int a) { // pos 0 +*** int b = 1; // pos 1 +*** int h; // pos 2 +*** +*** while (0 == 2) loop { // 0 == 0 will abort libfirm!! +*** h = a; +*** a = b; +*** b = h; +*** } +*** +*** return a-b; +*** } +**/ + +int +main(void) +{ + type_primitive *prim_t_int; + ir_graph *irg; + type_class *owner; + type_method *proc_main; + entity *ent; + ir_node *b, *x, *r, *t, *f; + + printf("\nCreating an IR graph: WHILE_EXAMPLE...\n"); + + init_firm (); + //turn_of_edge_labels(); + + set_optimize(1); + set_opt_constant_folding(1); + set_opt_cse(1); + set_opt_dead_node_elimination (1); + + prim_t_int = new_type_primitive(id_from_str ("int", 3), mode_i); + +#define METHODNAME "main" +#define NRARGS 1 +#define NRES 0 + + proc_main = new_type_method(id_from_str(METHODNAME, strlen(METHODNAME)), + NRARGS, NRES); + set_method_param_type(proc_main, 0, (type *)prim_t_int); + + owner = new_type_class (id_from_str ("WHILE_EXAMPLE", 16)); + ent = new_entity ((type *)owner, id_from_str ("main", 4), (type *)proc_main); + + /* Generates start and end blocks and nodes and a first, initial block */ + irg = new_ir_graph (ent, 4); + + /* Generate two constants */ + set_value (0, new_Proj(get_irg_args(irg), mode_I, 0)); + set_value (1, new_Const (mode_I, tarval_from_long (mode_I, 1))); + x = new_Jmp(); + mature_block (get_irg_current_block(irg)); + + /* generate a block for the loop header and the conditional branch */ + r = new_immBlock (); + add_in_edge (r, x); + x = new_Cond (new_Proj(new_Cmp(new_Const (mode_I, tarval_from_long (mode_i, 0)), + new_Const (mode_I, tarval_from_long (mode_i, 2))), + mode_b, Eq)); + f = new_Proj (x, mode_X, 0); + t = new_Proj (x, mode_X, 1); + + /* generate the block for the loop body */ + b = new_immBlock (); + add_in_edge (b, t); + x = new_Jmp (); + add_in_edge (r, x); + + /* the code in the loop body, + as we are dealing with local variables only the dataflow edges + are manipulated */ + set_value (2, get_value (0, mode_I)); + set_value (0, get_value (1, mode_I)); + set_value (1, get_value (2, mode_I)); + mature_block (b); + mature_block (r); + + /* generate the return block */ + r = new_immBlock (); + add_in_edge (r, f); + mature_block (r); + + { + ir_node *in[1]; + in[0] = new_Sub (get_value (0, mode_I), get_value (1, mode_I), mode_I); + + x = new_Return (get_store (), 1, in); + } + + /* finalize the end block generated in new_ir_graph() */ + add_in_edge (get_irg_end_block(irg), x); + mature_block (get_irg_end_block(irg)); + + printf("Optimizing ...\n"); + + local_optimize_graph(irg), + dead_node_elimination(irg); + + /* verify the graph */ + irg_vrfy(irg); + + /* output the vcg file */ + printf("Done building the graph. Dumping it.\n"); + dump_ir_block_graph (irg); + printf("Use xvcg to view this graph:\n"); + printf("/ben/goetz/bin/xvcg GRAPHNAME\n\n"); + + return (0); +} -- 2.20.1