brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 015ee2f Raw
89 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=tsan -S | FileCheck %s3; Check that atomic memory operations on floating-point types are converted to calls into ThreadSanitizer runtime.4target 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"5 6define float @load_float(ptr %fptr) {7; CHECK-LABEL: define float @load_float(8; CHECK-SAME: ptr [[FPTR:%.*]]) {9; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)10; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])11; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @__tsan_atomic32_load(ptr [[FPTR]], i32 0)12; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float13; CHECK-NEXT:    call void @__tsan_func_exit()14; CHECK-NEXT:    ret float [[TMP3]]15;16  %v = load atomic float, ptr %fptr unordered, align 417  ret float %v18}19 20define double @load_double(ptr %fptr) {21; CHECK-LABEL: define double @load_double(22; CHECK-SAME: ptr [[FPTR:%.*]]) {23; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)24; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])25; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @__tsan_atomic64_load(ptr [[FPTR]], i32 0)26; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i64 [[TMP2]] to double27; CHECK-NEXT:    call void @__tsan_func_exit()28; CHECK-NEXT:    ret double [[TMP3]]29;30  %v = load atomic double, ptr %fptr unordered, align 831  ret double %v32}33 34define fp128 @load_fp128(ptr %fptr) {35; CHECK-LABEL: define fp128 @load_fp128(36; CHECK-SAME: ptr [[FPTR:%.*]]) {37; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)38; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])39; CHECK-NEXT:    [[TMP2:%.*]] = call i128 @__tsan_atomic128_load(ptr [[FPTR]], i32 0)40; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i128 [[TMP2]] to fp12841; CHECK-NEXT:    call void @__tsan_func_exit()42; CHECK-NEXT:    ret fp128 [[TMP3]]43;44  %v = load atomic fp128, ptr %fptr unordered, align 1645  ret fp128 %v46}47 48define void @store_float(ptr %fptr, float %v) {49; CHECK-LABEL: define void @store_float(50; CHECK-SAME: ptr [[FPTR:%.*]], float [[V:%.*]]) {51; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)52; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])53; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float [[V]] to i3254; CHECK-NEXT:    call void @__tsan_atomic32_store(ptr [[FPTR]], i32 [[TMP2]], i32 0)55; CHECK-NEXT:    call void @__tsan_func_exit()56; CHECK-NEXT:    ret void57;58  store atomic float %v, ptr %fptr unordered, align 459  ret void60}61 62define void @store_double(ptr %fptr, double %v) {63; CHECK-LABEL: define void @store_double(64; CHECK-SAME: ptr [[FPTR:%.*]], double [[V:%.*]]) {65; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)66; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])67; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double [[V]] to i6468; CHECK-NEXT:    call void @__tsan_atomic64_store(ptr [[FPTR]], i64 [[TMP2]], i32 0)69; CHECK-NEXT:    call void @__tsan_func_exit()70; CHECK-NEXT:    ret void71;72  store atomic double %v, ptr %fptr unordered, align 873  ret void74}75 76define void @store_fp128(ptr %fptr, fp128 %v) {77; CHECK-LABEL: define void @store_fp128(78; CHECK-SAME: ptr [[FPTR:%.*]], fp128 [[V:%.*]]) {79; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.returnaddress(i32 0)80; CHECK-NEXT:    call void @__tsan_func_entry(ptr [[TMP1]])81; CHECK-NEXT:    [[TMP2:%.*]] = bitcast fp128 [[V]] to i12882; CHECK-NEXT:    call void @__tsan_atomic128_store(ptr [[FPTR]], i128 [[TMP2]], i32 0)83; CHECK-NEXT:    call void @__tsan_func_exit()84; CHECK-NEXT:    ret void85;86  store atomic fp128 %v, ptr %fptr unordered, align 1687  ret void88}89