[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:
parent
b17dc4d4e4
commit
3256673f86
|
@ -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
|
||||
|
|
12
gcc/ifcvt.c
12
gcc/ifcvt.c
|
@ -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. */
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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" } } */
|
Loading…
Reference in New Issue