Skip to content

Commit 386e7c8

Browse files
committed
adds test and update to check denormals being flushed
1 parent bf21f85 commit 386e7c8

File tree

2 files changed

+53
-17
lines changed

2 files changed

+53
-17
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8047,9 +8047,9 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80478047
case FCmpInst::FCMP_OGE:
80488048
case FCmpInst::FCMP_OLE: {
80498049
if (!LHSI->hasNoNaNs() && !LHSI->hasNoInfs() &&
8050-
!isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
8051-
getSimplifyQuery().getWithInstruction(&I)) &&
80528050
!isKnownNeverInfinity(LHSI->getOperand(1), /*Depth=*/0,
8051+
getSimplifyQuery().getWithInstruction(&I)) &&
8052+
!isKnownNeverInfinity(LHSI->getOperand(0), /*Depth=*/0,
80538053
getSimplifyQuery().getWithInstruction(&I)))
80548054
break;
80558055
}
@@ -8061,7 +8061,10 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80618061
case FCmpInst::FCMP_UGE:
80628062
case FCmpInst::FCMP_ULE:
80638063
if (match(RHSC, m_AnyZeroFP()) &&
8064-
match(LHSI, m_FSub(m_Value(X), m_Value(Y)))) {
8064+
match(LHSI, m_FSub(m_Value(X), m_Value(Y))) &&
8065+
I.getFunction()->getDenormalMode(
8066+
LHSI->getType()->getScalarType()->getFltSemantics()) ==
8067+
DenormalMode::getIEEE()) {
80658068
replaceOperand(I, 0, X);
80668069
replaceOperand(I, 1, Y);
80678070
return &I;

llvm/test/Transforms/InstCombine/fcmp.ll

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,7 @@ define <1 x i1> @bitcast_1vec_eq0(i32 %x) {
12891289

12901290
define i1 @fcmp_fadd_zero_ugt(float %x, float %y) {
12911291
; CHECK-LABEL: @fcmp_fadd_zero_ugt(
1292-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[ADD:%.*]], [[Y:%.*]]
1292+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]]
12931293
; CHECK-NEXT: ret i1 [[CMP]]
12941294
;
12951295
%add = fadd float %x, 0.000000e+00
@@ -1299,7 +1299,7 @@ define i1 @fcmp_fadd_zero_ugt(float %x, float %y) {
12991299

13001300
define i1 @fcmp_fadd_zero_uge(float %x, float %y) {
13011301
; CHECK-LABEL: @fcmp_fadd_zero_uge(
1302-
; CHECK-NEXT: [[CMP:%.*]] = fcmp uge float [[ADD:%.*]], [[Y:%.*]]
1302+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uge float [[X:%.*]], [[Y:%.*]]
13031303
; CHECK-NEXT: ret i1 [[CMP]]
13041304
;
13051305
%add = fadd float %x, 0.000000e+00
@@ -1309,7 +1309,7 @@ define i1 @fcmp_fadd_zero_uge(float %x, float %y) {
13091309

13101310
define i1 @fcmp_fadd_zero_ogt(float %x, float %y) {
13111311
; CHECK-LABEL: @fcmp_fadd_zero_ogt(
1312-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[ADD:%.*]], [[Y:%.*]]
1312+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]]
13131313
; CHECK-NEXT: ret i1 [[CMP]]
13141314
;
13151315
%add = fadd float %x, 0.000000e+00
@@ -1319,7 +1319,7 @@ define i1 @fcmp_fadd_zero_ogt(float %x, float %y) {
13191319

13201320
define i1 @fcmp_fadd_zero_oge(float %x, float %y) {
13211321
; CHECK-LABEL: @fcmp_fadd_zero_oge(
1322-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge float [[ADD:%.*]], [[Y:%.*]]
1322+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge float [[X:%.*]], [[Y:%.*]]
13231323
; CHECK-NEXT: ret i1 [[CMP]]
13241324
;
13251325
%add = fadd float %x, 0.000000e+00
@@ -1329,7 +1329,7 @@ define i1 @fcmp_fadd_zero_oge(float %x, float %y) {
13291329

13301330
define i1 @fcmp_fadd_zero_ult(float %x, float %y) {
13311331
; CHECK-LABEL: @fcmp_fadd_zero_ult(
1332-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult float [[ADD:%.*]], [[Y:%.*]]
1332+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult float [[X:%.*]], [[Y:%.*]]
13331333
; CHECK-NEXT: ret i1 [[CMP]]
13341334
;
13351335
%add = fadd float %x, 0.000000e+00
@@ -1339,7 +1339,7 @@ define i1 @fcmp_fadd_zero_ult(float %x, float %y) {
13391339

13401340
define i1 @fcmp_fadd_zero_ule(float %x, float %y) {
13411341
; CHECK-LABEL: @fcmp_fadd_zero_ule(
1342-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ule float [[ADD:%.*]], [[Y:%.*]]
1342+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ule float [[X:%.*]], [[Y:%.*]]
13431343
; CHECK-NEXT: ret i1 [[CMP]]
13441344
;
13451345
%add = fadd float %x, 0.000000e+00
@@ -1349,7 +1349,7 @@ define i1 @fcmp_fadd_zero_ule(float %x, float %y) {
13491349

13501350
define i1 @fcmp_fadd_zero_olt(float %x, float %y) {
13511351
; CHECK-LABEL: @fcmp_fadd_zero_olt(
1352-
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[ADD:%.*]], [[Y:%.*]]
1352+
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
13531353
; CHECK-NEXT: ret i1 [[CMP]]
13541354
;
13551355
%add = fadd float %x, 0.000000e+00
@@ -1359,7 +1359,7 @@ define i1 @fcmp_fadd_zero_olt(float %x, float %y) {
13591359

13601360
define i1 @fcmp_fadd_zero_ole(float %x, float %y) {
13611361
; CHECK-LABEL: @fcmp_fadd_zero_ole(
1362-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole float [[ADD:%.*]], [[Y:%.*]]
1362+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole float [[X:%.*]], [[Y:%.*]]
13631363
; CHECK-NEXT: ret i1 [[CMP]]
13641364
;
13651365
%add = fadd float %x, 0.000000e+00
@@ -1369,7 +1369,7 @@ define i1 @fcmp_fadd_zero_ole(float %x, float %y) {
13691369

13701370
define i1 @fcmp_fadd_zero_oeq(float %x, float %y) {
13711371
; CHECK-LABEL: @fcmp_fadd_zero_oeq(
1372-
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ADD:%.*]], [[Y:%.*]]
1372+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]]
13731373
; CHECK-NEXT: ret i1 [[CMP]]
13741374
;
13751375
%add = fadd float %x, 0.000000e+00
@@ -1379,7 +1379,7 @@ define i1 @fcmp_fadd_zero_oeq(float %x, float %y) {
13791379

13801380
define i1 @fcmp_fadd_zero_one(float %x, float %y) {
13811381
; CHECK-LABEL: @fcmp_fadd_zero_one(
1382-
; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[ADD:%.*]], [[Y:%.*]]
1382+
; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[X:%.*]], [[Y:%.*]]
13831383
; CHECK-NEXT: ret i1 [[CMP]]
13841384
;
13851385
%add = fadd float %x, 0.000000e+00
@@ -1389,7 +1389,7 @@ define i1 @fcmp_fadd_zero_one(float %x, float %y) {
13891389

13901390
define i1 @fcmp_fadd_zero_ueq(float %x, float %y) {
13911391
; CHECK-LABEL: @fcmp_fadd_zero_ueq(
1392-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq float [[ADD:%.*]], [[Y:%.*]]
1392+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq float [[X:%.*]], [[Y:%.*]]
13931393
; CHECK-NEXT: ret i1 [[CMP]]
13941394
;
13951395
%add = fadd float %x, 0.000000e+00
@@ -1399,7 +1399,7 @@ define i1 @fcmp_fadd_zero_ueq(float %x, float %y) {
13991399

14001400
define i1 @fcmp_fadd_zero_une(float %x, float %y) {
14011401
; CHECK-LABEL: @fcmp_fadd_zero_une(
1402-
; CHECK-NEXT: [[CMP:%.*]] = fcmp une float [[ADD:%.*]], [[Y:%.*]]
1402+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une float [[X:%.*]], [[Y:%.*]]
14031403
; CHECK-NEXT: ret i1 [[CMP]]
14041404
;
14051405
%add = fadd float %x, 0.000000e+00
@@ -1409,7 +1409,7 @@ define i1 @fcmp_fadd_zero_une(float %x, float %y) {
14091409

14101410
define i1 @fcmp_fadd_zero_ord(float %x, float %y) {
14111411
; CHECK-LABEL: @fcmp_fadd_zero_ord(
1412-
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord float [[ADD:%.*]], [[Y:%.*]]
1412+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord float [[X:%.*]], [[Y:%.*]]
14131413
; CHECK-NEXT: ret i1 [[CMP]]
14141414
;
14151415
%add = fadd float %x, 0.000000e+00
@@ -1419,7 +1419,7 @@ define i1 @fcmp_fadd_zero_ord(float %x, float %y) {
14191419

14201420
define i1 @fcmp_fadd_zero_uno(float %x, float %y) {
14211421
; CHECK-LABEL: @fcmp_fadd_zero_uno(
1422-
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno float [[ADD:%.*]], [[Y:%.*]]
1422+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno float [[X:%.*]], [[Y:%.*]]
14231423
; CHECK-NEXT: ret i1 [[CMP]]
14241424
;
14251425
%add = fadd float %x, 0.000000e+00
@@ -2054,3 +2054,36 @@ define <8 x i1> @fcmp_une_fsub_const_nnan_vec(<8 x float> %x, <8 x float> %y) {
20542054
%cmp = fcmp nnan une <8 x float> %fs, zeroinitializer
20552055
ret <8 x i1> %cmp
20562056
}
2057+
2058+
define <8 x i1> @fcmp_ugt_fsub_const_vec_denormal_positive-zero(<8 x float> %x, <8 x float> %y) "denormal-fp-math"="positive-zero" {
2059+
; CHECK-LABEL: @fcmp_ugt_fsub_const_vec_denormal_positive-zero(
2060+
; CHECK-NEXT: [[FS:%.*]] = fsub <8 x float> [[X:%.*]], [[Y:%.*]]
2061+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt <8 x float> [[FS]], zeroinitializer
2062+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
2063+
;
2064+
%fs = fsub <8 x float> %x, %y
2065+
%cmp = fcmp ogt <8 x float> %fs, zeroinitializer
2066+
ret <8 x i1> %cmp
2067+
}
2068+
2069+
define <8 x i1> @fcmp_ogt_fsub_const_vec_denormal_dynamic(<8 x float> %x, <8 x float> %y) "denormal-fp-math"="dynamic,dynamic" {
2070+
; CHECK-LABEL: @fcmp_ogt_fsub_const_vec_denormal_dynamic(
2071+
; CHECK-NEXT: [[FS:%.*]] = fsub <8 x float> [[X:%.*]], [[Y:%.*]]
2072+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt <8 x float> [[FS]], zeroinitializer
2073+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
2074+
;
2075+
%fs = fsub <8 x float> %x, %y
2076+
%cmp = fcmp ogt <8 x float> %fs, zeroinitializer
2077+
ret <8 x i1> %cmp
2078+
}
2079+
2080+
define <8 x i1> @fcmp_ogt_fsub_const_vec_denormal_preserve-sign(<8 x float> %x, <8 x float> %y) "denormal-fp-math"="preserve-sign" {
2081+
; CHECK-LABEL: @fcmp_ogt_fsub_const_vec_denormal_preserve-sign(
2082+
; CHECK-NEXT: [[FS:%.*]] = fsub <8 x float> [[X:%.*]], [[Y:%.*]]
2083+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt <8 x float> [[FS]], zeroinitializer
2084+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
2085+
;
2086+
%fs = fsub <8 x float> %x, %y
2087+
%cmp = fcmp ogt <8 x float> %fs, zeroinitializer
2088+
ret <8 x i1> %cmp
2089+
}

0 commit comments

Comments
 (0)