diff options
author | liuhongt <hongtao.liu@intel.com> | 2021-12-20 11:13:38 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2022-01-07 23:09:05 +0800 |
commit | e7a7dbb5ca5dd69689f1a462ba7620180acfe8b0 (patch) | |
tree | d1bbc118d8fb30d373851b30482656bd5aaa484f /gcc/fwprop.c | |
parent | 659f8161f61d3f75c3a47cf646147e8f7b4dcb34 (diff) | |
download | gcc-e7a7dbb5ca5dd69689f1a462ba7620180acfe8b0.zip gcc-e7a7dbb5ca5dd69689f1a462ba7620180acfe8b0.tar.gz gcc-e7a7dbb5ca5dd69689f1a462ba7620180acfe8b0.tar.bz2 |
Allow propagations from inner loop to outer loop.
NULL is considered as an outer loop of any other loop.
gcc/ChangeLog:
PR rtl-optimization/103750
* fwprop.c (forward_propagate_into): Allow propagations from
inner loop to outer loop.
gcc/testsuite/ChangeLog:
* g++.target/i386/pr103750-fwprop-1.C: New test.
Diffstat (limited to 'gcc/fwprop.c')
-rw-r--r-- | gcc/fwprop.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/fwprop.c b/gcc/fwprop.c index 2eab4fd..3acb552 100644 --- a/gcc/fwprop.c +++ b/gcc/fwprop.c @@ -866,10 +866,13 @@ forward_propagate_into (use_info *use, bool reg_prop_only = false) rtx src = SET_SRC (def_set); /* Allow propagations into a loop only for reg-to-reg copies, since - replacing one register by another shouldn't increase the cost. */ + replacing one register by another shouldn't increase the cost. + Propagations from inner loop to outer loop should also be ok. */ struct loop *def_loop = def_insn->bb ()->cfg_bb ()->loop_father; struct loop *use_loop = use->bb ()->cfg_bb ()->loop_father; - if ((reg_prop_only || def_loop != use_loop) + if ((reg_prop_only + || (def_loop != use_loop + && !flow_loop_nested_p (use_loop, def_loop))) && (!reg_single_def_p (dest) || !reg_single_def_p (src))) return false; |