diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-08-01 12:32:08 +0000 | 
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-08-01 12:32:08 +0000 | 
| commit | 081e990d08523f290f3d6cfe8ff677a57f546bc4 (patch) | |
| tree | f054298e9cb5f813c39c9390b0be848448c3c65d /llvm/lib/Transforms | |
| parent | 0efeaa81626f4c972a1f792f2b2daea1ad2eb4f5 (diff) | |
| download | bcm5719-llvm-081e990d08523f290f3d6cfe8ff677a57f546bc4.tar.gz bcm5719-llvm-081e990d08523f290f3d6cfe8ff677a57f546bc4.zip | |
[IR] Value: add replaceUsesWithIf() utility
Summary:
While there is always a `Value::replaceAllUsesWith()`,
sometimes the replacement needs to be conditional.
I have only cleaned a few cases where `replaceUsesWithIf()`
could be used, to both add test coverage,
and show that it is actually useful.
Reviewers: jdoerfert, spatel, RKSimon, craig.topper
Reviewed By: jdoerfert
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, aheejin, george.burgess.iv, asbirlea, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65528
llvm-svn: 367548
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSink.cpp | 9 | 
3 files changed, 6 insertions, 21 deletions
| diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 716d4e8ede7..769dc484b9e 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1685,16 +1685,7 @@ void LowerTypeTestsModule::replaceCfiUses(Function *Old, Value *New, bool IsDefi  }  void LowerTypeTestsModule::replaceDirectCalls(Value *Old, Value *New) { -  auto UI = Old->use_begin(), E = Old->use_end(); -  for (; UI != E;) { -    Use &U = *UI; -    ++UI; - -    if (!isDirectCall(U)) -      continue; - -    U.set(New); -  } +  Old->replaceUsesWithIf(New, [](Use &U) { return isDirectCall(U); });  }  bool LowerTypeTestsModule::lower() { diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index f190a319d13..0b586e34c27 100644 --- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -1002,11 +1002,8 @@ bool HWAddressSanitizer::instrumentStack(          AI->hasName() ? AI->getName().str() : "alloca." + itostr(N);      Replacement->setName(Name + ".hwasan"); -    for (auto UI = AI->use_begin(), UE = AI->use_end(); UI != UE;) { -      Use &U = *UI++; -      if (U.getUser() != AILong) -        U.set(Replacement); -    } +    AI->replaceUsesWithIf(Replacement, +                          [AILong](Use &U) { return U.getUser() != AILong; });      for (auto *DDI : AllocaDeclareMap.lookup(AI)) {        DIExpression *OldExpr = DDI->getExpression(); diff --git a/llvm/lib/Transforms/Scalar/LoopSink.cpp b/llvm/lib/Transforms/Scalar/LoopSink.cpp index 975452e13f0..65e0dee0225 100644 --- a/llvm/lib/Transforms/Scalar/LoopSink.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSink.cpp @@ -230,12 +230,9 @@ static bool sinkInstruction(Loop &L, Instruction &I,      IC->setName(I.getName());      IC->insertBefore(&*N->getFirstInsertionPt());      // Replaces uses of I with IC in N -    for (Value::use_iterator UI = I.use_begin(), UE = I.use_end(); UI != UE;) { -      Use &U = *UI++; -      auto *I = cast<Instruction>(U.getUser()); -      if (I->getParent() == N) -        U.set(IC); -    } +    I.replaceUsesWithIf(IC, [N](Use &U) { +      return cast<Instruction>(U.getUser())->getParent() == N; +    });      // Replaces uses of I with IC in blocks dominated by N      replaceDominatedUsesWith(&I, IC, DT, N);      LLVM_DEBUG(dbgs() << "Sinking a clone of " << I << " To: " << N->getName() | 

