1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -msan -msan-check-access-address=0 -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=1 -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=2 -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" 6*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; atomicrmw xchg: store clean shadow, return clean shadow 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicRmwXchg(i32* %p, i32 %x) sanitize_memory { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw xchg i32* %p, i32 %x seq_cst 13*9880d681SAndroid Build Coastguard Worker ret i32 %0 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicRmwXchg 17*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, 18*9880d681SAndroid Build Coastguard Worker; CHECK: atomicrmw xchg {{.*}} seq_cst 19*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, {{.*}} @__msan_retval_tls 20*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; atomicrmw max: exactly the same as above 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicRmwMax(i32* %p, i32 %x) sanitize_memory { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw max i32* %p, i32 %x seq_cst 28*9880d681SAndroid Build Coastguard Worker ret i32 %0 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicRmwMax 32*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, 33*9880d681SAndroid Build Coastguard Worker; CHECK: atomicrmw max {{.*}} seq_cst 34*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, {{.*}} @__msan_retval_tls 35*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; cmpxchg: the same as above, but also check %a shadow 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine i32 @Cmpxchg(i32* %p, i32 %a, i32 %b) sanitize_memory { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %p, i32 %a, i32 %b seq_cst seq_cst 43*9880d681SAndroid Build Coastguard Worker %0 = extractvalue { i32, i1 } %pair, 0 44*9880d681SAndroid Build Coastguard Worker ret i32 %0 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @Cmpxchg 48*9880d681SAndroid Build Coastguard Worker; CHECK: store { i32, i1 } zeroinitializer, 49*9880d681SAndroid Build Coastguard Worker; CHECK: icmp 50*9880d681SAndroid Build Coastguard Worker; CHECK: br 51*9880d681SAndroid Build Coastguard Worker; CHECK: @__msan_warning 52*9880d681SAndroid Build Coastguard Worker; CHECK: cmpxchg {{.*}} seq_cst seq_cst 53*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, {{.*}} @__msan_retval_tls 54*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; relaxed cmpxchg: bump up to "release monotonic" 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i32 @CmpxchgMonotonic(i32* %p, i32 %a, i32 %b) sanitize_memory { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker %pair = cmpxchg i32* %p, i32 %a, i32 %b monotonic monotonic 62*9880d681SAndroid Build Coastguard Worker %0 = extractvalue { i32, i1 } %pair, 0 63*9880d681SAndroid Build Coastguard Worker ret i32 %0 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @CmpxchgMonotonic 67*9880d681SAndroid Build Coastguard Worker; CHECK: store { i32, i1 } zeroinitializer, 68*9880d681SAndroid Build Coastguard Worker; CHECK: icmp 69*9880d681SAndroid Build Coastguard Worker; CHECK: br 70*9880d681SAndroid Build Coastguard Worker; CHECK: @__msan_warning 71*9880d681SAndroid Build Coastguard Worker; CHECK: cmpxchg {{.*}} release monotonic 72*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, {{.*}} @__msan_retval_tls 73*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; atomic load: preserve alignment, load shadow value after app value 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoad(i32* %p) sanitize_memory { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker %0 = load atomic i32, i32* %p seq_cst, align 16 81*9880d681SAndroid Build Coastguard Worker ret i32 %0 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicLoad 85*9880d681SAndroid Build Coastguard Worker; CHECK: load atomic i32, i32* {{.*}} seq_cst, align 16 86*9880d681SAndroid Build Coastguard Worker; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, i32* {{.*}}, align 16 87*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls 88*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; atomic load: preserve alignment, load shadow value after app value 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadAcquire(i32* %p) sanitize_memory { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker %0 = load atomic i32, i32* %p acquire, align 16 96*9880d681SAndroid Build Coastguard Worker ret i32 %0 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicLoadAcquire 100*9880d681SAndroid Build Coastguard Worker; CHECK: load atomic i32, i32* {{.*}} acquire, align 16 101*9880d681SAndroid Build Coastguard Worker; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, i32* {{.*}}, align 16 102*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls 103*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; atomic load monotonic: bump up to load acquire 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadMonotonic(i32* %p) sanitize_memory { 109*9880d681SAndroid Build Coastguard Workerentry: 110*9880d681SAndroid Build Coastguard Worker %0 = load atomic i32, i32* %p monotonic, align 16 111*9880d681SAndroid Build Coastguard Worker ret i32 %0 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicLoadMonotonic 115*9880d681SAndroid Build Coastguard Worker; CHECK: load atomic i32, i32* {{.*}} acquire, align 16 116*9880d681SAndroid Build Coastguard Worker; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, i32* {{.*}}, align 16 117*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls 118*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; atomic load unordered: bump up to load acquire 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadUnordered(i32* %p) sanitize_memory { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker %0 = load atomic i32, i32* %p unordered, align 16 126*9880d681SAndroid Build Coastguard Worker ret i32 %0 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicLoadUnordered 130*9880d681SAndroid Build Coastguard Worker; CHECK: load atomic i32, i32* {{.*}} acquire, align 16 131*9880d681SAndroid Build Coastguard Worker; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, i32* {{.*}}, align 16 132*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls 133*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; atomic store: preserve alignment, store clean shadow value before app value 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine void @AtomicStore(i32* %p, i32 %x) sanitize_memory { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker store atomic i32 %x, i32* %p seq_cst, align 16 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicStore 145*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__msan_param_tls 146*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* {{.*}}, align 16 147*9880d681SAndroid Build Coastguard Worker; CHECK: store atomic i32 %x, i32* %p seq_cst, align 16 148*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; atomic store: preserve alignment, store clean shadow value before app value 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine void @AtomicStoreRelease(i32* %p, i32 %x) sanitize_memory { 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker store atomic i32 %x, i32* %p release, align 16 156*9880d681SAndroid Build Coastguard Worker ret void 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicStoreRelease 160*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__msan_param_tls 161*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* {{.*}}, align 16 162*9880d681SAndroid Build Coastguard Worker; CHECK: store atomic i32 %x, i32* %p release, align 16 163*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; atomic store monotonic: bumped up to store release 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine void @AtomicStoreMonotonic(i32* %p, i32 %x) sanitize_memory { 169*9880d681SAndroid Build Coastguard Workerentry: 170*9880d681SAndroid Build Coastguard Worker store atomic i32 %x, i32* %p monotonic, align 16 171*9880d681SAndroid Build Coastguard Worker ret void 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicStoreMonotonic 175*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__msan_param_tls 176*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* {{.*}}, align 16 177*9880d681SAndroid Build Coastguard Worker; CHECK: store atomic i32 %x, i32* %p release, align 16 178*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; atomic store unordered: bumped up to store release 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine void @AtomicStoreUnordered(i32* %p, i32 %x) sanitize_memory { 184*9880d681SAndroid Build Coastguard Workerentry: 185*9880d681SAndroid Build Coastguard Worker store atomic i32 %x, i32* %p unordered, align 16 186*9880d681SAndroid Build Coastguard Worker ret void 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @AtomicStoreUnordered 190*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__msan_param_tls 191*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* {{.*}}, align 16 192*9880d681SAndroid Build Coastguard Worker; CHECK: store atomic i32 %x, i32* %p release, align 16 193*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 194