@@ -1515,16 +1515,6 @@ bool LoopIdiomRecognize::runOnNoncountableLoop() {
1515
1515
recognizeShiftUntilLessThan () || recognizeAndInsertStrLen ();
1516
1516
}
1517
1517
1518
- // / Check if a Value is either a nullptr or a constant int zero
1519
- static bool isZeroConstant (const Value *Val) {
1520
- if (isa<ConstantPointerNull>(Val))
1521
- return true ;
1522
- const ConstantInt *CmpZero = dyn_cast<ConstantInt>(Val);
1523
- if (!CmpZero || !CmpZero->isZero ())
1524
- return false ;
1525
- return true ;
1526
- }
1527
-
1528
1518
// / Check if the given conditional branch is based on the comparison between
1529
1519
// / a variable and zero, and if the variable is non-zero or zero (JmpOnZero is
1530
1520
// / true), the control yields to the loop entry. If the branch matches the
@@ -1540,7 +1530,8 @@ static Value *matchCondition(BranchInst *BI, BasicBlock *LoopEntry,
1540
1530
if (!Cond)
1541
1531
return nullptr ;
1542
1532
1543
- if (!isZeroConstant (Cond->getOperand (1 )))
1533
+ const ConstantInt *CmpZero = dyn_cast<ConstantInt>(Cond->getOperand (1 ));
1534
+ if (!CmpZero || !CmpZero->isZero ())
1544
1535
return nullptr ;
1545
1536
1546
1537
BasicBlock *TrueSucc = BI->getSuccessor (0 );
@@ -1656,11 +1647,7 @@ class StrlenVerifier {
1656
1647
if (!Ev)
1657
1648
return false ;
1658
1649
1659
- LLVM_DEBUG ({
1660
- dbgs () << " loop exit phi scev: " ;
1661
- Ev->print (dbgs ());
1662
- dbgs () << " \n " ;
1663
- });
1650
+ LLVM_DEBUG (dbgs () << " loop exit phi scev: " << *Ev << " \n " );
1664
1651
1665
1652
// Since we verified that the loop trip count will be a valid strlen
1666
1653
// idiom, we can expand all lcssa phi with {n,+,1} as (n + strlen) and use
@@ -1763,6 +1750,18 @@ bool LoopIdiomRecognize::recognizeAndInsertStrLen() {
1763
1750
BasicBlock *Preheader = CurLoop->getLoopPreheader ();
1764
1751
BasicBlock *LoopExitBB = CurLoop->getExitBlock ();
1765
1752
1753
+ if (Verifier.OpWidth == 8 ) {
1754
+ if (DisableLIRP::Strlen)
1755
+ return false ;
1756
+ if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_strlen))
1757
+ return false ;
1758
+ } else {
1759
+ if (DisableLIRP::Wcslen)
1760
+ return false ;
1761
+ if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_wcslen))
1762
+ return false ;
1763
+ }
1764
+
1766
1765
IRBuilder<> Builder (Preheader->getTerminator ());
1767
1766
SCEVExpander Expander (*SE, Preheader->getModule ()->getDataLayout (),
1768
1767
" strlen_idiom" );
@@ -1772,16 +1771,8 @@ bool LoopIdiomRecognize::recognizeAndInsertStrLen() {
1772
1771
1773
1772
Value *StrLenFunc = nullptr ;
1774
1773
if (Verifier.OpWidth == 8 ) {
1775
- if (DisableLIRP::Strlen)
1776
- return false ;
1777
- if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_strlen))
1778
- return false ;
1779
1774
StrLenFunc = emitStrLen (MaterialzedBase, Builder, *DL, TLI);
1780
1775
} else {
1781
- if (DisableLIRP::Wcslen)
1782
- return false ;
1783
- if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_wcslen))
1784
- return false ;
1785
1776
StrLenFunc = emitWcsLen (MaterialzedBase, Builder, *DL, TLI);
1786
1777
}
1787
1778
assert (StrLenFunc && " Failed to emit strlen function." );
0 commit comments