re PR rtl-optimization/40956 (Constants are never candidates for hoisting)
PR rtl-optimization/40956 PR target/42495 PR middle-end/42574 * gcc.target/arm/pr40956.c, gcc.target/arm/pr42495.c, * gcc.target/arm/pr42574.c: Add tests. From-SVN: r162600
This commit is contained in:
parent
ec3728adb8
commit
689d6c4a78
4 changed files with 77 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
|||
2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com>
|
||||
|
||||
PR rtl-optimization/40956
|
||||
PR target/42495
|
||||
PR middle-end/42574
|
||||
* gcc.target/arm/pr40956.c, gcc.target/arm/pr42495.c,
|
||||
* gcc.target/arm/pr42574.c: Add tests.
|
||||
|
||||
2010-07-27 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* lib/gcc-dg.exp (cleanup-coverage-files): Remove options from
|
||||
|
|
14
gcc/testsuite/gcc.target/arm/pr40956.c
Normal file
14
gcc/testsuite/gcc.target/arm/pr40956.c
Normal file
|
@ -0,0 +1,14 @@
|
|||
/* { dg-options "-mthumb -Os -fpic -march=armv5te" } */
|
||||
/* { dg-require-effective-target arm_thumb1_ok } */
|
||||
/* { dg-require-effective-target fpic } */
|
||||
/* Make sure the constant "0" is loaded into register only once. */
|
||||
/* { dg-final { scan-assembler-times "mov\[\\t \]*r., #0" 1 } } */
|
||||
|
||||
int foo(int p, int* q)
|
||||
{
|
||||
if (p!=9)
|
||||
*q = 0;
|
||||
else
|
||||
*(q+1) = 0;
|
||||
return 3;
|
||||
}
|
31
gcc/testsuite/gcc.target/arm/pr42495.c
Normal file
31
gcc/testsuite/gcc.target/arm/pr42495.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* { dg-options "-mthumb -Os -fpic -march=armv5te -fdump-rtl-hoist" } */
|
||||
/* { dg-require-effective-target arm_thumb1_ok } */
|
||||
/* { dg-require-effective-target fpic } */
|
||||
/* Make sure all calculations of gObj's address get hoisted to one location. */
|
||||
/* { dg-final { scan-rtl-dump "PRE/HOIST: end of bb .* copying expression" "hoist" } } */
|
||||
|
||||
struct st_a {
|
||||
int data;
|
||||
};
|
||||
|
||||
struct st_b {
|
||||
struct st_a *p_a;
|
||||
struct st_b *next;
|
||||
};
|
||||
|
||||
extern struct st_b gObj;
|
||||
extern void foo(int, struct st_b*);
|
||||
|
||||
int goo(struct st_b * obj) {
|
||||
struct st_a *pa;
|
||||
if (gObj.p_a->data != 0) {
|
||||
foo(gObj.p_a->data, obj);
|
||||
}
|
||||
pa = obj->p_a;
|
||||
if (pa == 0) {
|
||||
return 0;
|
||||
} else if (pa == gObj.p_a) {
|
||||
return 0;
|
||||
}
|
||||
return pa->data;
|
||||
}
|
24
gcc/testsuite/gcc.target/arm/pr42574.c
Normal file
24
gcc/testsuite/gcc.target/arm/pr42574.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* { dg-options "-mthumb -Os -fpic -march=armv5te" } */
|
||||
/* { dg-require-effective-target arm_thumb1_ok } */
|
||||
/* { dg-require-effective-target fpic } */
|
||||
/* Make sure the address of glob.c is calculated only once and using
|
||||
a logical shift for the offset (200<<1). */
|
||||
/* { dg-final { scan-assembler-times "lsl" 1 } } */
|
||||
|
||||
struct A {
|
||||
char a[400];
|
||||
float* c;
|
||||
};
|
||||
struct A glob;
|
||||
void func();
|
||||
void func1(float*);
|
||||
int func2(float*, int*);
|
||||
void func3(float*);
|
||||
|
||||
void test(int *p) {
|
||||
func1(glob.c);
|
||||
if (func2(glob.c, p)) {
|
||||
func();
|
||||
}
|
||||
func3(glob.c);
|
||||
}
|
Loading…
Add table
Reference in a new issue