171 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S --mtriple=loongarch64 --passes=atomic-expand --mattr=+d %s | FileCheck %s3 4define float @atomicrmw_fadd_float(ptr %ptr, float %value) {5; CHECK-LABEL: @atomicrmw_fadd_float(6; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 47; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]8; CHECK: atomicrmw.start:9; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]10; CHECK-NEXT: [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]11; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i3212; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i3213; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] seq_cst seq_cst, align 414; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 115; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 016; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float17; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]18; CHECK: atomicrmw.end:19; CHECK-NEXT: ret float [[TMP5]]20;21 %res = atomicrmw fadd ptr %ptr, float %value seq_cst22 ret float %res23}24 25define float @atomicrmw_fsub_float(ptr %ptr, float %value) {26; CHECK-LABEL: @atomicrmw_fsub_float(27; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 428; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]29; CHECK: atomicrmw.start:30; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]31; CHECK-NEXT: [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]32; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i3233; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i3234; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] seq_cst seq_cst, align 435; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 136; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 037; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float38; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]39; CHECK: atomicrmw.end:40; CHECK-NEXT: ret float [[TMP5]]41;42 %res = atomicrmw fsub ptr %ptr, float %value seq_cst43 ret float %res44}45 46define float @atomicrmw_fmin_float(ptr %ptr, float %value) {47; CHECK-LABEL: @atomicrmw_fmin_float(48; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 449; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]50; CHECK: atomicrmw.start:51; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]52; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.minnum.f32(float [[LOADED]], float [[VALUE:%.*]])53; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i3254; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i3255; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 456; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 157; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 058; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float59; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]60; CHECK: atomicrmw.end:61; CHECK-NEXT: ret float [[TMP6]]62;63 %res = atomicrmw fmin ptr %ptr, float %value seq_cst64 ret float %res65}66 67define float @atomicrmw_fmax_float(ptr %ptr, float %value) {68; CHECK-LABEL: @atomicrmw_fmax_float(69; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 470; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]71; CHECK: atomicrmw.start:72; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]73; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[LOADED]], float [[VALUE:%.*]])74; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i3275; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i3276; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 477; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 178; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 079; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float80; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]81; CHECK: atomicrmw.end:82; CHECK-NEXT: ret float [[TMP6]]83;84 %res = atomicrmw fmax ptr %ptr, float %value seq_cst85 ret float %res86}87 88define double @atomicrmw_fadd_double(ptr %ptr, double %value) {89; CHECK-LABEL: @atomicrmw_fadd_double(90; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 891; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]92; CHECK: atomicrmw.start:93; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]94; CHECK-NEXT: [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]95; CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[NEW]] to i6496; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[LOADED]] to i6497; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP3]], i64 [[TMP2]] seq_cst seq_cst, align 898; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 199; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0100; CHECK-NEXT: [[TMP5]] = bitcast i64 [[NEWLOADED]] to double101; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]102; CHECK: atomicrmw.end:103; CHECK-NEXT: ret double [[TMP5]]104;105 %res = atomicrmw fadd ptr %ptr, double %value seq_cst106 ret double %res107}108 109define double @atomicrmw_fsub_double(ptr %ptr, double %value) {110; CHECK-LABEL: @atomicrmw_fsub_double(111; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8112; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]113; CHECK: atomicrmw.start:114; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]115; CHECK-NEXT: [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]]116; CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[NEW]] to i64117; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[LOADED]] to i64118; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP3]], i64 [[TMP2]] seq_cst seq_cst, align 8119; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 1120; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0121; CHECK-NEXT: [[TMP5]] = bitcast i64 [[NEWLOADED]] to double122; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]123; CHECK: atomicrmw.end:124; CHECK-NEXT: ret double [[TMP5]]125;126 %res = atomicrmw fsub ptr %ptr, double %value seq_cst127 ret double %res128}129 130define double @atomicrmw_fmin_double(ptr %ptr, double %value) {131; CHECK-LABEL: @atomicrmw_fmin_double(132; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8133; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]134; CHECK: atomicrmw.start:135; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]136; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.minnum.f64(double [[LOADED]], double [[VALUE:%.*]])137; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64138; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64139; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8140; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1141; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0142; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double143; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]144; CHECK: atomicrmw.end:145; CHECK-NEXT: ret double [[TMP6]]146;147 %res = atomicrmw fmin ptr %ptr, double %value seq_cst148 ret double %res149}150 151define double @atomicrmw_fmax_double(ptr %ptr, double %value) {152; CHECK-LABEL: @atomicrmw_fmax_double(153; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8154; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]155; CHECK: atomicrmw.start:156; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]157; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]])158; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64159; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64160; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8161; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1162; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0163; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double164; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]165; CHECK: atomicrmw.end:166; CHECK-NEXT: ret double [[TMP6]]167;168 %res = atomicrmw fmax ptr %ptr, double %value seq_cst169 ret double %res170}171