On 05/17/2011 09:10 AM, Tom de Vries wrote: > Hi Zdenek, > > I have a patch set for for PR45098. > > 01_object-size-target.patch > 02_pr45098-rtx-cost-set.patch > 03_pr45098-computation-cost.patch > 04_pr45098-iv-init-cost.patch > 05_pr45098-bound-cost.patch > 06_pr45098-bound-cost.test.patch > 07_pr45098-nowrap-limits-iterations.patch > 08_pr45098-nowrap-limits-iterations.test.patch > 09_pr45098-shift-add-cost.patch > 10_pr45098-shift-add-cost.test.patch > > I will sent out the patches individually. >
OK for trunk? Thanks, - Tom
2011-05-05 Tom de Vries <t...@codesourcery.com> PR target/45098 * gcc.target/arm/ivopts-3.c: New test. * gcc.target/arm/ivopts-4.c: New test. * gcc.target/arm/ivopts-5.c: New test. * gcc.dg/tree-ssa/ivopt_infer_2.c: Adapt test. Index: gcc/testsuite/gcc.target/arm/ivopts-3.c =================================================================== --- /dev/null (new file) +++ gcc/testsuite/gcc.target/arm/ivopts-3.c (revision 0) @@ -0,0 +1,20 @@ +/* { dg-do assemble } */ +/* { dg-options "-Os -mthumb -fdump-tree-ivopts -save-temps" } */ + +extern unsigned int foo2 (short*) __attribute__((pure)); + +unsigned int +tr3 (short array[], unsigned int n) +{ + unsigned sum = 0; + unsigned int x; + for (x = 0; x < n; x++) + sum += foo2 (&array[x]); + return sum; +} + +/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */ +/* { dg-final { object-size text <= 30 { target arm_thumb2_ok } } } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ Index: gcc/testsuite/gcc.target/arm/ivopts-4.c =================================================================== --- /dev/null (new file) +++ gcc/testsuite/gcc.target/arm/ivopts-4.c (revision 0) @@ -0,0 +1,21 @@ +/* { dg-do assemble } */ +/* { dg-options "-mthumb -Os -fdump-tree-ivopts -save-temps" } */ + +extern unsigned int foo (int*) __attribute__((pure)); + +unsigned int +tr2 (int array[], int n) +{ + unsigned int sum = 0; + int x; + if (n > 0) + for (x = 0; x < n; x++) + sum += foo (&array[x]); + return sum; +} + +/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */ +/* { dg-final { object-size text <= 36 { target arm_thumb2_ok } } } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ Index: gcc/testsuite/gcc.target/arm/ivopts-5.c =================================================================== --- /dev/null (new file) +++ gcc/testsuite/gcc.target/arm/ivopts-5.c (revision 0) @@ -0,0 +1,20 @@ +/* { dg-do assemble } */ +/* { dg-options "-Os -mthumb -fdump-tree-ivopts -save-temps" } */ + +extern unsigned int foo (int*) __attribute__((pure)); + +unsigned int +tr1 (int array[], unsigned int n) +{ + unsigned int sum = 0; + unsigned int x; + for (x = 0; x < n; x++) + sum += foo (&array[x]); + return sum; +} + +/* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */ +/* { dg-final { object-size text <= 30 { target arm_thumb2_ok } } } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ Index: gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c (revision 173380) +++ gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c (working copy) @@ -7,7 +7,8 @@ extern int a[]; -/* Can not infer loop iteration from array -- exit test can not be replaced. */ +/* Can infer loop iteration from nonwrapping pointer arithmetic. + exit test can be replaced. */ void foo (int i_width, TYPE dst, TYPE src1, TYPE src2) { TYPE dstn= dst + i_width; @@ -21,5 +22,5 @@ void foo (int i_width, TYPE dst, TYPE sr } } -/* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "Replacing" 1 "ivopts"} } */ /* { dg-final { cleanup-tree-dump "ivopts" } } */