- bitset_set(env->non_address_nodes, get_irn_idx(node));
-
- if(is_Load(node)) {
- ir_node *ptr = get_Load_ptr(node);
- ir_node *mem = get_Load_mem(node);
-
- mark_non_address_nodes(env, mem);
- (void) ptr;
- } else if(is_Store(node)) {
- ir_node *val = get_Store_value(node);
- ir_node *ptr = get_Store_ptr(node);
- ir_node *mem = get_Store_mem(node);
-
- mark_non_address_nodes(env, val);
- mark_non_address_nodes(env, mem);
- (void) ptr;
- } else {
- int i;
- int arity = get_irn_arity(node);
+ int i, arity;
+ ir_node *ptr;
+ ir_node *mem;
+ ir_node *val;
+ ir_node *left;
+ ir_node *right;
+ (void) env;
+
+ switch(get_irn_opcode(node)) {
+ case iro_Load:
+ ptr = get_Load_ptr(node);
+ mem = get_Load_mem(node);
+
+ bitset_set(non_address_mode_nodes, get_irn_idx(mem));
+ break;
+
+ case iro_Store:
+ val = get_Store_value(node);
+ ptr = get_Store_ptr(node);
+ mem = get_Store_mem(node);
+
+ bitset_set(non_address_mode_nodes, get_irn_idx(val));
+ bitset_set(non_address_mode_nodes, get_irn_idx(mem));
+ break;
+
+ case iro_Add:
+ left = get_Add_left(node);
+ right = get_Add_right(node);
+ /* if we can do source address mode then we will never fold the add
+ * into address mode */
+ if(is_immediate_simple(right) ||
+ (!use_source_address_mode(get_nodes_block(node), left, right)
+ && !use_source_address_mode(get_nodes_block(node), right, left))) {
+ break;
+ }
+ bitset_set(non_address_mode_nodes, get_irn_idx(node));
+ /* fallthrough */
+
+ default:
+ arity = get_irn_arity(node);