[PATCH] D103051: [IR] Allow Value::replaceUsesWithIf() to process constants
Stanislav Mekhanoshin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 24 14:59:16 PDT 2021
rampitec created this revision.
rampitec added reviewers: lebedev.ri, arsenm, JonChesterfield, hsmhsm.
Herald added subscribers: dexonsmith, hiraditya.
rampitec requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
The change is currently NFC, but exploited by the depending D102954 <https://reviews.llvm.org/D102954>.
Code to handle constants is borrowed from the general implementation
of Value::doRAUW().
https://reviews.llvm.org/D103051
Files:
llvm/include/llvm/IR/Value.h
llvm/lib/IR/Value.cpp
Index: llvm/lib/IR/Value.cpp
===================================================================
--- llvm/lib/IR/Value.cpp
+++ llvm/lib/IR/Value.cpp
@@ -532,6 +532,29 @@
doRAUW(New, ReplaceMetadataUses::No);
}
+void Value::replaceUsesWithIf(Value *New,
+ llvm::function_ref<bool(Use &U)> ShouldReplace) {
+ assert(New && "Value::replaceUsesWithIf(<null>) is invalid!");
+ assert(New->getType() == getType() &&
+ "replaceUses of value with new value of different type!");
+
+ for (use_iterator UI = use_begin(), E = use_end(); UI != E;) {
+ Use &U = *UI;
+ ++UI;
+ if (!ShouldReplace(U))
+ continue;
+ // Must handle Constants specially, we cannot call replaceUsesOfWith on a
+ // constant because they are uniqued.
+ if (auto *C = dyn_cast<Constant>(U.getUser())) {
+ if (!isa<GlobalValue>(C)) {
+ C->handleOperandChange(this, New);
+ continue;
+ }
+ }
+ U.set(New);
+ }
+}
+
/// Replace llvm.dbg.* uses of MetadataAsValue(ValueAsMetadata(V)) outside BB
/// with New.
static void replaceDbgUsesOutsideBlock(Value *V, Value *New, BasicBlock *BB) {
Index: llvm/include/llvm/IR/Value.h
===================================================================
--- llvm/include/llvm/IR/Value.h
+++ llvm/include/llvm/IR/Value.h
@@ -311,27 +311,15 @@
/// Go through the uses list for this definition and make each use point
/// to "V" if the callback ShouldReplace returns true for the given Use.
/// Unlike replaceAllUsesWith() this function does not support basic block
- /// values or constant users.
+ /// values.
void replaceUsesWithIf(Value *New,
- llvm::function_ref<bool(Use &U)> ShouldReplace) {
- assert(New && "Value::replaceUsesWithIf(<null>) is invalid!");
- assert(New->getType() == getType() &&
- "replaceUses of value with new value of different type!");
-
- for (use_iterator UI = use_begin(), E = use_end(); UI != E;) {
- Use &U = *UI;
- ++UI;
- if (!ShouldReplace(U))
- continue;
- U.set(New);
- }
- }
+ llvm::function_ref<bool(Use &U)> ShouldReplace);
/// replaceUsesOutsideBlock - Go through the uses list for this definition and
/// make each use point to "V" instead of "this" when the use is outside the
/// block. 'This's use list is expected to have at least one element.
/// Unlike replaceAllUsesWith() this function does not support basic block
- /// values or constant users.
+ /// values.
void replaceUsesOutsideBlock(Value *V, BasicBlock *BB);
//----------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103051.347514.patch
Type: text/x-patch
Size: 2675 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210524/4f448401/attachment-0001.bin>
More information about the llvm-commits
mailing list