This patch saves the number of created conditional moves by
noce_convert_multiple_sets in the IF_INFO struct. This may be used by
the backend to easier decide whether to accept a generated sequence or
not.
---
gcc/ifcvt.c | 10 ++++++++--
gcc/ifcvt.h | 4 ++++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index e0c9522057a..b80dbc43d83 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -3247,9 +3247,14 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
/* Actually emit the sequence if it isn't too expensive. */
rtx_insn *seq = get_insns ();
+ if_info->transform_name = "noce_convert_multiple_sets";
+ if_info->created_cmovs = count;
+
if (!targetm.noce_conversion_profitable_p (seq, if_info))
{
end_sequence ();
+ if_info->transform_name = "";
+ if_info->created_cmovs = 0;
return FALSE;
}
@@ -3296,7 +3301,7 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
}
num_updated_if_blocks++;
- if_info->transform_name = "noce_convert_multiple_sets";
+
return TRUE;
}
@@ -4060,7 +4065,8 @@ noce_find_if_block (basic_block test_bb, edge then_edge,
edge else_edge,
and jump_insns are always given a cost of 1 by seq_cost, so treat
both instructions as having cost COSTS_N_INSNS (1). */
if_info.original_cost = COSTS_N_INSNS (2);
-
+ if_info.transform_name = "";
+ if_info.created_cmovs = 0;
/* Do the real work. */
diff --git a/gcc/ifcvt.h b/gcc/ifcvt.h
index 153ad961b2c..130559c0911 100644
--- a/gcc/ifcvt.h
+++ b/gcc/ifcvt.h
@@ -108,6 +108,10 @@ struct noce_if_info
/* The name of the noce transform that succeeded in if-converting
this structure. Used for debugging. */
const char *transform_name;
+
+ /* The number of created conditional moves in case we convert multiple
+ sets. */
+ unsigned int created_cmovs;
};
#endif /* GCC_IFCVT_H */
--
2.17.0