blob: 7afaabb150e22f68ec78f437dabf6032dc77cab5 [file] [log] [blame]
/* { dg-do link } */
/* { dg-options "-fno-allow-store-data-races" } */
/* { dg-final { simulate-thread } } */
#include <stdio.h>
#include "simulate-thread.h"
/* This file tests that speculative store movement out of a loop doesn't
happen. This is disallowed when -fno-allow-store-data-races. */
int global = 100;
/* Other thread makes sure global is 100 before the next instruction is
* exceuted. */
void simulate_thread_other_threads()
{
global = 100;
}
int simulate_thread_step_verify()
{
if (global != 100)
{
printf("FAIL: global variable was assigned to. \n");
return 1;
}
return 0;
}
int simulate_thread_final_verify()
{
return 0;
}
/* The variable global should never be assigned if func(0) is called.
This tests store movement out of loop thats never executed. */
void test (int y)
{
int x;
for (x=0; x< y; x++)
{
global = y; /* This should never speculatively execute. */
}
}
__attribute__((noinline))
void simulate_thread_main()
{
test(0);
simulate_thread_done();
}
__attribute__((noinline))
int main()
{
simulate_thread_main();
return 0;
}