[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> 2016-06-15 Richard Biener <rguenther@suse.de>
* tree-vect-stmts.c (vectorizable_store): Remove strided grouped * 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); rtx src = SET_SRC (set);
/* We can possibly relax this, but for now only handle REG to REG /* We can possibly relax this, but for now only handle REG to REG
moves. This avoids any issues that might come from introducing (including subreg) moves. This avoids any issues that might come
loads/stores that might violate data-race-freedom guarantees. */ from introducing loads/stores that might violate data-race-freedom
if (!(REG_P (src) && REG_P (dest))) 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; return false;
/* Destination must be appropriate for a conditional write. */ /* 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> 2016-06-15 Richard Biener <rguenther@suse.de>
* gcc.dg/vect/slp-45.c: New testcase. * 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" } } */