Skip to content

Commit 57a9f79

Browse files
authored
[ValueTracking] Take PHI's poison-generating flags into account (#161530)
ninf/nnan in the phi node may produce poison values. They should be considered in `isGuaranteedNotToBeUndefOrPoison`. Closes #161524.
1 parent 42ab473 commit 57a9f79

File tree

2 files changed

+46
-17
lines changed

2 files changed

+46
-17
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7651,25 +7651,26 @@ static bool isGuaranteedNotToBeUndefOrPoison(
76517651
return true;
76527652
}
76537653

7654-
if (const auto *PN = dyn_cast<PHINode>(V)) {
7655-
unsigned Num = PN->getNumIncomingValues();
7656-
bool IsWellDefined = true;
7657-
for (unsigned i = 0; i < Num; ++i) {
7658-
if (PN == PN->getIncomingValue(i))
7659-
continue;
7660-
auto *TI = PN->getIncomingBlock(i)->getTerminator();
7661-
if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI,
7662-
DT, Depth + 1, Kind)) {
7663-
IsWellDefined = false;
7664-
break;
7654+
if (!::canCreateUndefOrPoison(Opr, Kind,
7655+
/*ConsiderFlagsAndMetadata=*/true)) {
7656+
if (const auto *PN = dyn_cast<PHINode>(V)) {
7657+
unsigned Num = PN->getNumIncomingValues();
7658+
bool IsWellDefined = true;
7659+
for (unsigned i = 0; i < Num; ++i) {
7660+
if (PN == PN->getIncomingValue(i))
7661+
continue;
7662+
auto *TI = PN->getIncomingBlock(i)->getTerminator();
7663+
if (!isGuaranteedNotToBeUndefOrPoison(PN->getIncomingValue(i), AC, TI,
7664+
DT, Depth + 1, Kind)) {
7665+
IsWellDefined = false;
7666+
break;
7667+
}
76657668
}
7666-
}
7667-
if (IsWellDefined)
7669+
if (IsWellDefined)
7670+
return true;
7671+
} else if (all_of(Opr->operands(), OpCheck))
76687672
return true;
7669-
} else if (!::canCreateUndefOrPoison(Opr, Kind,
7670-
/*ConsiderFlagsAndMetadata*/ true) &&
7671-
all_of(Opr->operands(), OpCheck))
7672-
return true;
7673+
}
76737674
}
76747675

76757676
if (auto *I = dyn_cast<LoadInst>(V))

llvm/test/Transforms/InstCombine/freeze-phi.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,31 @@ D:
212212
%y.fr = freeze i32 %y
213213
ret i32 %y.fr
214214
}
215+
216+
; Make sure that fmf in phi node is dropped when freeze get folded.
217+
218+
define float @pr161524(float noundef %arg) {
219+
; CHECK-LABEL: @pr161524(
220+
; CHECK-NEXT: entry:
221+
; CHECK-NEXT: [[COND:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[ARG:%.*]], i32 144)
222+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_EXIT:%.*]]
223+
; CHECK: if.then:
224+
; CHECK-NEXT: [[FADD:%.*]] = fadd float [[ARG]], 1.000000e+00
225+
; CHECK-NEXT: br label [[IF_EXIT]]
226+
; CHECK: if.exit:
227+
; CHECK-NEXT: [[RET:%.*]] = phi float [ [[FADD]], [[IF_THEN]] ], [ [[ARG]], [[ENTRY:%.*]] ]
228+
; CHECK-NEXT: ret float [[RET]]
229+
;
230+
entry:
231+
%cond = tail call i1 @llvm.is.fpclass.f32(float %arg, i32 144)
232+
br i1 %cond, label %if.then, label %if.exit
233+
234+
if.then:
235+
%fadd = fadd float %arg, 1.0
236+
br label %if.exit
237+
238+
if.exit:
239+
%ret = phi ninf float [ %fadd, %if.then ], [ %arg, %entry ]
240+
%ret.fr = freeze float %ret
241+
ret float %ret.fr
242+
}

0 commit comments

Comments
 (0)