From 78a1575301761e2fab0b29b235c5b943b084e0dc Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Wed, 1 Oct 2025 22:31:59 +0800 Subject: [PATCH 1/4] [InstCombine] Add pre-commit tests. NFC. --- .../test/Transforms/InstCombine/freeze-phi.ll | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/freeze-phi.ll b/llvm/test/Transforms/InstCombine/freeze-phi.ll index cdc9a5efe5933..36a5444c90350 100644 --- a/llvm/test/Transforms/InstCombine/freeze-phi.ll +++ b/llvm/test/Transforms/InstCombine/freeze-phi.ll @@ -212,3 +212,31 @@ D: %y.fr = freeze i32 %y ret i32 %y.fr } + +; Make sure that fmf in phi node is dropped when freeze get folded. + +define float @pr161524(float noundef %arg) { +; CHECK-LABEL: @pr161524( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[COND:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 144) +; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_EXIT:%.*]] +; CHECK: if.then: +; CHECK-NEXT: [[FADD:%.*]] = fadd float [[ARG]], 1.000000e+00 +; CHECK-NEXT: br label [[IF_EXIT]] +; CHECK: if.exit: +; CHECK-NEXT: [[RET:%.*]] = phi ninf float [ [[FADD]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ] +; CHECK-NEXT: ret float [[RET]] +; +entry: + %cond = tail call i1 @llvm.is.fpclass.f32(float %arg, i32 144) + br i1 %cond, label %if.then, label %if.exit + +if.then: + %fadd = fadd float %arg, 1.0 + br label %if.exit + +if.exit: + %ret = phi ninf float [ %fadd, %if.then ], [ %arg, %entry ] + %ret.fr = freeze float %ret + ret float %ret.fr +} From 7e71b3f0256f14424bf28c95daed3772ae485431 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Wed, 1 Oct 2025 22:47:48 +0800 Subject: [PATCH 2/4] [ValueTracking] Take PHI's poison-generating flags into account --- llvm/lib/Analysis/ValueTracking.cpp | 35 ++++++++++--------- .../test/Transforms/InstCombine/freeze-phi.ll | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 6f11b250cf21f..09a8fbea065ac 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -7651,25 +7651,26 @@ static bool isGuaranteedNotToBeUndefOrPoison( return true; } - if (const auto *PN = dyn_cast(V)) { - unsigned Num = PN->getNumIncomingValues(); - bool IsWellDefined = true; - for (unsigned i = 0; i < Num; ++i) { - if (PN == PN->getIncomingValue(i)) - continue; - auto *TI = PN->getIncomingBlock(i)->getTerminator(); - if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI, - DT, Depth + 1, Kind)) { - IsWellDefined = false; - break; + if (!::canCreateUndefOrPoison(Opr, Kind, + /*ConsiderFlagsAndMetadata=*/true)) { + if (const auto *PN = dyn_cast(V)) { + unsigned Num = PN->getNumIncomingValues(); + bool IsWellDefined = true; + for (unsigned i = 0; i < Num; ++i) { + if (PN == PN->getIncomingValue(i)) + continue; + auto *TI = PN->getIncomingBlock(i)->getTerminator(); + if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI, + DT, Depth + 1, Kind)) { + IsWellDefined = false; + break; + } } - } - if (IsWellDefined) + if (IsWellDefined) + return true; + } else if (all_of(Opr->operands(), OpCheck)) return true; - } else if (!::canCreateUndefOrPoison(Opr, Kind, - /*ConsiderFlagsAndMetadata*/ true) && - all_of(Opr->operands(), OpCheck)) - return true; + } } if (auto *I = dyn_cast(V)) diff --git a/llvm/test/Transforms/InstCombine/freeze-phi.ll b/llvm/test/Transforms/InstCombine/freeze-phi.ll index 36a5444c90350..62bb9dc31b76b 100644 --- a/llvm/test/Transforms/InstCombine/freeze-phi.ll +++ b/llvm/test/Transforms/InstCombine/freeze-phi.ll @@ -224,7 +224,7 @@ define float @pr161524(float noundef %arg) { ; CHECK-NEXT: [[FADD:%.*]] = fadd float [[ARG]], 1.000000e+00 ; CHECK-NEXT: br label [[IF_EXIT]] ; CHECK: if.exit: -; CHECK-NEXT: [[RET:%.*]] = phi ninf float [ [[FADD]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[RET:%.*]] = phi float [ [[FADD]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ] ; CHECK-NEXT: ret float [[RET]] ; entry: From 73635009b5b39f49ee28ac290fd447025edd84cb Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Thu, 2 Oct 2025 00:11:50 +0800 Subject: [PATCH 3/4] [ValueTracking] Address review comments. --- llvm/lib/Analysis/ValueTracking.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 09a8fbea065ac..cb9b238b2927f 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -7651,9 +7651,8 @@ static bool isGuaranteedNotToBeUndefOrPoison( return true; } - if (!::canCreateUndefOrPoison(Opr, Kind, - /*ConsiderFlagsAndMetadata=*/true)) { - if (const auto *PN = dyn_cast(V)) { + if (const auto *PN = dyn_cast(V)) { + if (!includesPoison(Kind) || !PN->hasPoisonGeneratingFlags()) { unsigned Num = PN->getNumIncomingValues(); bool IsWellDefined = true; for (unsigned i = 0; i < Num; ++i) { @@ -7668,9 +7667,11 @@ static bool isGuaranteedNotToBeUndefOrPoison( } if (IsWellDefined) return true; - } else if (all_of(Opr->operands(), OpCheck)) - return true; - } + } + } else if (!::canCreateUndefOrPoison(Opr, Kind, + /*ConsiderFlagsAndMetadata=*/true) && + all_of(Opr->operands(), OpCheck)) + return true; } if (auto *I = dyn_cast(V)) From 2c37f58d68edf6db4019f43ebd90e9e494217f88 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Thu, 2 Oct 2025 00:18:21 +0800 Subject: [PATCH 4/4] Revert "[ValueTracking] Address review comments." This reverts commit 73635009b5b39f49ee28ac290fd447025edd84cb. --- llvm/lib/Analysis/ValueTracking.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index cb9b238b2927f..09a8fbea065ac 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -7651,8 +7651,9 @@ static bool isGuaranteedNotToBeUndefOrPoison( return true; } - if (const auto *PN = dyn_cast(V)) { - if (!includesPoison(Kind) || !PN->hasPoisonGeneratingFlags()) { + if (!::canCreateUndefOrPoison(Opr, Kind, + /*ConsiderFlagsAndMetadata=*/true)) { + if (const auto *PN = dyn_cast(V)) { unsigned Num = PN->getNumIncomingValues(); bool IsWellDefined = true; for (unsigned i = 0; i < Num; ++i) { @@ -7667,11 +7668,9 @@ static bool isGuaranteedNotToBeUndefOrPoison( } if (IsWellDefined) return true; - } - } else if (!::canCreateUndefOrPoison(Opr, Kind, - /*ConsiderFlagsAndMetadata=*/true) && - all_of(Opr->operands(), OpCheck)) - return true; + } else if (all_of(Opr->operands(), OpCheck)) + return true; + } } if (auto *I = dyn_cast(V))