192 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -S %s -passes=atomic-expand -mtriple=x86_64-linux-gnu | FileCheck %s3 4; This file tests the functions `llvm::convertAtomicLoadToIntegerType` and5; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this6; functionality, please move this test to a target which still is.7 8define float @float_load_expand(ptr %ptr) {9; CHECK-LABEL: define float @float_load_expand(10; CHECK-SAME: ptr [[PTR:%.*]]) {11; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] unordered, align 412; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float13; CHECK-NEXT: ret float [[TMP2]]14;15 %res = load atomic float, ptr %ptr unordered, align 416 ret float %res17}18 19define float @float_load_expand_seq_cst(ptr %ptr) {20; CHECK-LABEL: define float @float_load_expand_seq_cst(21; CHECK-SAME: ptr [[PTR:%.*]]) {22; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] seq_cst, align 423; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float24; CHECK-NEXT: ret float [[TMP2]]25;26 %res = load atomic float, ptr %ptr seq_cst, align 427 ret float %res28}29 30define float @float_load_expand_vol(ptr %ptr) {31; CHECK-LABEL: define float @float_load_expand_vol(32; CHECK-SAME: ptr [[PTR:%.*]]) {33; CHECK-NEXT: [[TMP1:%.*]] = load atomic volatile i32, ptr [[PTR]] unordered, align 434; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float35; CHECK-NEXT: ret float [[TMP2]]36;37 %res = load atomic volatile float, ptr %ptr unordered, align 438 ret float %res39}40 41define float @float_load_expand_addr1(ptr addrspace(1) %ptr) {42; CHECK-LABEL: define float @float_load_expand_addr1(43; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {44; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr addrspace(1) [[PTR]] unordered, align 445; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float46; CHECK-NEXT: ret float [[TMP2]]47;48 %res = load atomic float, ptr addrspace(1) %ptr unordered, align 449 ret float %res50}51 52define void @float_store_expand(ptr %ptr, float %v) {53; CHECK-LABEL: define void @float_store_expand(54; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) {55; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i3256; CHECK-NEXT: store atomic i32 [[TMP1]], ptr [[PTR]] unordered, align 457; CHECK-NEXT: ret void58;59 store atomic float %v, ptr %ptr unordered, align 460 ret void61}62 63define void @float_store_expand_seq_cst(ptr %ptr, float %v) {64; CHECK-LABEL: define void @float_store_expand_seq_cst(65; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) {66; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i3267; CHECK-NEXT: store atomic i32 [[TMP1]], ptr [[PTR]] seq_cst, align 468; CHECK-NEXT: ret void69;70 store atomic float %v, ptr %ptr seq_cst, align 471 ret void72}73 74define void @float_store_expand_vol(ptr %ptr, float %v) {75; CHECK-LABEL: define void @float_store_expand_vol(76; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) {77; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i3278; CHECK-NEXT: store atomic volatile i32 [[TMP1]], ptr [[PTR]] unordered, align 479; CHECK-NEXT: ret void80;81 store atomic volatile float %v, ptr %ptr unordered, align 482 ret void83}84 85define void @float_store_expand_addr1(ptr addrspace(1) %ptr, float %v) {86; CHECK-LABEL: define void @float_store_expand_addr1(87; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]], float [[V:%.*]]) {88; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i3289; CHECK-NEXT: store atomic i32 [[TMP1]], ptr addrspace(1) [[PTR]] unordered, align 490; CHECK-NEXT: ret void91;92 store atomic float %v, ptr addrspace(1) %ptr unordered, align 493 ret void94}95 96define void @pointer_cmpxchg_expand(ptr %ptr, ptr %v) {97; CHECK-LABEL: define void @pointer_cmpxchg_expand(98; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) {99; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64100; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst monotonic, align 8101; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0102; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1103; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr104; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0105; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1106; CHECK-NEXT: ret void107;108 cmpxchg ptr %ptr, ptr null, ptr %v seq_cst monotonic109 ret void110}111 112define void @pointer_cmpxchg_expand2(ptr %ptr, ptr %v) {113; CHECK-LABEL: define void @pointer_cmpxchg_expand2(114; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) {115; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64116; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] release monotonic, align 8117; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0118; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1119; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr120; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0121; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1122; CHECK-NEXT: ret void123;124 cmpxchg ptr %ptr, ptr null, ptr %v release monotonic125 ret void126}127 128define void @pointer_cmpxchg_expand3(ptr %ptr, ptr %v) {129; CHECK-LABEL: define void @pointer_cmpxchg_expand3(130; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) {131; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64132; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8133; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0134; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1135; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr136; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0137; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1138; CHECK-NEXT: ret void139;140 cmpxchg ptr %ptr, ptr null, ptr %v seq_cst seq_cst141 ret void142}143 144define void @pointer_cmpxchg_expand4(ptr %ptr, ptr %v) {145; CHECK-LABEL: define void @pointer_cmpxchg_expand4(146; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) {147; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64148; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg weak ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8149; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0150; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1151; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr152; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0153; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1154; CHECK-NEXT: ret void155;156 cmpxchg weak ptr %ptr, ptr null, ptr %v seq_cst seq_cst157 ret void158}159 160define void @pointer_cmpxchg_expand5(ptr %ptr, ptr %v) {161; CHECK-LABEL: define void @pointer_cmpxchg_expand5(162; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) {163; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64164; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg volatile ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8165; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0166; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1167; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr168; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0169; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1170; CHECK-NEXT: ret void171;172 cmpxchg volatile ptr %ptr, ptr null, ptr %v seq_cst seq_cst173 ret void174}175 176define void @pointer_cmpxchg_expand6(ptr addrspace(1) %ptr, ptr addrspace(2) %v) {177; CHECK-LABEL: define void @pointer_cmpxchg_expand6(178; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]], ptr addrspace(2) [[V:%.*]]) {179; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(2) [[V]] to i64180; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8181; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0182; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1183; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr addrspace(2)184; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr addrspace(2), i1 } poison, ptr addrspace(2) [[TMP5]], 0185; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr addrspace(2), i1 } [[TMP6]], i1 [[TMP4]], 1186; CHECK-NEXT: ret void187;188 cmpxchg ptr addrspace(1) %ptr, ptr addrspace(2) null, ptr addrspace(2) %v seq_cst seq_cst189 ret void190}191 192