1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -tsan -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*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" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i16 @test_unaligned_read2(i16* %a) sanitize_thread { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker %tmp1 = load i16, i16* %a, align 1 8*9880d681SAndroid Build Coastguard Worker ret i16 %tmp1 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i16 @test_unaligned_read2(i16* %a) 12*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i16* %a to i8* 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_read2(i8* %1) 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp1 = load i16, i16* %a, align 1 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 17*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @test_unaligned_read4(i32* %a) sanitize_thread { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %a, align 2 22*9880d681SAndroid Build Coastguard Worker ret i32 %tmp1 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test_unaligned_read4(i32* %a) 26*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i32* %a to i8* 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_read4(i8* %1) 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp1 = load i32, i32* %a, align 2 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 31*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i64 @test_unaligned_read8(i64* %a) sanitize_thread { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %a, align 4 36*9880d681SAndroid Build Coastguard Worker ret i64 %tmp1 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i64 @test_unaligned_read8(i64* %a) 40*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i64* %a to i8* 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_read8(i8* %1) 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp1 = load i64, i64* %a, align 4 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 45*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine i128 @test_unaligned_read16(i128* %a) sanitize_thread { 48*9880d681SAndroid Build Coastguard Workerentry: 49*9880d681SAndroid Build Coastguard Worker %tmp1 = load i128, i128* %a, align 1 50*9880d681SAndroid Build Coastguard Worker ret i128 %tmp1 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i128 @test_unaligned_read16(i128* %a) 54*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i128* %a to i8* 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_read16(i8* %1) 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp1 = load i128, i128* %a, align 1 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 59*9880d681SAndroid Build Coastguard Worker; CHECK: ret i128 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine i128 @test_aligned_read16(i128* %a) sanitize_thread { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker %tmp1 = load i128, i128* %a, align 8 64*9880d681SAndroid Build Coastguard Worker ret i128 %tmp1 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i128 @test_aligned_read16(i128* %a) 68*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i128* %a to i8* 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_read16(i8* %1) 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %tmp1 = load i128, i128* %a, align 8 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 73*9880d681SAndroid Build Coastguard Worker; CHECK: ret i128 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine void @test_unaligned_write2(i16* %a) sanitize_thread { 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker store i16 1, i16* %a, align 1 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test_unaligned_write2(i16* %a) 82*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i16* %a to i8* 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_write2(i8* %1) 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i16 1, i16* %a, align 1 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 87*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine void @test_unaligned_write4(i32* %a) sanitize_thread { 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker store i32 1, i32* %a, align 1 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test_unaligned_write4(i32* %a) 96*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i32* %a to i8* 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_write4(i8* %1) 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 1, i32* %a, align 1 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 101*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine void @test_unaligned_write8(i64* %a) sanitize_thread { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker store i64 1, i64* %a, align 1 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test_unaligned_write8(i64* %a) 110*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i64* %a to i8* 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_write8(i8* %1) 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i64 1, i64* %a, align 1 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 115*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine void @test_unaligned_write16(i128* %a) sanitize_thread { 118*9880d681SAndroid Build Coastguard Workerentry: 119*9880d681SAndroid Build Coastguard Worker store i128 1, i128* %a, align 1 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test_unaligned_write16(i128* %a) 124*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i128* %a to i8* 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_unaligned_write16(i8* %1) 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i128 1, i128* %a, align 1 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 129*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine void @test_aligned_write16(i128* %a) sanitize_thread { 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker store i128 1, i128* %a, align 8 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test_aligned_write16(i128* %a) 138*9880d681SAndroid Build Coastguard Worker; CHECK: call void @__tsan_func_entry(i8* %0) 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = bitcast i128* %a to i8* 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_write16(i8* %1) 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i128 1, i128* %a, align 8 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__tsan_func_exit() 143*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 144