1; RUN: opt -S %s -passes=atomic-expand -mtriple=x86_64-linux-gnu | FileCheck %s 2 3; This file tests the functions `llvm::convertAtomicLoadToIntegerType` and 4; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this 5; functionality, please move this test to a target which still is. 6 7define float @float_load_expand(ptr %ptr) { 8; CHECK-LABEL: @float_load_expand 9; CHECK: %1 = load atomic i32, ptr %ptr unordered, align 4 10; CHECK: %2 = bitcast i32 %1 to float 11; CHECK: ret float %2 12 %res = load atomic float, ptr %ptr unordered, align 4 13 ret float %res 14} 15 16define float @float_load_expand_seq_cst(ptr %ptr) { 17; CHECK-LABEL: @float_load_expand_seq_cst 18; CHECK: %1 = load atomic i32, ptr %ptr seq_cst, align 4 19; CHECK: %2 = bitcast i32 %1 to float 20; CHECK: ret float %2 21 %res = load atomic float, ptr %ptr seq_cst, align 4 22 ret float %res 23} 24 25define float @float_load_expand_vol(ptr %ptr) { 26; CHECK-LABEL: @float_load_expand_vol 27; CHECK: %1 = load atomic volatile i32, ptr %ptr unordered, align 4 28; CHECK: %2 = bitcast i32 %1 to float 29; CHECK: ret float %2 30 %res = load atomic volatile float, ptr %ptr unordered, align 4 31 ret float %res 32} 33 34define float @float_load_expand_addr1(ptr addrspace(1) %ptr) { 35; CHECK-LABEL: @float_load_expand_addr1 36; CHECK: %1 = load atomic i32, ptr addrspace(1) %ptr unordered, align 4 37; CHECK: %2 = bitcast i32 %1 to float 38; CHECK: ret float %2 39 %res = load atomic float, ptr addrspace(1) %ptr unordered, align 4 40 ret float %res 41} 42 43define void @float_store_expand(ptr %ptr, float %v) { 44; CHECK-LABEL: @float_store_expand 45; CHECK: %1 = bitcast float %v to i32 46; CHECK: store atomic i32 %1, ptr %ptr unordered, align 4 47 store atomic float %v, ptr %ptr unordered, align 4 48 ret void 49} 50 51define void @float_store_expand_seq_cst(ptr %ptr, float %v) { 52; CHECK-LABEL: @float_store_expand_seq_cst 53; CHECK: %1 = bitcast float %v to i32 54; CHECK: store atomic i32 %1, ptr %ptr seq_cst, align 4 55 store atomic float %v, ptr %ptr seq_cst, align 4 56 ret void 57} 58 59define void @float_store_expand_vol(ptr %ptr, float %v) { 60; CHECK-LABEL: @float_store_expand_vol 61; CHECK: %1 = bitcast float %v to i32 62; CHECK: store atomic volatile i32 %1, ptr %ptr unordered, align 4 63 store atomic volatile float %v, ptr %ptr unordered, align 4 64 ret void 65} 66 67define void @float_store_expand_addr1(ptr addrspace(1) %ptr, float %v) { 68; CHECK-LABEL: @float_store_expand_addr1 69; CHECK: %1 = bitcast float %v to i32 70; CHECK: store atomic i32 %1, ptr addrspace(1) %ptr unordered, align 4 71 store atomic float %v, ptr addrspace(1) %ptr unordered, align 4 72 ret void 73} 74 75define void @pointer_cmpxchg_expand(ptr %ptr, ptr %v) { 76; CHECK-LABEL: @pointer_cmpxchg_expand 77; CHECK: %1 = ptrtoint ptr %v to i64 78; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 seq_cst monotonic 79; CHECK: %3 = extractvalue { i64, i1 } %2, 0 80; CHECK: %4 = extractvalue { i64, i1 } %2, 1 81; CHECK: %5 = inttoptr i64 %3 to ptr 82; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0 83; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1 84 cmpxchg ptr %ptr, ptr null, ptr %v seq_cst monotonic 85 ret void 86} 87 88define void @pointer_cmpxchg_expand2(ptr %ptr, ptr %v) { 89; CHECK-LABEL: @pointer_cmpxchg_expand2 90; CHECK: %1 = ptrtoint ptr %v to i64 91; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 release monotonic 92; CHECK: %3 = extractvalue { i64, i1 } %2, 0 93; CHECK: %4 = extractvalue { i64, i1 } %2, 1 94; CHECK: %5 = inttoptr i64 %3 to ptr 95; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0 96; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1 97 cmpxchg ptr %ptr, ptr null, ptr %v release monotonic 98 ret void 99} 100 101define void @pointer_cmpxchg_expand3(ptr %ptr, ptr %v) { 102; CHECK-LABEL: @pointer_cmpxchg_expand3 103; CHECK: %1 = ptrtoint ptr %v to i64 104; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 seq_cst seq_cst 105; CHECK: %3 = extractvalue { i64, i1 } %2, 0 106; CHECK: %4 = extractvalue { i64, i1 } %2, 1 107; CHECK: %5 = inttoptr i64 %3 to ptr 108; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0 109; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1 110 cmpxchg ptr %ptr, ptr null, ptr %v seq_cst seq_cst 111 ret void 112} 113 114define void @pointer_cmpxchg_expand4(ptr %ptr, ptr %v) { 115; CHECK-LABEL: @pointer_cmpxchg_expand4 116; CHECK: %1 = ptrtoint ptr %v to i64 117; CHECK: %2 = cmpxchg weak ptr %ptr, i64 0, i64 %1 seq_cst seq_cst 118; CHECK: %3 = extractvalue { i64, i1 } %2, 0 119; CHECK: %4 = extractvalue { i64, i1 } %2, 1 120; CHECK: %5 = inttoptr i64 %3 to ptr 121; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0 122; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1 123 cmpxchg weak ptr %ptr, ptr null, ptr %v seq_cst seq_cst 124 ret void 125} 126 127define void @pointer_cmpxchg_expand5(ptr %ptr, ptr %v) { 128; CHECK-LABEL: @pointer_cmpxchg_expand5 129; CHECK: %1 = ptrtoint ptr %v to i64 130; CHECK: %2 = cmpxchg volatile ptr %ptr, i64 0, i64 %1 seq_cst seq_cst 131; CHECK: %3 = extractvalue { i64, i1 } %2, 0 132; CHECK: %4 = extractvalue { i64, i1 } %2, 1 133; CHECK: %5 = inttoptr i64 %3 to ptr 134; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0 135; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1 136 cmpxchg volatile ptr %ptr, ptr null, ptr %v seq_cst seq_cst 137 ret void 138} 139 140define void @pointer_cmpxchg_expand6(ptr addrspace(1) %ptr, 141 ptr addrspace(2) %v) { 142; CHECK-LABEL: @pointer_cmpxchg_expand6 143; CHECK: %1 = ptrtoint ptr addrspace(2) %v to i64 144; CHECK: %2 = cmpxchg ptr addrspace(1) %ptr, i64 0, i64 %1 seq_cst seq_cst 145; CHECK: %3 = extractvalue { i64, i1 } %2, 0 146; CHECK: %4 = extractvalue { i64, i1 } %2, 1 147; CHECK: %5 = inttoptr i64 %3 to ptr addrspace(2) 148; CHECK: %6 = insertvalue { ptr addrspace(2), i1 } poison, ptr addrspace(2) %5, 0 149; CHECK: %7 = insertvalue { ptr addrspace(2), i1 } %6, i1 %4, 1 150 cmpxchg ptr addrspace(1) %ptr, ptr addrspace(2) null, ptr addrspace(2) %v seq_cst seq_cst 151 ret void 152} 153 154