diff options
author | Revital Eres <revital.eres@linaro.org> | 2012-01-02 10:54:00 +0000 |
---|---|---|
committer | Revital Eres <revitale@gcc.gnu.org> | 2012-01-02 10:54:00 +0000 |
commit | 8b61e8631a84fb0bc94ba03f04ac949f87402f85 (patch) | |
tree | 36b4795404ad49759db242ac7d9fa7804b2511ab /gcc/ddg.c | |
parent | ba768e1850d730bcd44e674fdf4f4fe252f85182 (diff) | |
download | gcc-8b61e8631a84fb0bc94ba03f04ac949f87402f85.zip gcc-8b61e8631a84fb0bc94ba03f04ac949f87402f85.tar.gz gcc-8b61e8631a84fb0bc94ba03f04ac949f87402f85.tar.bz2 |
SMS: Prevent the creation of reg-moves for definitions with MODE_CC
From-SVN: r182786
Diffstat (limited to 'gcc/ddg.c')
-rw-r--r-- | gcc/ddg.c | 22 |
1 files changed, 21 insertions, 1 deletions
@@ -166,6 +166,24 @@ autoinc_var_is_used_p (rtx def_insn, rtx use_insn) return false; } +/* Return true if one of the definitions in INSN has MODE_CC. Otherwise + return false. */ +static bool +def_has_ccmode_p (rtx insn) +{ + df_ref *def; + + for (def = DF_INSN_DEFS (insn); *def; def++) + { + enum machine_mode mode = GET_MODE (DF_REF_REG (*def)); + + if (GET_MODE_CLASS (mode) == MODE_CC) + return true; + } + + return false; +} + /* Computes the dependence parameters (latency, distance etc.), creates a ddg_edge and adds it to the given DDG. */ static void @@ -202,6 +220,7 @@ create_ddg_dep_from_intra_loop_link (ddg_ptr g, ddg_node_ptr src_node, whose register has multiple defs in the loop. */ if (flag_modulo_sched_allow_regmoves && (t == ANTI_DEP && dt == REG_DEP) + && !def_has_ccmode_p (dest_node->insn) && !autoinc_var_is_used_p (dest_node->insn, src_node->insn)) { rtx set; @@ -335,7 +354,8 @@ add_cross_iteration_register_deps (ddg_ptr g, df_ref last_def) if (DF_REF_ID (last_def) != DF_REF_ID (first_def) || !flag_modulo_sched_allow_regmoves || JUMP_P (use_node->insn) - || autoinc_var_is_used_p (DF_REF_INSN (last_def), use_insn)) + || autoinc_var_is_used_p (DF_REF_INSN (last_def), use_insn) + || def_has_ccmode_p (DF_REF_INSN (last_def))) create_ddg_dep_no_link (g, use_node, first_def_node, ANTI_DEP, REG_DEP, 1); |