347 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals2; RUN: opt -S -mtriple=aarch64-linux-gnu -passes=atomic-expand %s | FileCheck %s3 4define float @test_atomicrmw_fadd_f32(ptr %ptr, float %value) !prof !0 {5; CHECK-LABEL: @test_atomicrmw_fadd_f32(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]], !prof [[PROF1:![0-9]+]]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 @test_atomicrmw_fsub_f32(ptr %ptr, float %value) {26; CHECK-LABEL: @test_atomicrmw_fsub_f32(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_fmin_double(ptr %ptr, double %value) {89; CHECK-LABEL: @atomicrmw_fmin_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:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]94; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.minnum.f64(double [[LOADED]], double [[VALUE:%.*]])95; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i6496; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i6497; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 898; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 199; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0100; CHECK-NEXT: [[TMP6]] = 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 [[TMP6]]104;105 %res = atomicrmw fmin ptr %ptr, double %value seq_cst106 ret double %res107}108 109define double @atomicrmw_fmax_double(ptr %ptr, double %value) {110; CHECK-LABEL: @atomicrmw_fmax_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:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]115; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.maxnum.f64(double [[LOADED]], double [[VALUE:%.*]])116; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64117; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64118; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8119; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1120; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0121; CHECK-NEXT: [[TMP6]] = 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 [[TMP6]]125;126 %res = atomicrmw fmax ptr %ptr, double %value seq_cst127 ret double %res128}129 130define float @atomicrmw_fminimum_float(ptr %ptr, float %value) {131; CHECK-LABEL: @atomicrmw_fminimum_float(132; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4133; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]134; CHECK: atomicrmw.start:135; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]136; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.minimum.f32(float [[LOADED]], float [[VALUE:%.*]])137; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i32138; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i32139; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4140; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1141; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0142; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float143; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]144; CHECK: atomicrmw.end:145; CHECK-NEXT: ret float [[TMP6]]146;147 %res = atomicrmw fminimum ptr %ptr, float %value seq_cst148 ret float %res149}150 151define float @atomicrmw_fmaximum_float(ptr %ptr, float %value) {152; CHECK-LABEL: @atomicrmw_fmaximum_float(153; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4154; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]155; CHECK: atomicrmw.start:156; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]157; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.maximum.f32(float [[LOADED]], float [[VALUE:%.*]])158; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i32159; CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[LOADED]] to i32160; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4161; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1162; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0163; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to float164; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]165; CHECK: atomicrmw.end:166; CHECK-NEXT: ret float [[TMP6]]167;168 %res = atomicrmw fmaximum ptr %ptr, float %value seq_cst169 ret float %res170}171 172define double @atomicrmw_fminimum_double(ptr %ptr, double %value) {173; CHECK-LABEL: @atomicrmw_fminimum_double(174; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8175; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]176; CHECK: atomicrmw.start:177; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]178; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.minimum.f64(double [[LOADED]], double [[VALUE:%.*]])179; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64180; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64181; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8182; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1183; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0184; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double185; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]186; CHECK: atomicrmw.end:187; CHECK-NEXT: ret double [[TMP6]]188;189 %res = atomicrmw fminimum ptr %ptr, double %value seq_cst190 ret double %res191}192 193define double @atomicrmw_fmaximum_double(ptr %ptr, double %value) {194; CHECK-LABEL: @atomicrmw_fmaximum_double(195; CHECK-NEXT: [[TMP1:%.*]] = load double, ptr [[PTR:%.*]], align 8196; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]197; CHECK: atomicrmw.start:198; CHECK-NEXT: [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]199; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.maximum.f64(double [[LOADED]], double [[VALUE:%.*]])200; CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64201; CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[LOADED]] to i64202; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst, align 8203; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1204; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0205; CHECK-NEXT: [[TMP6]] = bitcast i64 [[NEWLOADED]] to double206; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]207; CHECK: atomicrmw.end:208; CHECK-NEXT: ret double [[TMP6]]209;210 %res = atomicrmw fmaximum ptr %ptr, double %value seq_cst211 ret double %res212}213 214define bfloat @atomicrmw_fmaximum_bfloat(ptr %ptr, bfloat %val) {215; CHECK-LABEL: @atomicrmw_fmaximum_bfloat(216; CHECK-NEXT: [[TMP1:%.*]] = load bfloat, ptr [[PTR:%.*]], align 2217; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]218; CHECK: atomicrmw.start:219; CHECK-NEXT: [[LOADED:%.*]] = phi bfloat [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]220; CHECK-NEXT: [[TMP2:%.*]] = call bfloat @llvm.maximum.bf16(bfloat [[LOADED]], bfloat [[VAL:%.*]])221; CHECK-NEXT: [[TMP3:%.*]] = bitcast bfloat [[TMP2]] to i16222; CHECK-NEXT: [[TMP4:%.*]] = bitcast bfloat [[LOADED]] to i16223; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst, align 2224; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1225; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0226; CHECK-NEXT: [[TMP6]] = bitcast i16 [[NEWLOADED]] to bfloat227; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]228; CHECK: atomicrmw.end:229; CHECK-NEXT: ret bfloat [[TMP6]]230;231 %res = atomicrmw fmaximum ptr %ptr, bfloat %val seq_cst232 ret bfloat %res233}234 235define half @atomicrmw_fmaximum_half(ptr %ptr, half %val) {236; CHECK-LABEL: @atomicrmw_fmaximum_half(237; CHECK-NEXT: [[TMP1:%.*]] = load half, ptr [[PTR:%.*]], align 2238; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]239; CHECK: atomicrmw.start:240; CHECK-NEXT: [[LOADED:%.*]] = phi half [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]241; CHECK-NEXT: [[TMP2:%.*]] = call half @llvm.maximum.f16(half [[LOADED]], half [[VAL:%.*]])242; CHECK-NEXT: [[TMP3:%.*]] = bitcast half [[TMP2]] to i16243; CHECK-NEXT: [[TMP4:%.*]] = bitcast half [[LOADED]] to i16244; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst, align 2245; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1246; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0247; CHECK-NEXT: [[TMP6]] = bitcast i16 [[NEWLOADED]] to half248; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]249; CHECK: atomicrmw.end:250; CHECK-NEXT: ret half [[TMP6]]251;252 %res = atomicrmw fmaximum ptr %ptr, half %val seq_cst253 ret half %res254}255 256define <2 x half> @atomicrmw_fmaximum_2_x_half(ptr %ptr, <2 x half> %val) {257; CHECK-LABEL: @atomicrmw_fmaximum_2_x_half(258; CHECK-NEXT: [[TMP1:%.*]] = load <2 x half>, ptr [[PTR:%.*]], align 4259; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]260; CHECK: atomicrmw.start:261; CHECK-NEXT: [[LOADED:%.*]] = phi <2 x half> [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]262; CHECK-NEXT: [[TMP2:%.*]] = call <2 x half> @llvm.maximum.v2f16(<2 x half> [[LOADED]], <2 x half> [[VAL:%.*]])263; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x half> [[TMP2]] to i32264; CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x half> [[LOADED]] to i32265; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4266; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1267; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0268; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to <2 x half>269; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]270; CHECK: atomicrmw.end:271; CHECK-NEXT: ret <2 x half> [[TMP6]]272;273 %res = atomicrmw fmaximum ptr %ptr, <2 x half> %val seq_cst274 ret <2 x half> %res275}276 277define bfloat @atomicrmw_fminimum_bfloat(ptr %ptr, bfloat %val) {278; CHECK-LABEL: @atomicrmw_fminimum_bfloat(279; CHECK-NEXT: [[TMP1:%.*]] = load bfloat, ptr [[PTR:%.*]], align 2280; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]281; CHECK: atomicrmw.start:282; CHECK-NEXT: [[LOADED:%.*]] = phi bfloat [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]283; CHECK-NEXT: [[TMP2:%.*]] = call bfloat @llvm.minimum.bf16(bfloat [[LOADED]], bfloat [[VAL:%.*]])284; CHECK-NEXT: [[TMP3:%.*]] = bitcast bfloat [[TMP2]] to i16285; CHECK-NEXT: [[TMP4:%.*]] = bitcast bfloat [[LOADED]] to i16286; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst, align 2287; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1288; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0289; CHECK-NEXT: [[TMP6]] = bitcast i16 [[NEWLOADED]] to bfloat290; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]291; CHECK: atomicrmw.end:292; CHECK-NEXT: ret bfloat [[TMP6]]293;294 %res = atomicrmw fminimum ptr %ptr, bfloat %val seq_cst295 ret bfloat %res296}297 298define half @atomicrmw_fminimum_half(ptr %ptr, half %val) {299; CHECK-LABEL: @atomicrmw_fminimum_half(300; CHECK-NEXT: [[TMP1:%.*]] = load half, ptr [[PTR:%.*]], align 2301; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]302; CHECK: atomicrmw.start:303; CHECK-NEXT: [[LOADED:%.*]] = phi half [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]304; CHECK-NEXT: [[TMP2:%.*]] = call half @llvm.minimum.f16(half [[LOADED]], half [[VAL:%.*]])305; CHECK-NEXT: [[TMP3:%.*]] = bitcast half [[TMP2]] to i16306; CHECK-NEXT: [[TMP4:%.*]] = bitcast half [[LOADED]] to i16307; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst, align 2308; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1309; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0310; CHECK-NEXT: [[TMP6]] = bitcast i16 [[NEWLOADED]] to half311; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]312; CHECK: atomicrmw.end:313; CHECK-NEXT: ret half [[TMP6]]314;315 %res = atomicrmw fminimum ptr %ptr, half %val seq_cst316 ret half %res317}318 319define <2 x half> @atomicrmw_fminimum_2_x_half(ptr %ptr, <2 x half> %val) {320; CHECK-LABEL: @atomicrmw_fminimum_2_x_half(321; CHECK-NEXT: [[TMP1:%.*]] = load <2 x half>, ptr [[PTR:%.*]], align 4322; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]323; CHECK: atomicrmw.start:324; CHECK-NEXT: [[LOADED:%.*]] = phi <2 x half> [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]325; CHECK-NEXT: [[TMP2:%.*]] = call <2 x half> @llvm.minimum.v2f16(<2 x half> [[LOADED]], <2 x half> [[VAL:%.*]])326; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x half> [[TMP2]] to i32327; CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x half> [[LOADED]] to i32328; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst, align 4329; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1330; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0331; CHECK-NEXT: [[TMP6]] = bitcast i32 [[NEWLOADED]] to <2 x half>332; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]333; CHECK: atomicrmw.end:334; CHECK-NEXT: ret <2 x half> [[TMP6]]335;336 %res = atomicrmw fminimum ptr %ptr, <2 x half> %val seq_cst337 ret <2 x half> %res338}339 340!0 = !{!"function_entry_count", i64 1000}341;.342; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none) }343;.344; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}345; CHECK: [[PROF1]] = !{!"unknown", !"atomic-expand"}346;.347