[RTL ifcvt] Allow simple register subregs in noce_convert_multiple_sets

* ifcvt.c (bb_ok_for_noce_multiple_sets): Allow simple lowpart
	register subregs in SET_SRC.

	* gcc.target/aarch64/ifcvt_multiple_sets_subreg_1.c: New test.

From-SVN: r237475
This commit is contained in:
Kyrylo Tkachov 2016-06-15 10:08:24 +00:00 committed by Kyrylo Tkachov
parent b17dc4d4e4
commit 3256673f86
4 changed files with 48 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2016-06-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* ifcvt.c (bb_ok_for_noce_multiple_sets): Allow simple lowpart
register subregs in SET_SRC.
2016-06-15 Richard Biener <rguenther@suse.de>
* tree-vect-stmts.c (vectorizable_store): Remove strided grouped

View File

@ -3339,9 +3339,15 @@ bb_ok_for_noce_convert_multiple_sets (basic_block test_bb,
rtx src = SET_SRC (set);
/* We can possibly relax this, but for now only handle REG to REG
moves. This avoids any issues that might come from introducing
loads/stores that might violate data-race-freedom guarantees. */
if (!(REG_P (src) && REG_P (dest)))
(including subreg) moves. This avoids any issues that might come
from introducing loads/stores that might violate data-race-freedom
guarantees. */
if (!REG_P (dest))
return false;
if (!(REG_P (src)
|| (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
&& subreg_lowpart_p (src))))
return false;
/* Destination must be appropriate for a conditional write. */

View File

@ -1,3 +1,7 @@
2016-06-15 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/ifcvt_multiple_sets_subreg_1.c: New test.
2016-06-15 Richard Biener <rguenther@suse.de>
* gcc.dg/vect/slp-45.c: New testcase.

View File

@ -0,0 +1,30 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-rtl-ce1" } */
/* Check that the inner if is transformed into CSELs. */
int
foo (int *x, int *z, int a)
{
int b = 0;
int c = 0;
int d = 0;
int i;
for (i = 0; i < a; i++)
{
if (x[i] < c)
{
b = z[i];
if (c < b)
{
c = b;
d = i;
}
}
}
return c + d;
}
/* { dg-final { scan-rtl-dump "if-conversion succeeded through noce_convert_multiple_sets" "ce1" } } */