@@ -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
+ auto *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 );
@@ -1611,11 +1602,7 @@ class StrlenVerifier {
1611
1602
return false ;
1612
1603
LoadBaseEv = LoadEv->getStart ();
1613
1604
1614
- LLVM_DEBUG ({
1615
- dbgs () << " pointer load scev: " ;
1616
- LoadEv->print (outs ());
1617
- dbgs () << " \n " ;
1618
- });
1605
+ LLVM_DEBUG (dbgs () << " pointer load scev: " << *LoadEv << " \n " );
1619
1606
1620
1607
const SCEVConstant *Step =
1621
1608
dyn_cast<SCEVConstant>(LoadEv->getStepRecurrence (*SE));
@@ -1656,11 +1643,7 @@ class StrlenVerifier {
1656
1643
if (!Ev)
1657
1644
return false ;
1658
1645
1659
- LLVM_DEBUG ({
1660
- dbgs () << " loop exit phi scev: " ;
1661
- Ev->print (dbgs ());
1662
- dbgs () << " \n " ;
1663
- });
1646
+ LLVM_DEBUG (dbgs () << " loop exit phi scev: " << *Ev << " \n " );
1664
1647
1665
1648
// Since we verified that the loop trip count will be a valid strlen
1666
1649
// idiom, we can expand all lcssa phi with {n,+,1} as (n + strlen) and use
@@ -1763,6 +1746,18 @@ bool LoopIdiomRecognize::recognizeAndInsertStrLen() {
1763
1746
BasicBlock *Preheader = CurLoop->getLoopPreheader ();
1764
1747
BasicBlock *LoopExitBB = CurLoop->getExitBlock ();
1765
1748
1749
+ if (Verifier.OpWidth == 8 ) {
1750
+ if (DisableLIRP::Strlen)
1751
+ return false ;
1752
+ if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_strlen))
1753
+ return false ;
1754
+ } else {
1755
+ if (DisableLIRP::Wcslen)
1756
+ return false ;
1757
+ if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_wcslen))
1758
+ return false ;
1759
+ }
1760
+
1766
1761
IRBuilder<> Builder (Preheader->getTerminator ());
1767
1762
SCEVExpander Expander (*SE, Preheader->getModule ()->getDataLayout (),
1768
1763
" strlen_idiom" );
@@ -1772,16 +1767,8 @@ bool LoopIdiomRecognize::recognizeAndInsertStrLen() {
1772
1767
1773
1768
Value *StrLenFunc = nullptr ;
1774
1769
if (Verifier.OpWidth == 8 ) {
1775
- if (DisableLIRP::Strlen)
1776
- return false ;
1777
- if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_strlen))
1778
- return false ;
1779
1770
StrLenFunc = emitStrLen (MaterialzedBase, Builder, *DL, TLI);
1780
1771
} else {
1781
- if (DisableLIRP::Wcslen)
1782
- return false ;
1783
- if (!isLibFuncEmittable (Preheader->getModule (), TLI, LibFunc_wcslen))
1784
- return false ;
1785
1772
StrLenFunc = emitWcsLen (MaterialzedBase, Builder, *DL, TLI);
1786
1773
}
1787
1774
assert (StrLenFunc && " Failed to emit strlen function." );
0 commit comments