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