forked from OSchip/llvm-project
[GVN,NewGVN] Move patchReplacementInstruction to Utils/Local.h
This function is shared between both implementations. I am not sure if Utils/Local.h is the best place though. Reviewers: davide, dberlin, efriedma, xbolva00 Reviewed By: efriedma, xbolva00 Differential Revision: https://reviews.llvm.org/D47337 llvm-svn: 339138
This commit is contained in:
parent
462b74cad3
commit
39bbe179aa
|
@ -393,6 +393,10 @@ void combineMetadata(Instruction *K, const Instruction *J, ArrayRef<unsigned> Kn
|
||||||
/// Unknown metadata is removed.
|
/// Unknown metadata is removed.
|
||||||
void combineMetadataForCSE(Instruction *K, const Instruction *J);
|
void combineMetadataForCSE(Instruction *K, const Instruction *J);
|
||||||
|
|
||||||
|
/// Patch the replacement so that it is not more restrictive than the value
|
||||||
|
/// being replaced.
|
||||||
|
void patchReplacementInstruction(Instruction *I, Value *Repl);
|
||||||
|
|
||||||
// Replace each use of 'From' with 'To', if that use does not belong to basic
|
// Replace each use of 'From' with 'To', if that use does not belong to basic
|
||||||
// block where 'From' is defined. Returns the number of replacements made.
|
// block where 'From' is defined. Returns the number of replacements made.
|
||||||
unsigned replaceNonLocalUsesWith(Instruction *From, Value *To);
|
unsigned replaceNonLocalUsesWith(Instruction *From, Value *To);
|
||||||
|
|
|
@ -1444,37 +1444,6 @@ bool GVN::processAssumeIntrinsic(IntrinsicInst *IntrinsicI) {
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void patchReplacementInstruction(Instruction *I, Value *Repl) {
|
|
||||||
auto *ReplInst = dyn_cast<Instruction>(Repl);
|
|
||||||
if (!ReplInst)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Patch the replacement so that it is not more restrictive than the value
|
|
||||||
// being replaced.
|
|
||||||
// Note that if 'I' is a load being replaced by some operation,
|
|
||||||
// for example, by an arithmetic operation, then andIRFlags()
|
|
||||||
// would just erase all math flags from the original arithmetic
|
|
||||||
// operation, which is clearly not wanted and not needed.
|
|
||||||
if (!isa<LoadInst>(I))
|
|
||||||
ReplInst->andIRFlags(I);
|
|
||||||
|
|
||||||
// FIXME: If both the original and replacement value are part of the
|
|
||||||
// same control-flow region (meaning that the execution of one
|
|
||||||
// guarantees the execution of the other), then we can combine the
|
|
||||||
// noalias scopes here and do better than the general conservative
|
|
||||||
// answer used in combineMetadata().
|
|
||||||
|
|
||||||
// In general, GVN unifies expressions over different control-flow
|
|
||||||
// regions, and so we need a conservative combination of the noalias
|
|
||||||
// scopes.
|
|
||||||
static const unsigned KnownIDs[] = {
|
|
||||||
LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope,
|
|
||||||
LLVMContext::MD_noalias, LLVMContext::MD_range,
|
|
||||||
LLVMContext::MD_fpmath, LLVMContext::MD_invariant_load,
|
|
||||||
LLVMContext::MD_invariant_group};
|
|
||||||
combineMetadata(ReplInst, I, KnownIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) {
|
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) {
|
||||||
patchReplacementInstruction(I, Repl);
|
patchReplacementInstruction(I, Repl);
|
||||||
I->replaceAllUsesWith(Repl);
|
I->replaceAllUsesWith(Repl);
|
||||||
|
|
|
@ -3697,37 +3697,6 @@ void NewGVN::convertClassToLoadsAndStores(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void patchReplacementInstruction(Instruction *I, Value *Repl) {
|
|
||||||
auto *ReplInst = dyn_cast<Instruction>(Repl);
|
|
||||||
if (!ReplInst)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Patch the replacement so that it is not more restrictive than the value
|
|
||||||
// being replaced.
|
|
||||||
// Note that if 'I' is a load being replaced by some operation,
|
|
||||||
// for example, by an arithmetic operation, then andIRFlags()
|
|
||||||
// would just erase all math flags from the original arithmetic
|
|
||||||
// operation, which is clearly not wanted and not needed.
|
|
||||||
if (!isa<LoadInst>(I))
|
|
||||||
ReplInst->andIRFlags(I);
|
|
||||||
|
|
||||||
// FIXME: If both the original and replacement value are part of the
|
|
||||||
// same control-flow region (meaning that the execution of one
|
|
||||||
// guarantees the execution of the other), then we can combine the
|
|
||||||
// noalias scopes here and do better than the general conservative
|
|
||||||
// answer used in combineMetadata().
|
|
||||||
|
|
||||||
// In general, GVN unifies expressions over different control-flow
|
|
||||||
// regions, and so we need a conservative combination of the noalias
|
|
||||||
// scopes.
|
|
||||||
static const unsigned KnownIDs[] = {
|
|
||||||
LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope,
|
|
||||||
LLVMContext::MD_noalias, LLVMContext::MD_range,
|
|
||||||
LLVMContext::MD_fpmath, LLVMContext::MD_invariant_load,
|
|
||||||
LLVMContext::MD_invariant_group};
|
|
||||||
combineMetadata(ReplInst, I, KnownIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) {
|
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) {
|
||||||
patchReplacementInstruction(I, Repl);
|
patchReplacementInstruction(I, Repl);
|
||||||
I->replaceAllUsesWith(Repl);
|
I->replaceAllUsesWith(Repl);
|
||||||
|
|
|
@ -2354,6 +2354,37 @@ void llvm::combineMetadataForCSE(Instruction *K, const Instruction *J) {
|
||||||
combineMetadata(K, J, KnownIDs);
|
combineMetadata(K, J, KnownIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void llvm::patchReplacementInstruction(Instruction *I, Value *Repl) {
|
||||||
|
auto *ReplInst = dyn_cast<Instruction>(Repl);
|
||||||
|
if (!ReplInst)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Patch the replacement so that it is not more restrictive than the value
|
||||||
|
// being replaced.
|
||||||
|
// Note that if 'I' is a load being replaced by some operation,
|
||||||
|
// for example, by an arithmetic operation, then andIRFlags()
|
||||||
|
// would just erase all math flags from the original arithmetic
|
||||||
|
// operation, which is clearly not wanted and not needed.
|
||||||
|
if (!isa<LoadInst>(I))
|
||||||
|
ReplInst->andIRFlags(I);
|
||||||
|
|
||||||
|
// FIXME: If both the original and replacement value are part of the
|
||||||
|
// same control-flow region (meaning that the execution of one
|
||||||
|
// guarantees the execution of the other), then we can combine the
|
||||||
|
// noalias scopes here and do better than the general conservative
|
||||||
|
// answer used in combineMetadata().
|
||||||
|
|
||||||
|
// In general, GVN unifies expressions over different control-flow
|
||||||
|
// regions, and so we need a conservative combination of the noalias
|
||||||
|
// scopes.
|
||||||
|
static const unsigned KnownIDs[] = {
|
||||||
|
LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope,
|
||||||
|
LLVMContext::MD_noalias, LLVMContext::MD_range,
|
||||||
|
LLVMContext::MD_fpmath, LLVMContext::MD_invariant_load,
|
||||||
|
LLVMContext::MD_invariant_group};
|
||||||
|
combineMetadata(ReplInst, I, KnownIDs);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename RootType, typename DominatesFn>
|
template <typename RootType, typename DominatesFn>
|
||||||
static unsigned replaceDominatedUsesWith(Value *From, Value *To,
|
static unsigned replaceDominatedUsesWith(Value *From, Value *To,
|
||||||
const RootType &Root,
|
const RootType &Root,
|
||||||
|
|
Loading…
Reference in New Issue