mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-05 11:27:41 +00:00
NewGVN: Apply the fast math flags fix in r267113 to NewGVN as well.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294922 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8697d189a9
commit
c4bc95816e
@ -2059,31 +2059,34 @@ void NewGVN::convertDenseToLoadsAndStores(
|
||||
}
|
||||
|
||||
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.
|
||||
auto *Op = dyn_cast<BinaryOperator>(I);
|
||||
auto *ReplOp = dyn_cast<BinaryOperator>(Repl);
|
||||
// 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);
|
||||
|
||||
if (Op && ReplOp)
|
||||
ReplOp->andIRFlags(Op);
|
||||
// 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().
|
||||
|
||||
if (auto *ReplInst = dyn_cast<Instruction>(Repl)) {
|
||||
// FIXME: If both the original and replacement value are part of the
|
||||
// same control-flow region (meaning that the execution of one
|
||||
// guarentees the executation 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.
|
||||
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);
|
||||
}
|
||||
// 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) {
|
||||
|
@ -1,4 +1,3 @@
|
||||
; XFAIL: *
|
||||
; RUN: opt -newgvn -S < %s | FileCheck %s
|
||||
|
||||
declare void @use(i1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user