Commit 3256673f by Kyrylo Tkachov Committed by Kyrylo Tkachov

[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
parent b17dc4d4
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
......
...@@ -3339,9 +3339,15 @@ bb_ok_for_noce_convert_multiple_sets (basic_block test_bb, ...@@ -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. */
......
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.
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment