forked from OSchip/llvm-project
[SCEV] ScalarEvolution::createSCEV(): Instruction::Or: drop bogus no-wrap flag detection
Summary: That's just really wrong. While sure, if LHS is AddRec, and we could propagate it's no-wrap flags, that doesn't make, because as long as the operands of `or` had no common bits set, then the `add` of these operands will never overflow: http://volta.cs.utah.edu:8080/z/gmt7Sy IOW we need no propagation/detection, we are free to just set NUW+NSW. But as rG39e3683534c83573da5c8b70c8adfb43948f601f shows, even when the old code failed to "deduce" flags, we'd eventually re-deduce them somewhere, later. So let's just set them. Reviewers: mkazantsev, reames, sanjoy, efriedma Reviewed By: efriedma Subscribers: efriedma, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81246
This commit is contained in:
parent
c868335e24
commit
1eda9bfd61
|
@ -6389,15 +6389,8 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
|||
if (GetMinTrailingZeros(LHS) >=
|
||||
(CIVal.getBitWidth() - CIVal.countLeadingZeros())) {
|
||||
// Build a plain add SCEV.
|
||||
const SCEV *S = getAddExpr(LHS, getSCEV(CI));
|
||||
// If the LHS of the add was an addrec and it has no-wrap flags,
|
||||
// transfer the no-wrap flags, since an or won't introduce a wrap.
|
||||
if (const SCEVAddRecExpr *NewAR = dyn_cast<SCEVAddRecExpr>(S)) {
|
||||
const SCEVAddRecExpr *OldAR = cast<SCEVAddRecExpr>(LHS);
|
||||
const_cast<SCEVAddRecExpr *>(NewAR)->setNoWrapFlags(
|
||||
OldAR->getNoWrapFlags());
|
||||
}
|
||||
return S;
|
||||
return getAddExpr(LHS, getSCEV(CI),
|
||||
(SCEV::NoWrapFlags)(SCEV::FlagNUW | SCEV::FlagNSW));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue