Skip to content

Commit

Permalink
NewGVN: Apply the fast math flags fix in r267113 to NewGVN as well.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294922 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dberlin committed Feb 12, 2017
1 parent 8697d18 commit c4bc958
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 24 deletions.
49 changes: 26 additions & 23 deletions lib/Transforms/Scalar/NewGVN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

if (Op && ReplOp)
ReplOp->andIRFlags(Op);

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);
}
// 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) {
Expand Down
1 change: 0 additions & 1 deletion test/Transforms/NewGVN/flags.ll
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
; XFAIL: *
; RUN: opt -newgvn -S < %s | FileCheck %s

declare void @use(i1)
Expand Down

0 comments on commit c4bc958

Please sign in to comment.