1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Christian Schaefer, Goetz Lindenmaier
17 * a dead block / unreachable code.
21 *** This file constructs a control flow of following shape:
28 *** Block1 Block2 deadBlock
35 *** This is a program as, e.g.,
38 *** { Jmp label1; } // happens anyways
40 *** { Jmp label1; } // happens anyways
47 int main(int argc, char **argv)
49 ir_graph *irg; /* this variable contains the irgraph */
50 type *owner; /* the class in which this method is defined */
51 type *proc_main; /* type information for the method main */
53 entity *ent; /* represents this method as entity of owner */
54 ir_node *c1, *c2, *cond, *f, *t, *endBlock, *Block1, *jmp, *Block2,
60 /*** Make basic type information for primitive type int. ***/
61 prim_t_int = new_type_primitive(id_from_str ("int", 3), mode_i);
63 /* FIRM was designed for oo languages where all methods belong to a class.
64 * For imperative languages like C we view a file as a large class containing
65 * all functions as methods in this file.
66 * Therefore we define a class "empty" according to the file name
67 * with a method main as an entity.
69 #define CLASSNAME "DEAD_BLOCK"
70 #define METHODNAME "main"
73 printf("\nCreating an IR graph: %s...\n", CLASSNAME);
75 owner = new_type_class (id_from_str (CLASSNAME, strlen(CLASSNAME)));
76 proc_main = new_type_method(id_from_str(METHODNAME, strlen(METHODNAME)),
78 set_method_res_type(proc_main, 0, prim_t_int);
79 ent = new_entity (owner,
80 id_from_str (METHODNAME, strlen(METHODNAME)),
83 #define NUM_OF_LOCAL_VARS 1
85 irg = new_ir_graph (ent, NUM_OF_LOCAL_VARS);
87 /* to make a condition */
88 c1 = new_Const (mode_i, tarval_from_long (mode_i, 1));
89 c2 = new_Const (mode_i, tarval_from_long (mode_i, 2));
92 cond = new_Cond(new_Proj(new_Cmp(c1, c2), mode_b, Eq));
93 f = new_Proj(cond, mode_X, 0);
94 t = new_Proj(cond, mode_X, 1);
95 mature_block(get_irg_current_block(irg));
97 /* end block to add jmps */
98 endBlock = new_immBlock();
101 Block1 = new_immBlock();
102 add_in_edge(Block1, t);
103 mature_block(Block1);
105 add_in_edge(endBlock, jmp);
108 Block2 = new_immBlock();
109 add_in_edge(Block2, f);
110 mature_block(Block2);
112 add_in_edge(endBlock, jmp);
115 deadBlock = new_immBlock();
116 mature_block(deadBlock);
118 add_in_edge(endBlock, jmp);
120 /* finish end block */
121 switch_block(endBlock);
124 in[0] = get_value(0, mode_i);
126 x = new_Return (get_store(), 1, in);
128 mature_block (get_irg_current_block(irg));
130 add_in_edge (get_irg_end_block(irg), x);
131 mature_block (get_irg_end_block(irg));
135 printf("Optimizing ...\n");
136 local_optimize_graph (irg);
137 dead_node_elimination (irg);
139 /* verify the graph */
142 printf("Dumping the graph and a control flow graph.\n");
143 dump_ir_block_graph (irg);
145 printf("Use xvcg to view these graphs:\n");
146 printf("/ben/goetz/bin/xvcg GRAPHNAME\n\n");