1 ; RUN: opt -S %s -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 7 define float @float_load_expand(float* %ptr) { 8 ; CHECK-LABEL: @float_load_expand 9 ; CHECK: %1 = bitcast float* %ptr to i32* 10 ; CHECK: %2 = load atomic i32, i32* %1 unordered, align 4 11 ; CHECK: %3 = bitcast i32 %2 to float 12 ; CHECK: ret float %3 13 %res = load atomic float, float* %ptr unordered, align 4 14 ret float %res 15 } 16 17 define float @float_load_expand_seq_cst(float* %ptr) { 18 ; CHECK-LABEL: @float_load_expand_seq_cst 19 ; CHECK: %1 = bitcast float* %ptr to i32* 20 ; CHECK: %2 = load atomic i32, i32* %1 seq_cst, align 4 21 ; CHECK: %3 = bitcast i32 %2 to float 22 ; CHECK: ret float %3 23 %res = load atomic float, float* %ptr seq_cst, align 4 24 ret float %res 25 } 26 27 define float @float_load_expand_vol(float* %ptr) { 28 ; CHECK-LABEL: @float_load_expand_vol 29 ; CHECK: %1 = bitcast float* %ptr to i32* 30 ; CHECK: %2 = load atomic volatile i32, i32* %1 unordered, align 4 31 ; CHECK: %3 = bitcast i32 %2 to float 32 ; CHECK: ret float %3 33 %res = load atomic volatile float, float* %ptr unordered, align 4 34 ret float %res 35 } 36 37 define float @float_load_expand_addr1(float addrspace(1)* %ptr) { 38 ; CHECK-LABEL: @float_load_expand_addr1 39 ; CHECK: %1 = bitcast float addrspace(1)* %ptr to i32 addrspace(1)* 40 ; CHECK: %2 = load atomic i32, i32 addrspace(1)* %1 unordered, align 4 41 ; CHECK: %3 = bitcast i32 %2 to float 42 ; CHECK: ret float %3 43 %res = load atomic float, float addrspace(1)* %ptr unordered, align 4 44 ret float %res 45 } 46 47 define void @float_store_expand(float* %ptr, float %v) { 48 ; CHECK-LABEL: @float_store_expand 49 ; CHECK: %1 = bitcast float %v to i32 50 ; CHECK: %2 = bitcast float* %ptr to i32* 51 ; CHECK: store atomic i32 %1, i32* %2 unordered, align 4 52 store atomic float %v, float* %ptr unordered, align 4 53 ret void 54 } 55 56 define void @float_store_expand_seq_cst(float* %ptr, float %v) { 57 ; CHECK-LABEL: @float_store_expand_seq_cst 58 ; CHECK: %1 = bitcast float %v to i32 59 ; CHECK: %2 = bitcast float* %ptr to i32* 60 ; CHECK: store atomic i32 %1, i32* %2 seq_cst, align 4 61 store atomic float %v, float* %ptr seq_cst, align 4 62 ret void 63 } 64 65 define void @float_store_expand_vol(float* %ptr, float %v) { 66 ; CHECK-LABEL: @float_store_expand_vol 67 ; CHECK: %1 = bitcast float %v to i32 68 ; CHECK: %2 = bitcast float* %ptr to i32* 69 ; CHECK: store atomic volatile i32 %1, i32* %2 unordered, align 4 70 store atomic volatile float %v, float* %ptr unordered, align 4 71 ret void 72 } 73 74 define void @float_store_expand_addr1(float addrspace(1)* %ptr, float %v) { 75 ; CHECK-LABEL: @float_store_expand_addr1 76 ; CHECK: %1 = bitcast float %v to i32 77 ; CHECK: %2 = bitcast float addrspace(1)* %ptr to i32 addrspace(1)* 78 ; CHECK: store atomic i32 %1, i32 addrspace(1)* %2 unordered, align 4 79 store atomic float %v, float addrspace(1)* %ptr unordered, align 4 80 ret void 81 } 82 83 define void @pointer_cmpxchg_expand(i8** %ptr, i8* %v) { 84 ; CHECK-LABEL: @pointer_cmpxchg_expand 85 ; CHECK: %1 = bitcast i8** %ptr to i64* 86 ; CHECK: %2 = ptrtoint i8* %v to i64 87 ; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 seq_cst monotonic 88 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 89 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 90 ; CHECK: %6 = inttoptr i64 %4 to i8* 91 ; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0 92 ; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1 93 cmpxchg i8** %ptr, i8* null, i8* %v seq_cst monotonic 94 ret void 95 } 96 97 define void @pointer_cmpxchg_expand2(i8** %ptr, i8* %v) { 98 ; CHECK-LABEL: @pointer_cmpxchg_expand2 99 ; CHECK: %1 = bitcast i8** %ptr to i64* 100 ; CHECK: %2 = ptrtoint i8* %v to i64 101 ; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 release monotonic 102 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 103 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 104 ; CHECK: %6 = inttoptr i64 %4 to i8* 105 ; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0 106 ; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1 107 cmpxchg i8** %ptr, i8* null, i8* %v release monotonic 108 ret void 109 } 110 111 define void @pointer_cmpxchg_expand3(i8** %ptr, i8* %v) { 112 ; CHECK-LABEL: @pointer_cmpxchg_expand3 113 ; CHECK: %1 = bitcast i8** %ptr to i64* 114 ; CHECK: %2 = ptrtoint i8* %v to i64 115 ; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 seq_cst seq_cst 116 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 117 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 118 ; CHECK: %6 = inttoptr i64 %4 to i8* 119 ; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0 120 ; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1 121 cmpxchg i8** %ptr, i8* null, i8* %v seq_cst seq_cst 122 ret void 123 } 124 125 define void @pointer_cmpxchg_expand4(i8** %ptr, i8* %v) { 126 ; CHECK-LABEL: @pointer_cmpxchg_expand4 127 ; CHECK: %1 = bitcast i8** %ptr to i64* 128 ; CHECK: %2 = ptrtoint i8* %v to i64 129 ; CHECK: %3 = cmpxchg weak i64* %1, i64 0, i64 %2 seq_cst seq_cst 130 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 131 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 132 ; CHECK: %6 = inttoptr i64 %4 to i8* 133 ; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0 134 ; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1 135 cmpxchg weak i8** %ptr, i8* null, i8* %v seq_cst seq_cst 136 ret void 137 } 138 139 define void @pointer_cmpxchg_expand5(i8** %ptr, i8* %v) { 140 ; CHECK-LABEL: @pointer_cmpxchg_expand5 141 ; CHECK: %1 = bitcast i8** %ptr to i64* 142 ; CHECK: %2 = ptrtoint i8* %v to i64 143 ; CHECK: %3 = cmpxchg volatile i64* %1, i64 0, i64 %2 seq_cst seq_cst 144 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 145 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 146 ; CHECK: %6 = inttoptr i64 %4 to i8* 147 ; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0 148 ; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1 149 cmpxchg volatile i8** %ptr, i8* null, i8* %v seq_cst seq_cst 150 ret void 151 } 152 153 define void @pointer_cmpxchg_expand6(i8 addrspace(2)* addrspace(1)* %ptr, 154 i8 addrspace(2)* %v) { 155 ; CHECK-LABEL: @pointer_cmpxchg_expand6 156 ; CHECK: %1 = bitcast i8 addrspace(2)* addrspace(1)* %ptr to i64 addrspace(1)* 157 ; CHECK: %2 = ptrtoint i8 addrspace(2)* %v to i64 158 ; CHECK: %3 = cmpxchg i64 addrspace(1)* %1, i64 0, i64 %2 seq_cst seq_cst 159 ; CHECK: %4 = extractvalue { i64, i1 } %3, 0 160 ; CHECK: %5 = extractvalue { i64, i1 } %3, 1 161 ; CHECK: %6 = inttoptr i64 %4 to i8 addrspace(2)* 162 ; CHECK: %7 = insertvalue { i8 addrspace(2)*, i1 } undef, i8 addrspace(2)* %6, 0 163 ; CHECK: %8 = insertvalue { i8 addrspace(2)*, i1 } %7, i1 %5, 1 164 cmpxchg i8 addrspace(2)* addrspace(1)* %ptr, i8 addrspace(2)* null, i8 addrspace(2)* %v seq_cst seq_cst 165 ret void 166 } 167 168