Let dfs() discover only memory nodes
[libfirm] / ir / lower / lower_calls.c
index aabb42c..d77b69f 100644 (file)
@@ -28,6 +28,7 @@
 #include "config.h"
 #endif
 
+#include "lowering.h"
 #include "irprog_t.h"
 #include "irnode_t.h"
 #include "type_t.h"
 #include "ircons.h"
 #include "irgmod.h"
 #include "irgwalk.h"
-#include "typewalk.h"
-#include "lower_calls.h"
-#include "return.h"
 #include "irtools.h"
+#include "iroptimize.h"
 #include "array.h"
 #include "pmap.h"
 #include "xmalloc.h"
@@ -86,6 +85,7 @@ static ir_type *create_modified_mtd_type(const lower_params_t *lp, ir_type *mtp)
   int n_ress, n_params, nn_ress, nn_params, i, first_variadic;
   ident *id;
   add_hidden hidden_params;
+  int        changed = 0;
   variadicity var;
 
   if (is_lowered_type(mtp)) {
@@ -130,6 +130,7 @@ static ir_type *create_modified_mtd_type(const lower_params_t *lp, ir_type *mtp)
              address will be transmitted as a hidden parameter. */
           ptr_tp = lp->find_pointer_type(res_tp, get_modeP_data(), lp->def_ptr_alignment);
           params[nn_params++] = ptr_tp;
+          changed++;
           if (lp->flags & LF_RETURN_HIDDEN)
             results[nn_ress++] = ptr_tp;
         }
@@ -178,6 +179,10 @@ static ir_type *create_modified_mtd_type(const lower_params_t *lp, ir_type *mtp)
     set_method_first_variadic_param_index(lowered, first_variadic);
 
   /* associate the lowered type with the original one for easier access */
+  if(changed) {
+         set_method_calling_convention(lowered,
+                         get_method_calling_convention(mtp) | cc_compound_ret);
+  }
   set_lowered_type(mtp, lowered);
 
   return lowered;