Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-15 Thread Jeff Law

On 02/15/2016 05:38 AM, Bernd Schmidt wrote:

On 02/12/2016 08:43 AM, Jeff Law wrote:

On 02/11/2016 06:28 PM, Bernd Schmidt wrote:



PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single
SET,
also take other side effects into account.


OK for the trunk.


Branches too? The problem obviously exists everywhere.

Anywhere you deem appropriate.

jeff


Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-15 Thread Bernd Schmidt

On 02/12/2016 08:43 AM, Jeff Law wrote:

On 02/11/2016 06:28 PM, Bernd Schmidt wrote:



PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single SET,
also take other side effects into account.


OK for the trunk.


Branches too? The problem obviously exists everywhere.


Bernd



Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-12 Thread Andre Vieira (lists)

On 12/02/16 07:43, Jeff Law wrote:

On 02/11/2016 06:28 PM, Bernd Schmidt wrote:

This seems fairly straightforward:

(insn 213 455 216 6 (set (reg:SI 266)
 (mem/u/c:SI (post_inc:SI (reg/f:SI 267)) [4  S4 A32])) 748
{*thumb1_movsi_insn}
  (expr_list:REG_EQUAL (const_int -1044200508 [0xc1c2c3c4])
 (expr_list:REG_INC (reg/f:SI 267)
 (nil

We don't notice that the SET_SRC has a side effect, record the insn as
an equivalencing one, and later remove it because we replaced the reg
with the constant everywhere. Thus, the increment doesn't take place.

Fixed as follows. Bootstrapped and tested on x86_64-linux. Also compared
before/after dumps for the testcase with arm-elf. Ok?


Bernd

equiv-inc.diff


PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single SET,
also take other side effects into account.

Also note that the reporter says gcc-4.9 didn't have this problem, so
there's a reasonable chance this is a latent regression exposed by
codegen changes prior to IRA.


OK for the trunk.

Jeff

I tested it for the particular testcase it was failing for cortex-m0 and 
it fixed it. Ill fire up a regression run next.


Cheers,
Andre


Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-12 Thread Jiong Wang



On 12/02/16 07:43, Jeff Law wrote:

On 02/11/2016 06:28 PM, Bernd Schmidt wrote:

This seems fairly straightforward:

(insn 213 455 216 6 (set (reg:SI 266)
 (mem/u/c:SI (post_inc:SI (reg/f:SI 267)) [4  S4 A32])) 748
{*thumb1_movsi_insn}
  (expr_list:REG_EQUAL (const_int -1044200508 [0xc1c2c3c4])
 (expr_list:REG_INC (reg/f:SI 267)
 (nil

We don't notice that the SET_SRC has a side effect, record the insn as
an equivalencing one, and later remove it because we replaced the reg
with the constant everywhere. Thus, the increment doesn't take place.

Fixed as follows. Bootstrapped and tested on x86_64-linux. Also compared
before/after dumps for the testcase with arm-elf. Ok?


Bernd

equiv-inc.diff


PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single 
SET,

also take other side effects into account.


Will it be better that we don't remove the insn if it has side-effect 
instead of don't record the equiv?


This can offer more equiv for later rtl optimization?



Also note that the reporter says gcc-4.9 didn't have this problem, so 
there's a reasonable chance this is a latent regression exposed by 
codegen changes prior to IRA.



OK for the trunk.

Jeff





Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-12 Thread Jiong Wang



On 12/02/16 13:33, Bernd Schmidt wrote:

On 02/12/2016 02:18 PM, Jiong Wang wrote:


PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single
SET,
also take other side effects into account.


Will it be better that we don't remove the insn if it has side-effect
instead of don't record the equiv?

This can offer more equiv for later rtl optimization?


It's an option I considered, but for stage4 this seems like the safest 
fix. It's not like this is a very common problem, the effect should be 
negligible.


I see, thanks for the explanation.

From my quick test, this patch actually generate code slightly better.

The interesting thing I found is if we still initialize the equiv, then
a later use in the testcase will be rematerialized, but the equiv
constant -1044200508 is forced into memory, thus the rematerialization
is a load from memory. Instead, if we don't initialize the equiv then
the register contains the reusable value will be kept alive.




Bernd





Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-12 Thread Bernd Schmidt

On 02/12/2016 02:18 PM, Jiong Wang wrote:


PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single
SET,
also take other side effects into account.


Will it be better that we don't remove the insn if it has side-effect
instead of don't record the equiv?

This can offer more equiv for later rtl optimization?


It's an option I considered, but for stage4 this seems like the safest 
fix. It's not like this is a very common problem, the effect should be 
negligible.



Bernd



Re: Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-11 Thread Jeff Law

On 02/11/2016 06:28 PM, Bernd Schmidt wrote:

This seems fairly straightforward:

(insn 213 455 216 6 (set (reg:SI 266)
 (mem/u/c:SI (post_inc:SI (reg/f:SI 267)) [4  S4 A32])) 748
{*thumb1_movsi_insn}
  (expr_list:REG_EQUAL (const_int -1044200508 [0xc1c2c3c4])
 (expr_list:REG_INC (reg/f:SI 267)
 (nil

We don't notice that the SET_SRC has a side effect, record the insn as
an equivalencing one, and later remove it because we replaced the reg
with the constant everywhere. Thus, the increment doesn't take place.

Fixed as follows. Bootstrapped and tested on x86_64-linux. Also compared
before/after dumps for the testcase with arm-elf. Ok?


Bernd

equiv-inc.diff


PR rtl-optimization/69752
* ira.c (update_equiv_regs): When looking for more than a single SET,
also take other side effects into account.
Also note that the reporter says gcc-4.9 didn't have this problem, so 
there's a reasonable chance this is a latent regression exposed by 
codegen changes prior to IRA.



OK for the trunk.

Jeff



Fix PR69752, insn with REG_INC being removed as equiv_init insn

2016-02-11 Thread Bernd Schmidt

This seems fairly straightforward:

(insn 213 455 216 6 (set (reg:SI 266)
(mem/u/c:SI (post_inc:SI (reg/f:SI 267)) [4  S4 A32])) 748 
{*thumb1_movsi_insn}

 (expr_list:REG_EQUAL (const_int -1044200508 [0xc1c2c3c4])
(expr_list:REG_INC (reg/f:SI 267)
(nil

We don't notice that the SET_SRC has a side effect, record the insn as 
an equivalencing one, and later remove it because we replaced the reg 
with the constant everywhere. Thus, the increment doesn't take place.


Fixed as follows. Bootstrapped and tested on x86_64-linux. Also compared 
before/after dumps for the testcase with arm-elf. Ok?



Bernd
	PR rtl-optimization/69752
	* ira.c (update_equiv_regs): When looking for more than a single SET,
	also take other side effects into account.

Index: gcc/ira.c
===
--- gcc/ira.c	(revision 233364)
+++ gcc/ira.c	(working copy)
@@ -3392,7 +3392,8 @@ update_equiv_regs (void)
 
 	  /* If this insn contains more (or less) than a single SET,
 	 only mark all destinations as having no known equivalence.  */
-	  if (set == NULL_RTX)
+	  if (set == NULL_RTX
+	  || side_effects_p (SET_SRC (set)))
 	{
 	  note_stores (PATTERN (insn), no_equiv, NULL);
 	  continue;