summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/ipa/pr105160.c
blob: ea80545b102a0a9fe85f929d70720706f902ff67 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* { dg-do compile } */
/* { dg-options "-O -fdump-ipa-modref" } */
#define sysreg_read(regname)		\
({					\
	unsigned long __sr_val;		\
	asm volatile("");		\
					\
	__sr_val;			\
})

#define sysreg_write(regname, __sw_val)	\
do {					\
	asm volatile("");			\
} while (0)

#define isb()				\
do {					\
	asm volatile(			\
	"isb"				\
	:				\
	:				\
	: "memory");			\
} while (0)

static unsigned long sctlr_read(void)
{
	return sysreg_read(sctlr_el1);
}

static void sctlr_write(unsigned long val)
{
	sysreg_write(sctlr_el1, val);
}

static void sctlr_rmw(void)
{
	unsigned long val;

	val = sctlr_read();
	val |= 1UL << 7;
	sctlr_write(val);
}

void sctlr_read_multiple(void)
{
	sctlr_read();
	sctlr_read();
	sctlr_read();
	sctlr_read();
}

void sctlr_write_multiple(void)
{
	sctlr_write(0);
	sctlr_write(0);
	sctlr_write(0);
	sctlr_write(0);
	sctlr_write(0);
}

void sctlr_rmw_multiple(void)
{
	sctlr_rmw();
	sctlr_rmw();
	sctlr_rmw();
	sctlr_rmw();
}

void function(void)
{
	sctlr_read_multiple();
	sctlr_write_multiple();
	sctlr_rmw_multiple();

	isb();
}
/* { dg-final { scan-ipa-dump-not "Function found to be const" "modref"  } } */