Skip to content

Commit 012d451

Browse files
committed
AMDGPU: Disable most fmed3 folds for strictfp
1 parent dfc0255 commit 012d451

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,9 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
855855
return IC.replaceInstUsesWith(II, Src);
856856
}
857857

858+
if (II.isStrictFP())
859+
break;
860+
858861
// Checking for NaN before canonicalization provides better fidelity when
859862
// mapping other operations onto fmed3 since the order of operands is
860863
// unchanged.

llvm/test/Transforms/InstCombine/AMDGPU/fmed3.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ define amdgpu_ps float @amdgpu_ps_attr_fmed3_x_y_snan1_f32(float %x, float %y) #
494494
define float @fmed3_qnan0_x_y_f32_strictfp(float %x, float %y) #2 {
495495
; CHECK-LABEL: define float @fmed3_qnan0_x_y_f32_strictfp(
496496
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3:[0-9]+]] {
497-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])
497+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF8000000000000, float [[X]], float [[Y]]) #[[ATTR5:[0-9]+]]
498498
; CHECK-NEXT: ret float [[MED3]]
499499
;
500500
%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 {
504504
define float @fmed3_x_qnan0_y_f32_strictfp(float %x, float %y) #2 {
505505
; CHECK-LABEL: define float @fmed3_x_qnan0_y_f32_strictfp(
506506
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {
507-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])
507+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF8000000000000, float [[Y]]) #[[ATTR5]]
508508
; CHECK-NEXT: ret float [[MED3]]
509509
;
510510
%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 {
514514
define float @fmed3_x_y_qnan0_f32_strictfp(float %x, float %y) #2 {
515515
; CHECK-LABEL: define float @fmed3_x_y_qnan0_f32_strictfp(
516516
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {
517-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]])
517+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF8000000000000) #[[ATTR5]]
518518
; CHECK-NEXT: ret float [[MED3]]
519519
;
520520
%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 {
524524
define float @fmed3_snan1_x_y_f32_strictfp(float %x, float %y) #2 {
525525
; CHECK-LABEL: define float @fmed3_snan1_x_y_f32_strictfp(
526526
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {
527-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])
527+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float 0x7FF4000000000000, float [[X]], float [[Y]]) #[[ATTR5]]
528528
; CHECK-NEXT: ret float [[MED3]]
529529
;
530530
%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 {
534534
define float @fmed3_x_snan1_y_f32_strictfp(float %x, float %y) #2 {
535535
; CHECK-LABEL: define float @fmed3_x_snan1_y_f32_strictfp(
536536
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {
537-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y]])
537+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float 0x7FF4000000000000, float [[Y]]) #[[ATTR5]]
538538
; CHECK-NEXT: ret float [[MED3]]
539539
;
540540
%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 {
544544
define float @fmed3_x_y_snan1_f32_strictfp(float %x, float %y) #2 {
545545
; CHECK-LABEL: define float @fmed3_x_y_snan1_f32_strictfp(
546546
; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) #[[ATTR3]] {
547-
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.maxnum.f32(float [[X]], float [[Y]])
547+
; CHECK-NEXT: [[MED3:%.*]] = call float @llvm.amdgcn.fmed3.f32(float [[X]], float [[Y]], float 0x7FF4000000000000) #[[ATTR5]]
548548
; CHECK-NEXT: ret float [[MED3]]
549549
;
550550
%med3 = call float @llvm.amdgcn.fmed3.f32(float %x, float %y, float 0x7FF4000000000000) strictfp

0 commit comments

Comments
 (0)