[llvm] 8f681d5 - [IR] Allow Value::replaceUsesWithIf() to process constants
Stanislav Mekhanoshin via llvm-commits
llvm-commits at lists.llvm.org
Tue May 25 02:12:13 PDT 2021
Author: Stanislav Mekhanoshin
Date: 2021-05-25T02:12:01-07:00
New Revision: 8f681d5b272eeb5c0d13d225313f4ea9517f59f5
URL: https://github.com/llvm/llvm-project/commit/8f681d5b272eeb5c0d13d225313f4ea9517f59f5
DIFF: https://github.com/llvm/llvm-project/commit/8f681d5b272eeb5c0d13d225313f4ea9517f59f5.diff
LOG: [IR] Allow Value::replaceUsesWithIf() to process constants
The change is currently NFC, but exploited by the depending D102954.
Code to handle constants is borrowed from the general implementation
of Value::doRAUW().
Differential Revision: https://reviews.llvm.org/D103051
Added:
Modified:
llvm/include/llvm/IR/Value.h
llvm/lib/IR/Value.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Value.h b/llvm/include/llvm/IR/Value.h
index f6fd621b0d4aa..2ad1c9e8c3008 100644
--- a/llvm/include/llvm/IR/Value.h
+++ b/llvm/include/llvm/IR/Value.h
@@ -311,27 +311,15 @@ class Value {
/// 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
diff erent 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);
//----------------------------------------------------------------------
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp
index 8d6918c59d52a..d5587b42e6c0f 100644
--- a/llvm/lib/IR/Value.cpp
+++ b/llvm/lib/IR/Value.cpp
@@ -532,6 +532,29 @@ void Value::replaceNonMetadataUsesWith(Value *New) {
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
diff erent 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) {
More information about the llvm-commits
mailing list