https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/139530
None >From 012d451378314c9633c3a38891fca23c027e54b5 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Mon, 12 May 2025 10:42:16 +0200 Subject: [PATCH] AMDGPU: Disable most fmed3 folds for strictfp --- .../lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp | 3 +++ llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp index e76396f6ffbb0..1494428cb2bf5 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp @@ -855,6 +855,9 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { return IC.replaceInstUsesWith(II, Src); } + if (II.isStrictFP()) + break; + // Checking for NaN before canonicalization provides better fidelity when // mapping other operations onto fmed3 since the order of operands is // unchanged. diff --git a/llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll b/llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll index 5274ac1093a26..bf94637b36a34 100644 --- a/llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll +++ b/llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll @@ -494,7 +494,7 @@ define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_y_snan1_f32(float %x, float %y) # define float @fmed3_qnan0_x_y_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_qnan0_x_y_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3:[0-9]+]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float [[X]], float [[Y]]) #[[ATTR5:[0-9]+]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float %x, float %y) strictfp @@ -504,7 +504,7 @@ define float @fmed3_qnan0_x_y_f32_strictfp(float %x, float %y) #2 { define float @fmed3_x_qnan0_y_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_x_qnan0_y_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF8000000000000, float [[Y]]) #[[ATTR5]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF8000000000000, float %y) strictfp @@ -514,7 +514,7 @@ define float @fmed3_x_qnan0_y_f32_strictfp(float %x, float %y) #2 { define float @fmed3_x_y_qnan0_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_x_y_qnan0_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF8000000000000) #[[ATTR5]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF8000000000000) strictfp @@ -524,7 +524,7 @@ define float @fmed3_x_y_qnan0_f32_strictfp(float %x, float %y) #2 { define float @fmed3_snan1_x_y_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_snan1_x_y_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float [[X]], float [[Y]]) #[[ATTR5]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float %x, float %y) strictfp @@ -534,7 +534,7 @@ define float @fmed3_snan1_x_y_f32_strictfp(float %x, float %y) #2 { define float @fmed3_x_snan1_y_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_x_snan1_y_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF4000000000000, float [[Y]]) #[[ATTR5]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float 0x7FF4000000000000, float %y) strictfp @@ -544,7 +544,7 @@ define float @fmed3_x_snan1_y_f32_strictfp(float %x, float %y) #2 { define float @fmed3_x_y_snan1_f32_strictfp(float %x, float %y) #2 { ; CHECK-LABEL: define float @fmed3_x_y_snan1_f32_strictfp( ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] { -; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]]) +; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF4000000000000) #[[ATTR5]] ; CHECK-NEXT: ret float [[MED3]] ; %med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000) strictfp _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits