This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: GCC 4.1: Problem with old-loop and REG_EQUAL notes
- From: Eric Botcazou <ebotcazou at libertysurf dot fr>
- To: Andreas Krebbel <Andreas dot Krebbel at de dot ibm dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Thu, 3 May 2007 22:02:43 +0200
- Subject: Re: GCC 4.1: Problem with old-loop and REG_EQUAL notes
- References: <20070503123322.GA3309@blc4eb430604175.ibm.com>
> After gcse1 a loop body contains the following two insns. Note that gcse
> has already replaced r974 with r1218 in insn 1743 and has attached a
> REG_EQUAL note. Insn 2308 stays as a dead store - maybe thats what confuses
> the loop optimizer.
>
> (insn 2308 1740 1743 111 (set (reg/f:DI 974)
> (const:DI (unspec:DI [
> (symbol_ref:DI ("local") <var_decl 0x200004c9dc0
> local>) ] 110))) 49 {*movdi_larl} (nil)
> (expr_list:REG_EQUAL (const:DI (unspec:DI [
> (symbol_ref:DI ("local") <var_decl 0x200004c9dc0
> local>) ] 110))
> (nil)))
>
> (insn 1743 2308 1744 111 (set (reg/f:DI 973)
> (mem/u/c:DI (reg/f:DI 1218) [0 S8 A8])) 51 {*movdi_64} (nil)
> (expr_list:REG_EQUAL (mem/u/c:DI (reg/f:DI 974) [0 S8 A8])
> (nil)))
The note doesn't look particularly helpful in this case, given that gcse
has replaced r974 with r1218 in the insn. How is it created?
> The loop optmizer decided to load the src of insn 1743 into a new pseudo
> (the insert_temp flag is set) resulting in:
>
> (insn 2395 2394 2397 108 (set (reg:DI 1229)
> (mem/u/c:DI (reg/f:DI 1218) [0 S8 A8])) -1 (nil)
> (expr_list:REG_EQUAL (mem/u/c:DI (reg/f:DI 974) [0 S8 A8])
> (nil)))
>
> before loop start and insn 2308 still in the loop body:
>
> (insn 2308 1740 2396 110 (set (reg/f:DI 974)
> (const:DI (unspec:DI [
> (symbol_ref:DI ("local") <var_decl 0x200004c9dc0
> local>) ] 110))) -1 (nil)
> (expr_list:REG_EQUAL (const:DI (unspec:DI [
> (symbol_ref:DI ("local") <var_decl 0x200004c9dc0
> local>) ] 110))
> (nil)))
Is (reg/f:DI 974) loop invariant or only conditionally invariant?
--
Eric Botcazou