12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O3 %s -o %t && %run %t 2>&1 | FileCheck %s
49c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany//
59c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany// Check that load widening is not tsan-hostile.
69c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany#include <pthread.h>
79c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany#include <stdio.h>
89c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany#include <string.h>
99c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
109c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryanystruct {
119c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  int i;
129c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  char c1, c2, c3, c4;
139c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany} S;
149c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
159c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryanyint G;
169c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
179c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryanyvoid *Thread1(void *x) {
189c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  G = S.c1 + S.c3;
199c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  return NULL;
209c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany}
219c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
229c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryanyvoid *Thread2(void *x) {
23cf576c860a780a3f34ea17cb2d931e4532606217Kostya Serebryany  S.c2 = 1;
249c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  return NULL;
259c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany}
269c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
279c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryanyint main() {
289c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  pthread_t t[2];
299c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  memset(&S, 123, sizeof(S));
309c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  pthread_create(&t[0], NULL, Thread1, NULL);
319c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  pthread_create(&t[1], NULL, Thread2, NULL);
329c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  pthread_join(t[0], NULL);
339c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  pthread_join(t[1], NULL);
349c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany  printf("PASS\n");
359c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany}
369c0b286e747c4a5a08027261d0ca7ef25ede03eeKostya Serebryany
37867ac63fdc4d5aec1c1d66858937cf787af86105Kostya Serebryany// CHECK-NOT: WARNING: ThreadSanitizer: data race
38867ac63fdc4d5aec1c1d66858937cf787af86105Kostya Serebryany// CHECK: PASS
39