119ae5391Sgonglingqin; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*fe42e72dSRishabh Bali; RUN: opt -S --mtriple=loongarch64 --passes=atomic-expand --mattr=+d %s | FileCheck %s 319ae5391Sgonglingqin 419ae5391Sgonglingqindefine float @atomicrmw_fadd_float(ptr %ptr, float %value) { 519ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fadd_float( 619ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 719ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 819ae5391Sgonglingqin; CHECK: atomicrmw.start: 919ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 1019ae5391Sgonglingqin; CHECK-NEXT: [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]] 1119ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i32 1219ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i32 1319ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] seq_cst seq_cst, align 4 1419ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1 1519ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0 1619ae5391Sgonglingqin; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float 1719ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 1819ae5391Sgonglingqin; CHECK: atomicrmw.end: 1919ae5391Sgonglingqin; CHECK-NEXT: ret float [[TMP5]] 2019ae5391Sgonglingqin; 2119ae5391Sgonglingqin %res = atomicrmw fadd ptr %ptr, float %value seq_cst 2219ae5391Sgonglingqin ret float %res 2319ae5391Sgonglingqin} 2419ae5391Sgonglingqin 2519ae5391Sgonglingqindefine float @atomicrmw_fsub_float(ptr %ptr, float %value) { 2619ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fsub_float( 2719ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 2819ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 2919ae5391Sgonglingqin; CHECK: atomicrmw.start: 3019ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 3119ae5391Sgonglingqin; CHECK-NEXT: [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]] 3219ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i32 3319ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i32 3419ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] seq_cst seq_cst, align 4 3519ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1 3619ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0 3719ae5391Sgonglingqin; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float 3819ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 3919ae5391Sgonglingqin; CHECK: atomicrmw.end: 4019ae5391Sgonglingqin; CHECK-NEXT: ret float [[TMP5]] 4119ae5391Sgonglingqin; 4219ae5391Sgonglingqin %res = atomicrmw fsub ptr %ptr, float %value seq_cst 4319ae5391Sgonglingqin ret float %res 4419ae5391Sgonglingqin} 4519ae5391Sgonglingqin 4619ae5391Sgonglingqindefine float @atomicrmw_fmin_float(ptr %ptr, float %value) { 4719ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fmin_float( 4819ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 4919ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 5019ae5391Sgonglingqin; CHECK: atomicrmw.start: 5119ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ] 5219ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.minnum.f32(float [[LOADED]], float [[VALUE:%.*]]) 5319ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i32 5419ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i32 5519ae5391Sgonglingqin; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4 5619ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1 5719ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0 5819ae5391Sgonglingqin; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float 5919ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 6019ae5391Sgonglingqin; CHECK: atomicrmw.end: 6119ae5391Sgonglingqin; CHECK-NEXT: ret float [[TMP6]] 6219ae5391Sgonglingqin; 6319ae5391Sgonglingqin %res = atomicrmw fmin ptr %ptr, float %value seq_cst 6419ae5391Sgonglingqin ret float %res 6519ae5391Sgonglingqin} 6619ae5391Sgonglingqin 6719ae5391Sgonglingqindefine float @atomicrmw_fmax_float(ptr %ptr, float %value) { 6819ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fmax_float( 6919ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 7019ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 7119ae5391Sgonglingqin; CHECK: atomicrmw.start: 7219ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ] 7319ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.maxnum.f32(float [[LOADED]], float [[VALUE:%.*]]) 7419ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i32 7519ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i32 7619ae5391Sgonglingqin; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4 7719ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1 7819ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0 7919ae5391Sgonglingqin; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float 8019ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 8119ae5391Sgonglingqin; CHECK: atomicrmw.end: 8219ae5391Sgonglingqin; CHECK-NEXT: ret float [[TMP6]] 8319ae5391Sgonglingqin; 8419ae5391Sgonglingqin %res = atomicrmw fmax ptr %ptr, float %value seq_cst 8519ae5391Sgonglingqin ret float %res 8619ae5391Sgonglingqin} 8719ae5391Sgonglingqin 8819ae5391Sgonglingqindefine double @atomicrmw_fadd_double(ptr %ptr, double %value) { 8919ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fadd_double( 9019ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8 9119ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 9219ae5391Sgonglingqin; CHECK: atomicrmw.start: 9319ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 9419ae5391Sgonglingqin; CHECK-NEXT: [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]] 9519ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[NEW]] to i64 9619ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[LOADED]] to i64 9719ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP3]], i64 [[TMP2]] seq_cst seq_cst, align 8 9819ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 1 9919ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0 10019ae5391Sgonglingqin; CHECK-NEXT: [[TMP5]] = bitcast i64 [[NEWLOADED]] to double 10119ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 10219ae5391Sgonglingqin; CHECK: atomicrmw.end: 10319ae5391Sgonglingqin; CHECK-NEXT: ret double [[TMP5]] 10419ae5391Sgonglingqin; 10519ae5391Sgonglingqin %res = atomicrmw fadd ptr %ptr, double %value seq_cst 10619ae5391Sgonglingqin ret double %res 10719ae5391Sgonglingqin} 10819ae5391Sgonglingqin 10919ae5391Sgonglingqindefine double @atomicrmw_fsub_double(ptr %ptr, double %value) { 11019ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fsub_double( 11119ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8 11219ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 11319ae5391Sgonglingqin; CHECK: atomicrmw.start: 11419ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 11519ae5391Sgonglingqin; CHECK-NEXT: [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]] 11619ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[NEW]] to i64 11719ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[LOADED]] to i64 11819ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP3]], i64 [[TMP2]] seq_cst seq_cst, align 8 11919ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 1 12019ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0 12119ae5391Sgonglingqin; CHECK-NEXT: [[TMP5]] = bitcast i64 [[NEWLOADED]] to double 12219ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 12319ae5391Sgonglingqin; CHECK: atomicrmw.end: 12419ae5391Sgonglingqin; CHECK-NEXT: ret double [[TMP5]] 12519ae5391Sgonglingqin; 12619ae5391Sgonglingqin %res = atomicrmw fsub ptr %ptr, double %value seq_cst 12719ae5391Sgonglingqin ret double %res 12819ae5391Sgonglingqin} 12919ae5391Sgonglingqin 13019ae5391Sgonglingqindefine double @atomicrmw_fmin_double(ptr %ptr, double %value) { 13119ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fmin_double( 13219ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8 13319ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 13419ae5391Sgonglingqin; CHECK: atomicrmw.start: 13519ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ] 13619ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.minnum.f64(double [[LOADED]], double [[VALUE:%.*]]) 13719ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64 13819ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64 13919ae5391Sgonglingqin; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8 14019ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1 14119ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0 14219ae5391Sgonglingqin; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double 14319ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 14419ae5391Sgonglingqin; CHECK: atomicrmw.end: 14519ae5391Sgonglingqin; CHECK-NEXT: ret double [[TMP6]] 14619ae5391Sgonglingqin; 14719ae5391Sgonglingqin %res = atomicrmw fmin ptr %ptr, double %value seq_cst 14819ae5391Sgonglingqin ret double %res 14919ae5391Sgonglingqin} 15019ae5391Sgonglingqin 15119ae5391Sgonglingqindefine double @atomicrmw_fmax_double(ptr %ptr, double %value) { 15219ae5391Sgonglingqin; CHECK-LABEL: @atomicrmw_fmax_double( 15319ae5391Sgonglingqin; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8 15419ae5391Sgonglingqin; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 15519ae5391Sgonglingqin; CHECK: atomicrmw.start: 15619ae5391Sgonglingqin; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ] 15719ae5391Sgonglingqin; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]]) 15819ae5391Sgonglingqin; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64 15919ae5391Sgonglingqin; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64 16019ae5391Sgonglingqin; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8 16119ae5391Sgonglingqin; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1 16219ae5391Sgonglingqin; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0 16319ae5391Sgonglingqin; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double 16419ae5391Sgonglingqin; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 16519ae5391Sgonglingqin; CHECK: atomicrmw.end: 16619ae5391Sgonglingqin; CHECK-NEXT: ret double [[TMP6]] 16719ae5391Sgonglingqin; 16819ae5391Sgonglingqin %res = atomicrmw fmax ptr %ptr, double %value seq_cst 16919ae5391Sgonglingqin ret double %res 17019ae5391Sgonglingqin} 171