functions with compound parameters are never const in firm
authorMatthias Braun <matze@braunis.de>
Tue, 6 Sep 2011 15:01:41 +0000 (17:01 +0200)
committerMatthias Braun <matze@braunis.de>
Tue, 6 Sep 2011 15:02:37 +0000 (17:02 +0200)
This should fix fehler200.c

ir/opt/funccall.c

index 256e32c..ef5c901 100644 (file)
@@ -508,8 +508,23 @@ static mtp_additional_properties check_const_or_pure_function(ir_graph *irg, int
 {
        ir_node *end, *endbl;
        int j;
+       ir_entity *entity   = get_irg_entity(irg);
+       ir_type   *type     = get_entity_type(entity);
+       size_t     n_params = get_method_n_params(type);
+       size_t     i;
+       mtp_additional_properties may_be_const = mtp_property_const;
        mtp_additional_properties prop = get_irg_additional_properties(irg);
 
+       /* libfirm handles aggregate parameters by passing around pointers to
+        * stuff in memory, so if we have compound parameters we are never const */
+       for (i = 0; i < n_params; ++i) {
+               ir_type *param = get_method_param_type(type, i);
+               if (is_compound_type(param)) {
+                       prop        &= ~mtp_property_const;
+                       may_be_const = mtp_no_property;
+               }
+       }
+
        if (prop & mtp_property_const) {
                /* already marked as a const function */
                return mtp_property_const;
@@ -533,7 +548,7 @@ static mtp_additional_properties check_const_or_pure_function(ir_graph *irg, int
 
        end   = get_irg_end(irg);
        endbl = get_nodes_block(end);
-       prop  = mtp_property_const;
+       prop  = may_be_const;
 
        ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
        inc_irg_visited(irg);