blob: 3839d9f137660f9cb410c74e280d9698091bad1d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/* { dg-do run } */
/* { dg-options "-std=gnu99 -Os" } */
/* This is a massively distilled test case based upon
mm/memory.c:unmap_vmas() in the Linux kernel when compiled
on sparc64 for SMP which uses a global register as the
base of the per-cpu variable area.
Because of a bug in global register handling in the dataflow
code, the loop-invariant pass would move 'expression(regval)'
outside of the loop. */
extern void exit(int);
extern void abort(void);
register unsigned long regval __asm__("g6");
extern void cond_resched(void);
unsigned int var;
static unsigned long expression(unsigned long v)
{
unsigned long ret;
__asm__("" : "=r" (ret) : "0" (0));
return ret + v;
}
void func(unsigned long *pp)
{
int i;
for (i = 0; i < 56; i++) {
cond_resched();
*pp = expression(regval);
}
}
void __attribute__((noinline)) cond_resched(void)
{
regval++;
}
int main(void)
{
unsigned long val;
regval = 100;
func(&val);
if (val != 156)
abort();
exit(0);
}
|