This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [3.3 PATCH] Fix PR optimization/11841
- From: Gabriel Dos Reis <gdr at integrable-solutions dot net>
- To: Eric Botcazou <ebotcazou at libertysurf dot fr>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: 16 May 2004 17:42:29 +0200
- Subject: Re: [3.3 PATCH] Fix PR optimization/11841
- Organization: Integrable Solutions
- References: <200404290922.22367.ebotcazou@libertysurf.fr>
Eric Botcazou <ebotcazou@libertysurf.fr> writes:
| Hi,
|
| This is a regression present on 3.3 branch at -O2 -funroll-loops on x86,
| caused by a bad interaction between GCSE and the (old) unroller.
|
| GCSE does a somewhat awful job in that we end up with only the following 2
| insns referencing pseudo 63:
|
| (insn 118 78 36 2 (nil) (set (reg:SI 63)
| (reg:SI 69)) 38 {*movsi_1} (nil)
| (expr_list:REG_EQUAL (mem/f:SI (symbol_ref:SI ("i")) [3 i+0 S4 A32])
| (nil))
|
| (insn 54 121 98 3 0x401772ec (set (mem/f:SI (symbol_ref:SI ("i")) [3 i+0 S4
| A32])
| (reg:SI 66)) 38 {*movsi_1} (nil)
| (expr_list:REG_EQUAL (plus:SI (reg:SI 63)
| (const_int 1 [0x1]))
| (nil)))
|
|
| AFAICS, the RTL is correct at this point, albeit clearly pathological. Then
| the unroller wants to unroll the inner loop and marks pseudo 63 as local to
| the loop, while the REG_EQUAL note is outside the loop. So pseudo 63 is
| replaced by per-unrolled-loop bivs and we end up with a dangling REG_EQUAL
| note. It is then rematerialized by CSE2 and all hell breaks loose.
|
| The proposed fix is to teach the unroller to look at notes when deciding
| whether a pseudo is local. Bootstrapped/regtested on i586-redhat-linux-gnu
| (3.3 branch). OK for that branch?
I was waiting for the outcome of your conversation with Richard G.
It looks like that this patch won't resolve optimization/13653. But
this is already a good step forward. So, yes, this patch is OK for
gcc-3_3-branch.
-- Gaby