[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 --- Comment #7 from Segher Boessenkool --- Author: segher Date: Mon Mar 20 23:08:16 2017 New Revision: 246297 URL: https://gcc.gnu.org/viewcvs?rev=246297=gcc=rev Log: combine: Fix 79910 If the dest of an I0 or I1 is used in an insn before I2, as can happen in various uncommon cases, and we manage to do the combination, the set is moved to I2, which is wrong. Don't allow combining the insns in this case. PR rtl-optimization/79910 * combine.c (can_combine_p): Do not allow combining an I0 or I1 if its dest is used by an insn before I2 (other than the combined insns themselves, which are properly handled already). Modified: trunk/gcc/ChangeLog trunk/gcc/combine.c
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 Jeffrey A. Law changed: What|Removed |Added Status|NEW |RESOLVED CC||law at redhat dot com Resolution|--- |FIXED --- Comment #6 from Jeffrey A. Law --- Fixed by Bernd's patch on the trunk.
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 --- Comment #5 from Jeffrey A. Law --- Author: law Date: Fri Mar 17 15:10:13 2017 New Revision: 246226 URL: https://gcc.gnu.org/viewcvs?rev=246226=gcc=rev Log: PR rtl-optimization/79910 * combine.c (record_used_regs): New static function. (try_combine): Handle situations where there is an additional instruction between I2 and I3 which needs to have a LOG_LINK updated. PR rtl-optimization/79910 * gcc.dg/torture/pr79910.c: New test. Added: trunk/gcc/testsuite/gcc.dg/torture/pr79910.c Modified: trunk/gcc/ChangeLog trunk/gcc/combine.c trunk/gcc/testsuite/ChangeLog
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 --- Comment #4 from Bernd Schmidt --- (In reply to Zdenek Sojka from comment #0) > Trying 27, 28 -> 33: > ... > Successfully matched this instruction: > (set (reg:QI 128 [ _6 ]) > (plus:QI (subreg:QI (reg:DI 111 [ p1D.1798 ]) 0) > (subreg:QI (reg/v:DI 100 [ bD.1802 ]) 0))) > Successfully matched this instruction: > (set (reg:QI 123 [ p1D.1798 ]) > (plus:QI (reg:QI 128 [ _6 ]) > (subreg:QI (reg:DI 92 [ _6 ]) 0))) > allowing combination of insns 27, 28 and 33 It looks like this combination introduces a new use of reg 100 into insn 28 (it was previously used in insn 33). Thus, it becomes the first use of reg 100, but the other use in insn 32 still has the LOG_LINKS pointer, allowing the second combination which makes the code incorrect. This looks like a pretty serious hole in the combiner. Not sure yet how best to fix it.
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 Bernd Schmidt changed: What|Removed |Added Assignee|unassigned at gcc dot gnu.org |bernds at gcc dot gnu.org --- Comment #3 from Bernd Schmidt --- Investigating.
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 Martin Liška changed: What|Removed |Added CC||bernds at gcc dot gnu.org, ||marxin at gcc dot gnu.org --- Comment #2 from Martin Liška --- Started with r244817: PR rtl-optimization/71724 * combine.c (if_then_else_cond): Look for situations where it is beneficial to undo the work of one of the recursive calls.
[Bug rtl-optimization/79910] [7 Regression] wrong code with -O -fweb
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79910 Richard Biener changed: What|Removed |Added Priority|P3 |P1 Status|UNCONFIRMED |NEW Last reconfirmed||2017-03-06 Known to work||6.3.1 Target Milestone|--- |7.0 Ever confirmed|0 |1 --- Comment #1 from Richard Biener --- Confirmed (probably latent).