[llvm-bugs] [Bug 51869] New: Inifinte loop in ScalarEvolotion involving isImpliedCond
via llvm-bugs
llvm-bugs at lists.llvm.org
Wed Sep 15 06:04:38 PDT 2021
https://bugs.llvm.org/show_bug.cgi?id=51869
Bug ID: 51869
Summary: Inifinte loop in ScalarEvolotion involving
isImpliedCond
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Global Analyses
Assignee: unassignedbugs at nondot.org
Reporter: bjorn.a.pettersson at ericsson.com
CC: llvm-bugs at lists.llvm.org, max.kazantsev at azul.com
Created attachment 25260
--> https://bugs.llvm.org/attachment.cgi?id=25260&action=edit
bbi-59764-2.ll
Given the bbi-50881-2.ll test input this command seem to hang
opt -indvars bbi-59764-2.ll
Bi-secting points at:
commit 5ef84688fba28b9f0f69ddc9a5beb75b10696798
Author: Max Kazantsev <mkazantsev at azul.com>
Date: Wed Oct 28 13:28:39 2020 +0700
Re-enable "[SCEV] Prove implications of different type via truncation"
When we need to prove implication of expressions of different type width,
the default strategy is to widen everything to wider type and prove in this
type. This does not interact well with AddRecs with negative steps and
unsigned predicates: such AddRec will likely not have a `nuw` flag, and its
`zext` to wider type will not be an AddRec. In contraty, `trunc` of an
AddRec
in some cases can easily be proved to be an `AddRec` too.
This patch introduces an alternative way to handling implications of
different
type widths. If we can prove that wider type values actually fit in the
narrow type,
we truncate them and prove the implication in narrow type.
The return was due to revert of underlying patch that this one depends on.
Unit test temporarily disabled because the required logic in SCEV is
switched
off due to compile time reasons.
Differential Revision: https://reviews.llvm.org/D89548
The code looks like this:
bool ScalarEvolution::isImpliedCond(ICmpInst::Predicate Pred, const SCEV *LHS,
const SCEV *RHS,
ICmpInst::Predicate FoundPred,
const SCEV *FoundLHS, const SCEV *FoundRHS,
const Instruction *Context) {
// Balance the types.
if (getTypeSizeInBits(LHS->getType()) <
getTypeSizeInBits(FoundLHS->getType())) {
// For unsigned and equality predicates, try to prove that both found
// operands fit into narrow unsigned range. If so, try to prove facts in
// narrow types.
if (!CmpInst::isSigned(FoundPred) && !FoundLHS->getType()->isPointerTy()) {
auto *NarrowType = LHS->getType();
auto *WideType = FoundLHS->getType();
auto BitWidth = getTypeSizeInBits(NarrowType);
const SCEV *MaxValue = getZeroExtendExpr(
getConstant(APInt::getMaxValue(BitWidth)), WideType);
if (isKnownPredicate(ICmpInst::ICMP_ULE, FoundLHS, MaxValue) &&
isKnownPredicate(ICmpInst::ICMP_ULE, FoundRHS, MaxValue)) {
const SCEV *TruncFoundLHS = getTruncateExpr(FoundLHS, NarrowType);
const SCEV *TruncFoundRHS = getTruncateExpr(FoundRHS, NarrowType);
if (isImpliedCondBalancedTypes(Pred, LHS, RHS, FoundPred,
TruncFoundLHS,
TruncFoundRHS, Context))
return true;
}
}
...
I don't remember exactly but I think my quick hack with adding some debug
printouts indicated that the
isKnownPredicate(ICmpInst::ICMP_ULE, FoundRHS, MaxValue)
call might end up in some recursion, but I'm not 100% sure that is the problem.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210915/4c1e8cee/attachment-0001.html>
More information about the llvm-bugs
mailing list