fix array_access in ast2firm
authorMatthias Braun <matze@braunis.de>
Mon, 26 Nov 2007 19:38:54 +0000 (19:38 +0000)
committerMatthias Braun <matze@braunis.de>
Mon, 26 Nov 2007 19:38:54 +0000 (19:38 +0000)
[r18542]

ast2firm.c

index 9166ff6..7405cb8 100644 (file)
@@ -1356,25 +1356,16 @@ static ir_node *binary_expression_to_firm(const binary_expression_t *expression)
 
 static ir_node *array_access_addr(const array_access_expression_t *expression)
 {
-       dbg_info *dbgi = get_dbg_info(&expression->expression.source_position);
-       ir_node  *base_addr;
-       ir_node  *offset;
-
-       type_t *type_left  = skip_typeref(expression->array_ref->datatype);
-       type_t *type_right = skip_typeref(expression->index->datatype);
+       dbg_info *dbgi      = get_dbg_info(&expression->expression.source_position);
+       ir_node  *base_addr = expression_to_firm(expression->array_ref);
+       ir_node  *offset    = expression_to_firm(expression->index);
+       offset              = create_conv(dbgi, offset, mode_Iu);
 
-       if(type_left->type == TYPE_POINTER || type_left->type == TYPE_ARRAY) {
-               base_addr = expression_to_firm(expression->array_ref);
-               offset    = expression_to_firm(expression->index);
-       } else {
-               assert(type_right->type == TYPE_POINTER
-                               || type_right->type == TYPE_ARRAY);
-               base_addr = expression_to_firm(expression->index);
-               offset    = expression_to_firm(expression->array_ref);
-       }
-       offset = create_conv(dbgi, offset, mode_Iu);
+       type_t *ref_type = skip_typeref(expression->array_ref->datatype);
+       assert(is_type_pointer(ref_type));
+       pointer_type_t *pointer_type = (pointer_type_t*) ref_type;
 
-       unsigned elem_size       = get_type_size(expression->expression.datatype);
+       unsigned elem_size       = get_type_size(pointer_type->points_to);
        ir_node *elem_size_const = new_Const_long(mode_Iu, elem_size);
        ir_node *real_offset     = new_d_Mul(dbgi, offset, elem_size_const,
                                             mode_Iu);