/* { dg-do compile } */ /* { dg-require-effective-target nonpic } */ /* { dg-options "-O2" } */ /* Check volatiles are written, read or not re-read consistently */ /* simple assignments */ extern int volatile obj_0; void test_0 (int data) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_0(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_0(\\(%rip\\))?," } } */ obj_0 = data; } extern int volatile obj_1; int test_1 (int data) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_1(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_1(\\(%rip\\))?," } } */ return obj_1 = data; } extern int volatile obj_2; int test_2 (void) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_2(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_2(\\(%rip\\))?," } } */ return obj_2 = 0; } /* Assignments in compound exprs */ extern int volatile obj_3; int test_3 (int data) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_3(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_3(\\(%rip\\))?," } } */ return (obj_3 = data, 0); } extern int volatile obj_4; int test_4 (void) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_4(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_4(\\(%rip\\))?," } } */ return (obj_4 = 0, 0); } extern int volatile obj_5; int test_5 (void) { /* should reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_5(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler "movl\[ \t\]_?obj_5(\\(%rip\\))?," } } */ return (obj_5 = 0, obj_5); } /* Assignments in conditional exprs */ extern int volatile obj_6; void test_6 (int data, int cond) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_6(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_6(\\(%rip\\))?," } } */ cond ? obj_6 = data : 0; } extern int volatile obj_7; int test_7 (int data, int cond) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_7(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_7(\\(%rip\\))?," } } */ return cond ? obj_7 = data : 0; } extern int volatile obj_8; int test_8 (int cond) { /* should not reread obj */ /* { dg-final { scan-assembler "movl\[ \t\]\[^,\]+, _?obj_8(\\(%rip\\))?" } } */ /* { dg-final { scan-assembler-not "movl\[ \t\]_?obj_8(\\(%rip\\))?," } } */ return cond ? obj_8 = 0 : 0; }