[llvm] 176bbca - [DSE] Remove MemDep-based implementation
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 7 09:17:41 PST 2021
Author: Nikita Popov
Date: 2021-03-07T18:17:31+01:00
New Revision: 176bbcae1113fbb4f34d2b79eab35b086a9f2a8e
URL: https://github.com/llvm/llvm-project/commit/176bbcae1113fbb4f34d2b79eab35b086a9f2a8e
DIFF: https://github.com/llvm/llvm-project/commit/176bbcae1113fbb4f34d2b79eab35b086a9f2a8e.diff
LOG: [DSE] Remove MemDep-based implementation
The MemorySSA-based implementation has been enabled without issue
for a while now, so keeping the old implementation around doesn't
seem useful anymore. This drops the MemDep-based implementation.
Differential Revision: https://reviews.llvm.org/D97877
Added:
llvm/test/Transforms/DeadStoreElimination/2011-03-25-DSEMiscompile.ll
llvm/test/Transforms/DeadStoreElimination/2011-09-06-EndOfFunction.ll
llvm/test/Transforms/DeadStoreElimination/2011-09-06-MemCpy.ll
llvm/test/Transforms/DeadStoreElimination/2016-07-17-UseAfterFree.ll
llvm/test/Transforms/DeadStoreElimination/OverwriteStoreBegin.ll
llvm/test/Transforms/DeadStoreElimination/OverwriteStoreEnd.ll
llvm/test/Transforms/DeadStoreElimination/PartialStore.ll
llvm/test/Transforms/DeadStoreElimination/PartialStore2.ll
llvm/test/Transforms/DeadStoreElimination/X86/gather-null-pointer.ll
llvm/test/Transforms/DeadStoreElimination/atomic-overlapping.ll
llvm/test/Transforms/DeadStoreElimination/atomic-todo.ll
llvm/test/Transforms/DeadStoreElimination/atomic.ll
llvm/test/Transforms/DeadStoreElimination/calloc-store.ll
llvm/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll
llvm/test/Transforms/DeadStoreElimination/const-pointers.ll
llvm/test/Transforms/DeadStoreElimination/crash.ll
llvm/test/Transforms/DeadStoreElimination/cs-cs-aliasing.ll
llvm/test/Transforms/DeadStoreElimination/debug-counter.ll
llvm/test/Transforms/DeadStoreElimination/debuginfo.ll
llvm/test/Transforms/DeadStoreElimination/dominate.ll
llvm/test/Transforms/DeadStoreElimination/fence-todo.ll
llvm/test/Transforms/DeadStoreElimination/fence.ll
llvm/test/Transforms/DeadStoreElimination/free.ll
llvm/test/Transforms/DeadStoreElimination/inst-limits.ll
llvm/test/Transforms/DeadStoreElimination/int_sideeffect.ll
llvm/test/Transforms/DeadStoreElimination/invariant.start.ll
llvm/test/Transforms/DeadStoreElimination/launder.invariant.group.ll
llvm/test/Transforms/DeadStoreElimination/libcalls.ll
llvm/test/Transforms/DeadStoreElimination/lifetime.ll
llvm/test/Transforms/DeadStoreElimination/loop-invariant-entry-block.ll
llvm/test/Transforms/DeadStoreElimination/mda-with-dbg-values.ll
llvm/test/Transforms/DeadStoreElimination/memcpy-complete-overwrite.ll
llvm/test/Transforms/DeadStoreElimination/memcpy-lifetimes.ll
llvm/test/Transforms/DeadStoreElimination/memintrinsics.ll
llvm/test/Transforms/DeadStoreElimination/memoryssa-scan-limit.ll
llvm/test/Transforms/DeadStoreElimination/memset-and-memcpy.ll
llvm/test/Transforms/DeadStoreElimination/memset-missing-debugloc.ll
llvm/test/Transforms/DeadStoreElimination/memset-unknown-sizes.ll
llvm/test/Transforms/DeadStoreElimination/merge-stores-big-endian.ll
llvm/test/Transforms/DeadStoreElimination/merge-stores.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-captures.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-exceptions.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-loop-carried-dependence.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-memintrinsics.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-memoryphis.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-multipath-throwing.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-multipath.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-overlap.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-partial.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-simple.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-throwing.ll
llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
llvm/test/Transforms/DeadStoreElimination/no-targetdata.ll
llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
llvm/test/Transforms/DeadStoreElimination/out-of-bounds-stores.ll
llvm/test/Transforms/DeadStoreElimination/overlap.ll
llvm/test/Transforms/DeadStoreElimination/pr11390.ll
llvm/test/Transforms/DeadStoreElimination/pr47285-not-overwritten-on-all-exit-paths.ll
llvm/test/Transforms/DeadStoreElimination/read-clobber-after-overwrite.ll
llvm/test/Transforms/DeadStoreElimination/scoped-noalias.ll
llvm/test/Transforms/DeadStoreElimination/simple-preservation.ll
llvm/test/Transforms/DeadStoreElimination/simple.ll
llvm/test/Transforms/DeadStoreElimination/stats.ll
llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
llvm/test/Transforms/DeadStoreElimination/tail-byval.ll
Modified:
llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
llvm/test/Transforms/DeadStoreElimination/masked-dead-store-inseltpoison.ll
llvm/test/Transforms/DeadStoreElimination/masked-dead-store.ll
Removed:
llvm/test/Transforms/DeadStoreElimination/MSSA/2011-03-25-DSEMiscompile.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-EndOfFunction.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-MemCpy.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/2016-07-17-UseAfterFree.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreBegin.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreEnd.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore2.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/X86/gather-null-pointer.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-overlapping.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-todo.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/atomic.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/calloc-store.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/combined-partial-overwrites.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/const-pointers.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/crash.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/cs-cs-aliasing.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/debug-counter.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/debuginfo.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/dominate.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/fence-todo.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/fence.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/free.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/inst-limits.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/int_sideeffect.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/invariant.start.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/launder.invariant.group.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/lifetime.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/mda-with-dbg-values.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-complete-overwrite.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-lifetimes.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memintrinsics.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memset-and-memcpy.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memset-missing-debugloc.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/memset-unknown-sizes.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores-big-endian.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-captures.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-exceptions.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loop-carried-dependence.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-malloc-free.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memintrinsics.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memoryphis.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath-throwing.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-partial.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-simple.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-throwing.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/no-targetdata.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/operand-bundles.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/out-of-bounds-stores.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/overlap.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/pr11390.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/pr47285-not-overwritten-on-all-exit-paths.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/read-clobber-after-overwrite.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/scoped-noalias.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/simple-preservation.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/simple.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/stats.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/stores-of-existing-values.ll
llvm/test/Transforms/DeadStoreElimination/MSSA/tail-byval.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-03-25-DSEMiscompile.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-EndOfFunction.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-MemCpy.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2016-07-17-UseAfterFree.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/DeleteThrowableInst.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreBegin.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreEnd.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore2.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/X86/gather-null-pointer.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/atomic.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/calloc-store.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/combined-partial-overwrites.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/const-pointers.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/crash.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/cs-cs-aliasing.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/debuginfo.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/dominate.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/fence.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/free.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/inst-limits.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/int_sideeffect.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/invariant.start.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/launder.invariant.group.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls2.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/lifetime.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/mda-with-dbg-values.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memintrinsics.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memset-missing-debugloc.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores-big-endian.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/no-targetdata.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/operand-bundles.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/pr11390.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/simple.ll
llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/tail-byval.ll
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index 2eeae7f1fb08..64cff4a2599c 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -1,4 +1,4 @@
-//===- DeadStoreElimination.cpp - Fast Dead Store Elimination -------------===//
+//===- DeadStoreElimination.cpp - MemorySSA Backed Dead Store Elimination -===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,11 +6,24 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements a trivial dead store elimination that only considers
-// basic-block local redundant stores.
+// The code below implements dead store elimination using MemorySSA. It uses
+// the following general approach: given a MemoryDef, walk upwards to find
+// clobbering MemoryDefs that may be killed by the starting def. Then check
+// that there are no uses that may read the location of the original MemoryDef
+// in between both MemoryDefs. A bit more concretely:
//
-// FIXME: This should eventually be extended to be a post-dominator tree
-// traversal. Doing so would be pretty trivial.
+// For all MemoryDefs StartDef:
+// 1. Get the next dominating clobbering MemoryDef (EarlierAccess) by walking
+// upwards.
+// 2. Check that there are no reads between EarlierAccess and the StartDef by
+// checking all uses starting at EarlierAccess and walking until we see
+// StartDef.
+// 3. For each found CurrentDef, check that:
+// 1. There are no barrier instructions between CurrentDef and StartDef (like
+// throws or stores with ordering constraints).
+// 2. StartDef is executed whenever CurrentDef is executed.
+// 3. StartDef completely overwrites CurrentDef.
+// 4. Erase CurrentDef from the function and MemorySSA.
//
//===----------------------------------------------------------------------===//
@@ -28,7 +41,6 @@
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/MemoryBuiltins.h"
-#include "llvm/Analysis/MemoryDependenceAnalysis.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/MemorySSA.h"
#include "llvm/Analysis/MemorySSAUpdater.h"
@@ -105,10 +117,6 @@ EnablePartialStoreMerging("enable-dse-partial-store-merging",
cl::init(true), cl::Hidden,
cl::desc("Enable partial store merging in DSE"));
-static cl::opt<bool>
- EnableMemorySSA("enable-dse-memoryssa", cl::init(true), cl::Hidden,
- cl::desc("Use the new MemorySSA-backed DSE."));
-
static cl::opt<unsigned>
MemorySSAScanLimit("dse-memoryssa-scanlimit", cl::init(150), cl::Hidden,
cl::desc("The number of memory instructions to scan for "
@@ -153,69 +161,6 @@ static cl::opt<unsigned> MemorySSAPathCheckLimit(
using OverlapIntervalsTy = std::map<int64_t, int64_t>;
using InstOverlapIntervalsTy = DenseMap<Instruction *, OverlapIntervalsTy>;
-/// Delete this instruction. Before we do, go through and zero out all the
-/// operands of this instruction. If any of them become dead, delete them and
-/// the computation tree that feeds them.
-/// If ValueSet is non-null, remove any deleted instructions from it as well.
-static void
-deleteDeadInstruction(Instruction *I, BasicBlock::iterator *BBI,
- MemoryDependenceResults &MD, const TargetLibraryInfo &TLI,
- InstOverlapIntervalsTy &IOL,
- MapVector<Instruction *, bool> &ThrowableInst,
- SmallSetVector<const Value *, 16> *ValueSet = nullptr) {
- SmallVector<Instruction*, 32> NowDeadInsts;
-
- NowDeadInsts.push_back(I);
- --NumFastOther;
-
- // Keeping the iterator straight is a pain, so we let this routine tell the
- // caller what the next instruction is after we're done mucking about.
- BasicBlock::iterator NewIter = *BBI;
-
- // Before we touch this instruction, remove it from memdep!
- do {
- Instruction *DeadInst = NowDeadInsts.pop_back_val();
- // Mark the DeadInst as dead in the list of throwable instructions.
- auto It = ThrowableInst.find(DeadInst);
- if (It != ThrowableInst.end())
- ThrowableInst[It->first] = false;
- ++NumFastOther;
-
- // Try to preserve debug information attached to the dead instruction.
- salvageDebugInfo(*DeadInst);
- salvageKnowledge(DeadInst);
-
- // This instruction is dead, zap it, in stages. Start by removing it from
- // MemDep, which needs to know the operands and needs it to be in the
- // function.
- MD.removeInstruction(DeadInst);
-
- for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) {
- Value *Op = DeadInst->getOperand(op);
- DeadInst->setOperand(op, nullptr);
-
- // If this operand just became dead, add it to the NowDeadInsts list.
- if (!Op->use_empty()) continue;
-
- if (Instruction *OpI = dyn_cast<Instruction>(Op))
- if (isInstructionTriviallyDead(OpI, &TLI))
- NowDeadInsts.push_back(OpI);
- }
-
- if (ValueSet) ValueSet->remove(DeadInst);
- IOL.erase(DeadInst);
-
- if (NewIter == DeadInst->getIterator())
- NewIter = DeadInst->eraseFromParent();
- else
- DeadInst->eraseFromParent();
- } while (!NowDeadInsts.empty());
- *BBI = NewIter;
- // Pop dead entries from back of ThrowableInst till we find an alive entry.
- while (!ThrowableInst.empty() && !ThrowableInst.back().second)
- ThrowableInst.pop_back();
-}
-
/// Does this instruction write some memory? This only returns true for things
/// that we can analyze with other helpers below.
static bool hasAnalyzableMemoryWrite(Instruction *I,
@@ -289,19 +234,6 @@ static MemoryLocation getLocForWrite(Instruction *Inst,
return MemoryLocation();
}
-/// Return the location read by the specified "hasAnalyzableMemoryWrite"
-/// instruction if any.
-static MemoryLocation getLocForRead(Instruction *Inst,
- const TargetLibraryInfo &TLI) {
- assert(hasAnalyzableMemoryWrite(Inst, TLI) && "Unknown instruction case");
-
- // The only instructions that both read and write are the mem transfer
- // instructions (memcpy/memmove).
- if (auto *MTI = dyn_cast<AnyMemTransferInst>(Inst))
- return MemoryLocation::getForSource(MTI);
- return MemoryLocation();
-}
-
/// If the value of this instruction and the memory it writes to is unused, may
/// we delete this instruction?
static bool isRemovable(Instruction *I) {
@@ -373,17 +305,6 @@ static bool isShortenableAtTheBeginning(Instruction *I) {
return isa<AnyMemSetInst>(I);
}
-/// Return the pointer that is being written to.
-static Value *getStoredPointerOperand(Instruction *I,
- const TargetLibraryInfo &TLI) {
- //TODO: factor this to reuse getLocForWrite
- MemoryLocation Loc = getLocForWrite(I, TLI);
- assert(Loc.Ptr &&
- "unable to find pointer written for analyzable instruction?");
- // TODO: most APIs don't expect const Value *
- return const_cast<Value*>(Loc.Ptr);
-}
-
static uint64_t getPointerSize(const Value *V, const DataLayout &DL,
const TargetLibraryInfo &TLI,
const Function *F) {
@@ -412,10 +333,9 @@ enum OverwriteResult {
/// Check if two instruction are masked stores that completely
/// overwrite one another. More specifically, \p Later has to
/// overwrite \p Earlier.
-template <typename AATy>
static OverwriteResult isMaskedStoreOverwrite(const Instruction *Later,
const Instruction *Earlier,
- AATy &AA) {
+ BatchAAResults &AA) {
const auto *IIL = dyn_cast<IntrinsicInst>(Later);
const auto *IIE = dyn_cast<IntrinsicInst>(Earlier);
if (IIL == nullptr || IIE == nullptr)
@@ -442,12 +362,11 @@ static OverwriteResult isMaskedStoreOverwrite(const Instruction *Later,
/// \p Earlier, but they both write to the same underlying object. In that
/// case, use isPartialOverwrite to check if \p Later partially overwrites
/// \p Earlier. Returns 'OW_Unknown' if nothing can be determined.
-template <typename AATy>
static OverwriteResult
isOverwrite(const Instruction *LaterI, const Instruction *EarlierI,
const MemoryLocation &Later, const MemoryLocation &Earlier,
const DataLayout &DL, const TargetLibraryInfo &TLI,
- int64_t &EarlierOff, int64_t &LaterOff, AATy &AA,
+ int64_t &EarlierOff, int64_t &LaterOff, BatchAAResults &AA,
const Function *F) {
// FIXME: Vet that this works for size upper-bounds. Seems unlikely that we'll
// get imprecise values here, though (except for unknown sizes).
@@ -659,69 +578,14 @@ static OverwriteResult isPartialOverwrite(const MemoryLocation &Later,
return OW_Unknown;
}
-/// If 'Inst' might be a self read (i.e. a noop copy of a
-/// memory region into an identical pointer) then it doesn't actually make its
-/// input dead in the traditional sense. Consider this case:
-///
-/// memmove(A <- B)
-/// memmove(A <- A)
-///
-/// In this case, the second store to A does not make the first store to A dead.
-/// The usual situation isn't an explicit A<-A store like this (which can be
-/// trivially removed) but a case where two pointers may alias.
-///
-/// This function detects when it is unsafe to remove a dependent instruction
-/// because the DSE inducing instruction may be a self-read.
-static bool isPossibleSelfRead(Instruction *Inst,
- const MemoryLocation &InstStoreLoc,
- Instruction *DepWrite,
- const TargetLibraryInfo &TLI,
- AliasAnalysis &AA) {
- // Self reads can only happen for instructions that read memory. Get the
- // location read.
- MemoryLocation InstReadLoc = getLocForRead(Inst, TLI);
- if (!InstReadLoc.Ptr)
- return false; // Not a reading instruction.
-
- // If the read and written loc obviously don't alias, it isn't a read.
- if (AA.isNoAlias(InstReadLoc, InstStoreLoc))
- return false;
-
- if (isa<AnyMemCpyInst>(Inst)) {
- // LLVM's memcpy overlap semantics are not fully fleshed out (see PR11763)
- // but in practice memcpy(A <- B) either means that A and B are disjoint or
- // are equal (i.e. there are not partial overlaps). Given that, if we have:
- //
- // memcpy/memmove(A <- B) // DepWrite
- // memcpy(A <- B) // Inst
- //
- // with Inst reading/writing a >= size than DepWrite, we can reason as
- // follows:
- //
- // - If A == B then both the copies are no-ops, so the DepWrite can be
- // removed.
- // - If A != B then A and B are disjoint locations in Inst. Since
- // Inst.size >= DepWrite.size A and B are disjoint in DepWrite too.
- // Therefore DepWrite can be removed.
- MemoryLocation DepReadLoc = getLocForRead(DepWrite, TLI);
-
- if (DepReadLoc.Ptr && AA.isMustAlias(InstReadLoc.Ptr, DepReadLoc.Ptr))
- return false;
- }
-
- // If DepWrite doesn't read memory or if we can't prove it is a must alias,
- // then it can't be considered dead.
- return true;
-}
-
/// Returns true if the memory which is accessed by the second instruction is not
/// modified between the first and the second instruction.
/// Precondition: Second instruction must be dominated by the first
/// instruction.
-template <typename AATy>
static bool
-memoryIsNotModifiedBetween(Instruction *FirstI, Instruction *SecondI, AATy &AA,
- const DataLayout &DL, DominatorTree *DT) {
+memoryIsNotModifiedBetween(Instruction *FirstI, Instruction *SecondI,
+ BatchAAResults &AA, const DataLayout &DL,
+ DominatorTree *DT) {
// Do a backwards scan through the CFG from SecondI to FirstI. Look for
// instructions which can modify the memory location accessed by SecondI.
//
@@ -801,272 +665,6 @@ memoryIsNotModifiedBetween(Instruction *FirstI, Instruction *SecondI, AATy &AA,
return true;
}
-/// Find all blocks that will unconditionally lead to the block BB and append
-/// them to F.
-static void findUnconditionalPreds(SmallVectorImpl<BasicBlock *> &Blocks,
- BasicBlock *BB, DominatorTree *DT) {
- for (BasicBlock *Pred : predecessors(BB)) {
- if (Pred == BB) continue;
- Instruction *PredTI = Pred->getTerminator();
- if (PredTI->getNumSuccessors() != 1)
- continue;
-
- if (DT->isReachableFromEntry(Pred))
- Blocks.push_back(Pred);
- }
-}
-
-/// Handle frees of entire structures whose dependency is a store
-/// to a field of that structure.
-static bool handleFree(CallInst *F, AliasAnalysis *AA,
- MemoryDependenceResults *MD, DominatorTree *DT,
- const TargetLibraryInfo *TLI,
- InstOverlapIntervalsTy &IOL,
- MapVector<Instruction *, bool> &ThrowableInst) {
- bool MadeChange = false;
-
- MemoryLocation Loc = MemoryLocation::getAfter(F->getOperand(0));
- SmallVector<BasicBlock *, 16> Blocks;
- Blocks.push_back(F->getParent());
-
- while (!Blocks.empty()) {
- BasicBlock *BB = Blocks.pop_back_val();
- Instruction *InstPt = BB->getTerminator();
- if (BB == F->getParent()) InstPt = F;
-
- MemDepResult Dep =
- MD->getPointerDependencyFrom(Loc, false, InstPt->getIterator(), BB);
- while (Dep.isDef() || Dep.isClobber()) {
- Instruction *Dependency = Dep.getInst();
- if (!hasAnalyzableMemoryWrite(Dependency, *TLI) ||
- !isRemovable(Dependency))
- break;
-
- Value *DepPointer =
- getUnderlyingObject(getStoredPointerOperand(Dependency, *TLI));
-
- // Check for aliasing.
- if (!AA->isMustAlias(F->getArgOperand(0), DepPointer))
- break;
-
- LLVM_DEBUG(
- dbgs() << "DSE: Dead Store to soon to be freed memory:\n DEAD: "
- << *Dependency << '\n');
-
- // DCE instructions only used to calculate that store.
- BasicBlock::iterator BBI(Dependency);
- deleteDeadInstruction(Dependency, &BBI, *MD, *TLI, IOL,
- ThrowableInst);
- ++NumFastStores;
- MadeChange = true;
-
- // Inst's old Dependency is now deleted. Compute the next dependency,
- // which may also be dead, as in
- // s[0] = 0;
- // s[1] = 0; // This has just been deleted.
- // free(s);
- Dep = MD->getPointerDependencyFrom(Loc, false, BBI, BB);
- }
-
- if (Dep.isNonLocal())
- findUnconditionalPreds(Blocks, BB, DT);
- }
-
- return MadeChange;
-}
-
-/// Check to see if the specified location may alias any of the stack objects in
-/// the DeadStackObjects set. If so, they become live because the location is
-/// being loaded.
-static void removeAccessedObjects(const MemoryLocation &LoadedLoc,
- SmallSetVector<const Value *, 16> &DeadStackObjects,
- const DataLayout &DL, AliasAnalysis *AA,
- const TargetLibraryInfo *TLI,
- const Function *F) {
- const Value *UnderlyingPointer = getUnderlyingObject(LoadedLoc.Ptr);
-
- // A constant can't be in the dead pointer set.
- if (isa<Constant>(UnderlyingPointer))
- return;
-
- // If the kill pointer can be easily reduced to an alloca, don't bother doing
- // extraneous AA queries.
- if (isa<AllocaInst>(UnderlyingPointer) || isa<Argument>(UnderlyingPointer)) {
- DeadStackObjects.remove(UnderlyingPointer);
- return;
- }
-
- // Remove objects that could alias LoadedLoc.
- DeadStackObjects.remove_if([&](const Value *I) {
- // See if the loaded location could alias the stack location.
- MemoryLocation StackLoc(I, getPointerSize(I, DL, *TLI, F));
- return !AA->isNoAlias(StackLoc, LoadedLoc);
- });
-}
-
-/// Remove dead stores to stack-allocated locations in the function end block.
-/// Ex:
-/// %A = alloca i32
-/// ...
-/// store i32 1, i32* %A
-/// ret void
-static bool handleEndBlock(BasicBlock &BB, AliasAnalysis *AA,
- MemoryDependenceResults *MD,
- const TargetLibraryInfo *TLI,
- InstOverlapIntervalsTy &IOL,
- MapVector<Instruction *, bool> &ThrowableInst) {
- bool MadeChange = false;
-
- // Keep track of all of the stack objects that are dead at the end of the
- // function.
- SmallSetVector<const Value*, 16> DeadStackObjects;
-
- // Find all of the alloca'd pointers in the entry block.
- BasicBlock &Entry = BB.getParent()->front();
- for (Instruction &I : Entry) {
- if (isa<AllocaInst>(&I))
- DeadStackObjects.insert(&I);
-
- // Okay, so these are dead heap objects, but if the pointer never escapes
- // then it's leaked by this function anyways.
- else if (isAllocLikeFn(&I, TLI) && !PointerMayBeCaptured(&I, true, true))
- DeadStackObjects.insert(&I);
- }
-
- // Treat byval or inalloca arguments the same, stores to them are dead at the
- // end of the function.
- for (Argument &AI : BB.getParent()->args())
- if (AI.hasPassPointeeByValueCopyAttr())
- DeadStackObjects.insert(&AI);
-
- const DataLayout &DL = BB.getModule()->getDataLayout();
-
- // Scan the basic block backwards
- for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){
- --BBI;
-
- // If we find a store, check to see if it points into a dead stack value.
- if (hasAnalyzableMemoryWrite(&*BBI, *TLI) && isRemovable(&*BBI)) {
- // See through pointer-to-pointer bitcasts
- SmallVector<const Value *, 4> Pointers;
- getUnderlyingObjects(getStoredPointerOperand(&*BBI, *TLI), Pointers);
-
- // Stores to stack values are valid candidates for removal.
- bool AllDead = true;
- for (const Value *Pointer : Pointers)
- if (!DeadStackObjects.count(Pointer)) {
- AllDead = false;
- break;
- }
-
- if (AllDead) {
- Instruction *Dead = &*BBI;
-
- LLVM_DEBUG(dbgs() << "DSE: Dead Store at End of Block:\n DEAD: "
- << *Dead << "\n Objects: ";
- for (SmallVectorImpl<const Value *>::iterator I =
- Pointers.begin(),
- E = Pointers.end();
- I != E; ++I) {
- dbgs() << **I;
- if (std::next(I) != E)
- dbgs() << ", ";
- } dbgs()
- << '\n');
-
- // DCE instructions only used to calculate that store.
- deleteDeadInstruction(Dead, &BBI, *MD, *TLI, IOL, ThrowableInst,
- &DeadStackObjects);
- ++NumFastStores;
- MadeChange = true;
- continue;
- }
- }
-
- // Remove any dead non-memory-mutating instructions.
- if (isInstructionTriviallyDead(&*BBI, TLI)) {
- LLVM_DEBUG(dbgs() << "DSE: Removing trivially dead instruction:\n DEAD: "
- << *&*BBI << '\n');
- deleteDeadInstruction(&*BBI, &BBI, *MD, *TLI, IOL, ThrowableInst,
- &DeadStackObjects);
- ++NumFastOther;
- MadeChange = true;
- continue;
- }
-
- if (isa<AllocaInst>(BBI)) {
- // Remove allocas from the list of dead stack objects; there can't be
- // any references before the definition.
- DeadStackObjects.remove(&*BBI);
- continue;
- }
-
- if (auto *Call = dyn_cast<CallBase>(&*BBI)) {
- // Remove allocation function calls from the list of dead stack objects;
- // there can't be any references before the definition.
- if (isAllocLikeFn(&*BBI, TLI))
- DeadStackObjects.remove(&*BBI);
-
- // If this call does not access memory, it can't be loading any of our
- // pointers.
- if (AA->doesNotAccessMemory(Call))
- continue;
-
- // If the call might load from any of our allocas, then any store above
- // the call is live.
- DeadStackObjects.remove_if([&](const Value *I) {
- // See if the call site touches the value.
- return isRefSet(AA->getModRefInfo(
- Call, I, getPointerSize(I, DL, *TLI, BB.getParent())));
- });
-
- // If all of the allocas were clobbered by the call then we're not going
- // to find anything else to process.
- if (DeadStackObjects.empty())
- break;
-
- continue;
- }
-
- // We can remove the dead stores, irrespective of the fence and its ordering
- // (release/acquire/seq_cst). Fences only constraints the ordering of
- // already visible stores, it does not make a store visible to other
- // threads. So, skipping over a fence does not change a store from being
- // dead.
- if (isa<FenceInst>(*BBI))
- continue;
-
- MemoryLocation LoadedLoc;
-
- // If we encounter a use of the pointer, it is no longer considered dead
- if (LoadInst *L = dyn_cast<LoadInst>(BBI)) {
- if (!L->isUnordered()) // Be conservative with atomic/volatile load
- break;
- LoadedLoc = MemoryLocation::get(L);
- } else if (VAArgInst *V = dyn_cast<VAArgInst>(BBI)) {
- LoadedLoc = MemoryLocation::get(V);
- } else if (!BBI->mayReadFromMemory()) {
- // Instruction doesn't read memory. Note that stores that weren't removed
- // above will hit this case.
- continue;
- } else {
- // Unknown inst; assume it clobbers everything.
- break;
- }
-
- // Remove any allocas from the DeadPointer set that are loaded, as this
- // makes any stores above the access live.
- removeAccessedObjects(LoadedLoc, DeadStackObjects, DL, AA, TLI, BB.getParent());
-
- // If all of the allocas were clobbered by the access then we're not going
- // to find anything else to process.
- if (DeadStackObjects.empty())
- break;
- }
-
- return MadeChange;
-}
-
static bool tryToShorten(Instruction *EarlierWrite, int64_t &EarlierStart,
uint64_t &EarlierSize, int64_t LaterStart,
uint64_t LaterSize, bool IsOverwriteEnd) {
@@ -1239,59 +837,10 @@ static bool removePartiallyOverlappedStores(const DataLayout &DL,
return Changed;
}
-static bool eliminateNoopStore(Instruction *Inst, BasicBlock::iterator &BBI,
- AliasAnalysis *AA, MemoryDependenceResults *MD,
- const DataLayout &DL,
- const TargetLibraryInfo *TLI,
- InstOverlapIntervalsTy &IOL,
- MapVector<Instruction *, bool> &ThrowableInst,
- DominatorTree *DT) {
- // Must be a store instruction.
- StoreInst *SI = dyn_cast<StoreInst>(Inst);
- if (!SI)
- return false;
-
- // If we're storing the same value back to a pointer that we just loaded from,
- // then the store can be removed.
- if (LoadInst *DepLoad = dyn_cast<LoadInst>(SI->getValueOperand())) {
- if (SI->getPointerOperand() == DepLoad->getPointerOperand() &&
- isRemovable(SI) &&
- memoryIsNotModifiedBetween(DepLoad, SI, *AA, DL, DT)) {
-
- LLVM_DEBUG(
- dbgs() << "DSE: Remove Store Of Load from same pointer:\n LOAD: "
- << *DepLoad << "\n STORE: " << *SI << '\n');
-
- deleteDeadInstruction(SI, &BBI, *MD, *TLI, IOL, ThrowableInst);
- ++NumRedundantStores;
- return true;
- }
- }
-
- // Remove null stores into the calloc'ed objects
- Constant *StoredConstant = dyn_cast<Constant>(SI->getValueOperand());
- if (StoredConstant && StoredConstant->isNullValue() && isRemovable(SI)) {
- Instruction *UnderlyingPointer =
- dyn_cast<Instruction>(getUnderlyingObject(SI->getPointerOperand()));
-
- if (UnderlyingPointer && isCallocLikeFn(UnderlyingPointer, TLI) &&
- memoryIsNotModifiedBetween(UnderlyingPointer, SI, *AA, DL, DT)) {
- LLVM_DEBUG(
- dbgs() << "DSE: Remove null store to the calloc'ed object:\n DEAD: "
- << *Inst << "\n OBJECT: " << *UnderlyingPointer << '\n');
-
- deleteDeadInstruction(SI, &BBI, *MD, *TLI, IOL, ThrowableInst);
- ++NumRedundantStores;
- return true;
- }
- }
- return false;
-}
-
-template <typename AATy>
static Constant *tryToMergePartialOverlappingStores(
StoreInst *Earlier, StoreInst *Later, int64_t InstWriteOffset,
- int64_t DepWriteOffset, const DataLayout &DL, AATy &AA, DominatorTree *DT) {
+ int64_t DepWriteOffset, const DataLayout &DL, BatchAAResults &AA,
+ DominatorTree *DT) {
if (Earlier && isa<ConstantInt>(Earlier->getValueOperand()) &&
DL.typeSizeEqualsStoreSize(Earlier->getValueOperand()->getType()) &&
@@ -1333,251 +882,7 @@ static Constant *tryToMergePartialOverlappingStores(
return nullptr;
}
-static bool eliminateDeadStores(BasicBlock &BB, AliasAnalysis *AA,
- MemoryDependenceResults *MD, DominatorTree *DT,
- const TargetLibraryInfo *TLI) {
- const DataLayout &DL = BB.getModule()->getDataLayout();
- bool MadeChange = false;
-
- MapVector<Instruction *, bool> ThrowableInst;
-
- // A map of interval maps representing partially-overwritten value parts.
- InstOverlapIntervalsTy IOL;
-
- // Do a top-down walk on the BB.
- for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) {
- // Handle 'free' calls specially.
- if (CallInst *F = isFreeCall(&*BBI, TLI)) {
- MadeChange |= handleFree(F, AA, MD, DT, TLI, IOL, ThrowableInst);
- // Increment BBI after handleFree has potentially deleted instructions.
- // This ensures we maintain a valid iterator.
- ++BBI;
- continue;
- }
-
- Instruction *Inst = &*BBI++;
-
- if (Inst->mayThrow()) {
- ThrowableInst[Inst] = true;
- continue;
- }
-
- // Check to see if Inst writes to memory. If not, continue.
- if (!hasAnalyzableMemoryWrite(Inst, *TLI))
- continue;
-
- // eliminateNoopStore will update in iterator, if necessary.
- if (eliminateNoopStore(Inst, BBI, AA, MD, DL, TLI, IOL,
- ThrowableInst, DT)) {
- MadeChange = true;
- continue;
- }
-
- // If we find something that writes memory, get its memory dependence.
- MemDepResult InstDep = MD->getDependency(Inst);
-
- // Ignore any store where we can't find a local dependence.
- // FIXME: cross-block DSE would be fun. :)
- if (!InstDep.isDef() && !InstDep.isClobber())
- continue;
-
- // Figure out what location is being stored to.
- MemoryLocation Loc = getLocForWrite(Inst, *TLI);
-
- // If we didn't get a useful location, fail.
- if (!Loc.Ptr)
- continue;
-
- // Loop until we find a store we can eliminate or a load that
- // invalidates the analysis. Without an upper bound on the number of
- // instructions examined, this analysis can become very time-consuming.
- // However, the potential gain diminishes as we process more instructions
- // without eliminating any of them. Therefore, we limit the number of
- // instructions we look at.
- auto Limit = MD->getDefaultBlockScanLimit();
- while (InstDep.isDef() || InstDep.isClobber()) {
- // Get the memory clobbered by the instruction we depend on. MemDep will
- // skip any instructions that 'Loc' clearly doesn't interact with. If we
- // end up depending on a may- or must-aliased load, then we can't optimize
- // away the store and we bail out. However, if we depend on something
- // that overwrites the memory location we *can* potentially optimize it.
- //
- // Find out what memory location the dependent instruction stores.
- Instruction *DepWrite = InstDep.getInst();
- if (!hasAnalyzableMemoryWrite(DepWrite, *TLI))
- break;
- MemoryLocation DepLoc = getLocForWrite(DepWrite, *TLI);
- // If we didn't get a useful location, or if it isn't a size, bail out.
- if (!DepLoc.Ptr)
- break;
-
- // Find the last throwable instruction not removed by call to
- // deleteDeadInstruction.
- Instruction *LastThrowing = nullptr;
- if (!ThrowableInst.empty())
- LastThrowing = ThrowableInst.back().first;
-
- // Make sure we don't look past a call which might throw. This is an
- // issue because MemoryDependenceAnalysis works in the wrong direction:
- // it finds instructions which dominate the current instruction, rather than
- // instructions which are post-dominated by the current instruction.
- //
- // If the underlying object is a non-escaping memory allocation, any store
- // to it is dead along the unwind edge. Otherwise, we need to preserve
- // the store.
- if (LastThrowing && DepWrite->comesBefore(LastThrowing)) {
- const Value *Underlying = getUnderlyingObject(DepLoc.Ptr);
- bool IsStoreDeadOnUnwind = isa<AllocaInst>(Underlying);
- if (!IsStoreDeadOnUnwind) {
- // We're looking for a call to an allocation function
- // where the allocation doesn't escape before the last
- // throwing instruction; PointerMayBeCaptured
- // reasonably fast approximation.
- IsStoreDeadOnUnwind = isAllocLikeFn(Underlying, TLI) &&
- !PointerMayBeCaptured(Underlying, false, true);
- }
- if (!IsStoreDeadOnUnwind)
- break;
- }
-
- // If we find a write that is a) removable (i.e., non-volatile), b) is
- // completely obliterated by the store to 'Loc', and c) which we know that
- // 'Inst' doesn't load from, then we can remove it.
- // Also try to merge two stores if a later one only touches memory written
- // to by the earlier one.
- if (isRemovable(DepWrite) &&
- !isPossibleSelfRead(Inst, Loc, DepWrite, *TLI, *AA)) {
- int64_t InstWriteOffset, DepWriteOffset;
- OverwriteResult OR = isOverwrite(Inst, DepWrite, Loc, DepLoc, DL, *TLI,
- DepWriteOffset, InstWriteOffset, *AA,
- BB.getParent());
- if (OR == OW_MaybePartial)
- OR = isPartialOverwrite(Loc, DepLoc, DepWriteOffset, InstWriteOffset,
- DepWrite, IOL);
-
- if (OR == OW_Complete) {
- LLVM_DEBUG(dbgs() << "DSE: Remove Dead Store:\n DEAD: " << *DepWrite
- << "\n KILLER: " << *Inst << '\n');
-
- // Delete the store and now-dead instructions that feed it.
- deleteDeadInstruction(DepWrite, &BBI, *MD, *TLI, IOL,
- ThrowableInst);
- ++NumFastStores;
- MadeChange = true;
-
- // We erased DepWrite; start over.
- InstDep = MD->getDependency(Inst);
- continue;
- } else if ((OR == OW_End && isShortenableAtTheEnd(DepWrite)) ||
- ((OR == OW_Begin &&
- isShortenableAtTheBeginning(DepWrite)))) {
- assert(!EnablePartialOverwriteTracking && "Do not expect to perform "
- "when partial-overwrite "
- "tracking is enabled");
- // The overwrite result is known, so these must be known, too.
- uint64_t EarlierSize = DepLoc.Size.getValue();
- uint64_t LaterSize = Loc.Size.getValue();
- bool IsOverwriteEnd = (OR == OW_End);
- MadeChange |= tryToShorten(DepWrite, DepWriteOffset, EarlierSize,
- InstWriteOffset, LaterSize, IsOverwriteEnd);
- } else if (EnablePartialStoreMerging &&
- OR == OW_PartialEarlierWithFullLater) {
- auto *Earlier = dyn_cast<StoreInst>(DepWrite);
- auto *Later = dyn_cast<StoreInst>(Inst);
- if (Constant *C = tryToMergePartialOverlappingStores(
- Earlier, Later, InstWriteOffset, DepWriteOffset, DL, *AA,
- DT)) {
- auto *SI = new StoreInst(
- C, Earlier->getPointerOperand(), false, Earlier->getAlign(),
- Earlier->getOrdering(), Earlier->getSyncScopeID(), DepWrite);
-
- unsigned MDToKeep[] = {LLVMContext::MD_dbg, LLVMContext::MD_tbaa,
- LLVMContext::MD_alias_scope,
- LLVMContext::MD_noalias,
- LLVMContext::MD_nontemporal};
- SI->copyMetadata(*DepWrite, MDToKeep);
- ++NumModifiedStores;
-
- // Delete the old stores and now-dead instructions that feed them.
- deleteDeadInstruction(Inst, &BBI, *MD, *TLI, IOL,
- ThrowableInst);
- deleteDeadInstruction(DepWrite, &BBI, *MD, *TLI, IOL,
- ThrowableInst);
- MadeChange = true;
-
- // We erased DepWrite and Inst (Loc); start over.
- break;
- }
- }
- }
-
- // If this is a may-aliased store that is clobbering the store value, we
- // can keep searching past it for another must-aliased pointer that stores
- // to the same location. For example, in:
- // store -> P
- // store -> Q
- // store -> P
- // we can remove the first store to P even though we don't know if P and Q
- // alias.
- if (DepWrite == &BB.front()) break;
-
- // Can't look past this instruction if it might read 'Loc'.
- if (isRefSet(AA->getModRefInfo(DepWrite, Loc)))
- break;
-
- InstDep = MD->getPointerDependencyFrom(Loc, /*isLoad=*/ false,
- DepWrite->getIterator(), &BB,
- /*QueryInst=*/ nullptr, &Limit);
- }
- }
-
- if (EnablePartialOverwriteTracking)
- MadeChange |= removePartiallyOverlappedStores(DL, IOL, *TLI);
-
- // If this block ends in a return, unwind, or unreachable, all allocas are
- // dead at its end, which means stores to them are also dead.
- if (BB.getTerminator()->getNumSuccessors() == 0)
- MadeChange |= handleEndBlock(BB, AA, MD, TLI, IOL, ThrowableInst);
-
- return MadeChange;
-}
-
-static bool eliminateDeadStores(Function &F, AliasAnalysis *AA,
- MemoryDependenceResults *MD, DominatorTree *DT,
- const TargetLibraryInfo *TLI) {
- bool MadeChange = false;
- for (BasicBlock &BB : F)
- // Only check non-dead blocks. Dead blocks may have strange pointer
- // cycles that will confuse alias analysis.
- if (DT->isReachableFromEntry(&BB))
- MadeChange |= eliminateDeadStores(BB, AA, MD, DT, TLI);
-
- return MadeChange;
-}
-
namespace {
-//=============================================================================
-// MemorySSA backed dead store elimination.
-//
-// The code below implements dead store elimination using MemorySSA. It uses
-// the following general approach: given a MemoryDef, walk upwards to find
-// clobbering MemoryDefs that may be killed by the starting def. Then check
-// that there are no uses that may read the location of the original MemoryDef
-// in between both MemoryDefs. A bit more concretely:
-//
-// For all MemoryDefs StartDef:
-// 1. Get the next dominating clobbering MemoryDef (EarlierAccess) by walking
-// upwards.
-// 2. Check that there are no reads between EarlierAccess and the StartDef by
-// checking all uses starting at EarlierAccess and walking until we see
-// StartDef.
-// 3. For each found CurrentDef, check that:
-// 1. There are no barrier instructions between CurrentDef and StartDef (like
-// throws or stores with ordering constraints).
-// 2. StartDef is executed whenever CurrentDef is executed.
-// 3. StartDef completely overwrites CurrentDef.
-// 4. Erase CurrentDef from the function and MemorySSA.
-
// Returns true if \p I is an intrisnic that does not read or write memory.
bool isNoopIntrinsic(Instruction *I) {
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
@@ -2508,10 +1813,9 @@ struct DSEState {
}
};
-bool eliminateDeadStoresMemorySSA(Function &F, AliasAnalysis &AA,
- MemorySSA &MSSA, DominatorTree &DT,
- PostDominatorTree &PDT,
- const TargetLibraryInfo &TLI) {
+bool eliminateDeadStores(Function &F, AliasAnalysis &AA, MemorySSA &MSSA,
+ DominatorTree &DT, PostDominatorTree &PDT,
+ const TargetLibraryInfo &TLI) {
bool MadeChange = false;
DSEState State = DSEState::get(F, AA, MSSA, DT, PDT, TLI);
@@ -2686,18 +1990,10 @@ PreservedAnalyses DSEPass::run(Function &F, FunctionAnalysisManager &AM) {
AliasAnalysis &AA = AM.getResult<AAManager>(F);
const TargetLibraryInfo &TLI = AM.getResult<TargetLibraryAnalysis>(F);
DominatorTree &DT = AM.getResult<DominatorTreeAnalysis>(F);
+ MemorySSA &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA();
+ PostDominatorTree &PDT = AM.getResult<PostDominatorTreeAnalysis>(F);
- bool Changed = false;
- if (EnableMemorySSA) {
- MemorySSA &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA();
- PostDominatorTree &PDT = AM.getResult<PostDominatorTreeAnalysis>(F);
-
- Changed = eliminateDeadStoresMemorySSA(F, AA, MSSA, DT, PDT, TLI);
- } else {
- MemoryDependenceResults &MD = AM.getResult<MemoryDependenceAnalysis>(F);
-
- Changed = eliminateDeadStores(F, &AA, &MD, &DT, &TLI);
- }
+ bool Changed = eliminateDeadStores(F, AA, MSSA, DT, PDT, TLI);
#ifdef LLVM_ENABLE_STATS
if (AreStatisticsEnabled())
@@ -2711,10 +2007,7 @@ PreservedAnalyses DSEPass::run(Function &F, FunctionAnalysisManager &AM) {
PreservedAnalyses PA;
PA.preserveSet<CFGAnalyses>();
PA.preserve<GlobalsAA>();
- if (EnableMemorySSA)
- PA.preserve<MemorySSAAnalysis>();
- else
- PA.preserve<MemoryDependenceAnalysis>();
+ PA.preserve<MemorySSAAnalysis>();
return PA;
}
@@ -2737,20 +2030,11 @@ class DSELegacyPass : public FunctionPass {
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
const TargetLibraryInfo &TLI =
getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
+ MemorySSA &MSSA = getAnalysis<MemorySSAWrapperPass>().getMSSA();
+ PostDominatorTree &PDT =
+ getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree();
- bool Changed = false;
- if (EnableMemorySSA) {
- MemorySSA &MSSA = getAnalysis<MemorySSAWrapperPass>().getMSSA();
- PostDominatorTree &PDT =
- getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree();
-
- Changed = eliminateDeadStoresMemorySSA(F, AA, MSSA, DT, PDT, TLI);
- } else {
- MemoryDependenceResults &MD =
- getAnalysis<MemoryDependenceWrapperPass>().getMemDep();
-
- Changed = eliminateDeadStores(F, &AA, &MD, &DT, &TLI);
- }
+ bool Changed = eliminateDeadStores(F, AA, MSSA, DT, PDT, TLI);
#ifdef LLVM_ENABLE_STATS
if (AreStatisticsEnabled())
@@ -2768,16 +2052,10 @@ class DSELegacyPass : public FunctionPass {
AU.addPreserved<GlobalsAAWrapperPass>();
AU.addRequired<DominatorTreeWrapperPass>();
AU.addPreserved<DominatorTreeWrapperPass>();
-
- if (EnableMemorySSA) {
- AU.addRequired<PostDominatorTreeWrapperPass>();
- AU.addRequired<MemorySSAWrapperPass>();
- AU.addPreserved<PostDominatorTreeWrapperPass>();
- AU.addPreserved<MemorySSAWrapperPass>();
- } else {
- AU.addRequired<MemoryDependenceWrapperPass>();
- AU.addPreserved<MemoryDependenceWrapperPass>();
- }
+ AU.addRequired<PostDominatorTreeWrapperPass>();
+ AU.addRequired<MemorySSAWrapperPass>();
+ AU.addPreserved<PostDominatorTreeWrapperPass>();
+ AU.addPreserved<MemorySSAWrapperPass>();
}
};
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/2011-03-25-DSEMiscompile.ll b/llvm/test/Transforms/DeadStoreElimination/2011-03-25-DSEMiscompile.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/2011-03-25-DSEMiscompile.ll
rename to llvm/test/Transforms/DeadStoreElimination/2011-03-25-DSEMiscompile.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-EndOfFunction.ll b/llvm/test/Transforms/DeadStoreElimination/2011-09-06-EndOfFunction.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-EndOfFunction.ll
rename to llvm/test/Transforms/DeadStoreElimination/2011-09-06-EndOfFunction.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-MemCpy.ll b/llvm/test/Transforms/DeadStoreElimination/2011-09-06-MemCpy.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/2011-09-06-MemCpy.ll
rename to llvm/test/Transforms/DeadStoreElimination/2011-09-06-MemCpy.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/2016-07-17-UseAfterFree.ll b/llvm/test/Transforms/DeadStoreElimination/2016-07-17-UseAfterFree.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/2016-07-17-UseAfterFree.ll
rename to llvm/test/Transforms/DeadStoreElimination/2016-07-17-UseAfterFree.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-03-25-DSEMiscompile.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-03-25-DSEMiscompile.ll
deleted file mode 100644
index 826732c07af9..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-03-25-DSEMiscompile.ll
+++ /dev/null
@@ -1,23 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-; PR9561
-target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
-target triple = "i386-apple-darwin9.8"
-
- at A = external global [0 x i32]
-
-declare ghccc void @Func2(i32*, i32*, i32*, i32)
-
-define ghccc void @Func1(i32* noalias %Arg1, i32* noalias %Arg2, i32* %Arg3, i32 %Arg4) {
-entry:
- store i32 add (i32 ptrtoint ([0 x i32]* @A to i32), i32 1), i32* %Arg2
-; CHECK: store i32 add (i32 ptrtoint ([0 x i32]* @A to i32), i32 1), i32* %Arg2
- %ln2gz = getelementptr i32, i32* %Arg1, i32 14
- %ln2gA = bitcast i32* %ln2gz to double*
- %ln2gB = load double, double* %ln2gA
- %ln2gD = getelementptr i32, i32* %Arg2, i32 -3
- %ln2gE = bitcast i32* %ln2gD to double*
- store double %ln2gB, double* %ln2gE
-; CHECK: store double %ln2gB, double* %ln2gE
- tail call ghccc void @Func2(i32* %Arg1, i32* %Arg2, i32* %Arg3, i32 %Arg4) nounwind
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-EndOfFunction.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-EndOfFunction.ll
deleted file mode 100644
index 635498336ff2..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-EndOfFunction.ll
+++ /dev/null
@@ -1,23 +0,0 @@
-; RUN: opt -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-apple-darwin"
-
-%"class.std::auto_ptr" = type { i32* }
-
-; CHECK-LABEL: @_Z3foov(
-define void @_Z3foov(%"class.std::auto_ptr"* noalias nocapture sret(%"class.std::auto_ptr") %agg.result) uwtable ssp {
-_ZNSt8auto_ptrIiED1Ev.exit:
- %temp.lvalue = alloca %"class.std::auto_ptr", align 8
- call void @_Z3barv(%"class.std::auto_ptr"* sret(%"class.std::auto_ptr") %temp.lvalue)
- %_M_ptr.i.i = getelementptr inbounds %"class.std::auto_ptr", %"class.std::auto_ptr"* %temp.lvalue, i64 0, i32 0
- %tmp.i.i = load i32*, i32** %_M_ptr.i.i, align 8
-; CHECK-NOT: store i32* null
- store i32* null, i32** %_M_ptr.i.i, align 8
- %_M_ptr.i.i4 = getelementptr inbounds %"class.std::auto_ptr", %"class.std::auto_ptr"* %agg.result, i64 0, i32 0
- store i32* %tmp.i.i, i32** %_M_ptr.i.i4, align 8
-; CHECK: ret void
- ret void
-}
-
-declare void @_Z3barv(%"class.std::auto_ptr"* sret(%"class.std::auto_ptr"))
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-MemCpy.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-MemCpy.ll
deleted file mode 100644
index 6837a3dd852f..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2011-09-06-MemCpy.ll
+++ /dev/null
@@ -1,85 +0,0 @@
-; RUN: opt -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-%struct.pair.162 = type { %struct.BasicBlock*, i32, [4 x i8] }
-%struct.BasicBlock = type { %struct.Value, %struct.ilist_node.24, %struct.iplist.22, %struct.Function* }
-%struct.Value = type { i32 (...)**, i8, i8, i16, %struct.Type*, %struct.Use*, %struct.StringMapEntry* }
-%struct.Type = type { %struct.LLVMContext*, i8, [3 x i8], i32, {}* }
-%struct.LLVMContext = type { %struct.LLVMContextImpl* }
-%struct.LLVMContextImpl = type opaque
-%struct.Use = type { %struct.Value*, %struct.Use*, %struct.PointerIntPair }
-%struct.PointerIntPair = type { i64 }
-%struct.StringMapEntry = type opaque
-%struct.ilist_node.24 = type { %struct.ilist_half_node.23, %struct.BasicBlock* }
-%struct.ilist_half_node.23 = type { %struct.BasicBlock* }
-%struct.iplist.22 = type { %struct.ilist_traits.21, %struct.Instruction* }
-%struct.ilist_traits.21 = type { %struct.ilist_half_node.25 }
-%struct.ilist_half_node.25 = type { %struct.Instruction* }
-%struct.Instruction = type { [52 x i8], %struct.ilist_node.26, %struct.BasicBlock*, %struct.DebugLoc }
-%struct.ilist_node.26 = type { %struct.ilist_half_node.25, %struct.Instruction* }
-%struct.DebugLoc = type { i32, i32 }
-%struct.Function = type { %struct.GlobalValue, %struct.ilist_node.14, %struct.iplist.4, %struct.iplist, %struct.ValueSymbolTable*, %struct.AttrListPtr }
-%struct.GlobalValue = type <{ [52 x i8], [4 x i8], %struct.Module*, i8, i16, [5 x i8], %struct.basic_string }>
-%struct.Module = type { %struct.LLVMContext*, %struct.iplist.20, %struct.iplist.16, %struct.iplist.12, %struct.vector.2, %struct.ilist, %struct.basic_string, %struct.ValueSymbolTable*, %struct.OwningPtr, %struct.basic_string, %struct.basic_string, %struct.basic_string, i8* }
-%struct.iplist.20 = type { %struct.ilist_traits.19, %struct.GlobalVariable* }
-%struct.ilist_traits.19 = type { %struct.ilist_node.18 }
-%struct.ilist_node.18 = type { %struct.ilist_half_node.17, %struct.GlobalVariable* }
-%struct.ilist_half_node.17 = type { %struct.GlobalVariable* }
-%struct.GlobalVariable = type { %struct.GlobalValue, %struct.ilist_node.18, i8, [7 x i8] }
-%struct.iplist.16 = type { %struct.ilist_traits.15, %struct.Function* }
-%struct.ilist_traits.15 = type { %struct.ilist_node.14 }
-%struct.ilist_node.14 = type { %struct.ilist_half_node.13, %struct.Function* }
-%struct.ilist_half_node.13 = type { %struct.Function* }
-%struct.iplist.12 = type { %struct.ilist_traits.11, %struct.GlobalAlias* }
-%struct.ilist_traits.11 = type { %struct.ilist_node.10 }
-%struct.ilist_node.10 = type { %struct.ilist_half_node.9, %struct.GlobalAlias* }
-%struct.ilist_half_node.9 = type { %struct.GlobalAlias* }
-%struct.GlobalAlias = type { %struct.GlobalValue, %struct.ilist_node.10 }
-%struct.vector.2 = type { %struct._Vector_base.1 }
-%struct._Vector_base.1 = type { %struct._Vector_impl.0 }
-%struct._Vector_impl.0 = type { %struct.basic_string*, %struct.basic_string*, %struct.basic_string* }
-%struct.basic_string = type { %struct._Alloc_hider }
-%struct._Alloc_hider = type { i8* }
-%struct.ilist = type { %struct.iplist.8 }
-%struct.iplist.8 = type { %struct.ilist_traits.7, %struct.NamedMDNode* }
-%struct.ilist_traits.7 = type { %struct.ilist_node.6 }
-%struct.ilist_node.6 = type { %struct.ilist_half_node.5, %struct.NamedMDNode* }
-%struct.ilist_half_node.5 = type { %struct.NamedMDNode* }
-%struct.NamedMDNode = type { %struct.ilist_node.6, %struct.basic_string, %struct.Module*, i8* }
-%struct.ValueSymbolTable = type opaque
-%struct.OwningPtr = type { %struct.GVMaterializer* }
-%struct.GVMaterializer = type opaque
-%struct.iplist.4 = type { %struct.ilist_traits.3, %struct.BasicBlock* }
-%struct.ilist_traits.3 = type { %struct.ilist_half_node.23 }
-%struct.iplist = type { %struct.ilist_traits, %struct.Argument* }
-%struct.ilist_traits = type { %struct.ilist_half_node }
-%struct.ilist_half_node = type { %struct.Argument* }
-%struct.Argument = type { %struct.Value, %struct.ilist_node, %struct.Function* }
-%struct.ilist_node = type { %struct.ilist_half_node, %struct.Argument* }
-%struct.AttrListPtr = type { %struct.AttributeListImpl* }
-%struct.AttributeListImpl = type opaque
-
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
-
-; CHECK: _ZSt9iter_swapIPSt4pairIPN4llvm10BasicBlockEjES5_EvT_T0_
-; CHECK: store
-; CHECK: ret void
-define void @_ZSt9iter_swapIPSt4pairIPN4llvm10BasicBlockEjES5_EvT_T0_(%struct.pair.162* %__a, %struct.pair.162* %__b) nounwind uwtable inlinehint {
-entry:
- %memtmp = alloca %struct.pair.162, align 8
- %0 = getelementptr inbounds %struct.pair.162, %struct.pair.162* %memtmp, i64 0, i32 0
- %1 = getelementptr inbounds %struct.pair.162, %struct.pair.162* %__a, i64 0, i32 0
- %2 = load %struct.BasicBlock*, %struct.BasicBlock** %1, align 8
- store %struct.BasicBlock* %2, %struct.BasicBlock** %0, align 8
- %3 = getelementptr inbounds %struct.pair.162, %struct.pair.162* %memtmp, i64 0, i32 1
- %4 = getelementptr inbounds %struct.pair.162, %struct.pair.162* %__a, i64 0, i32 1
- %5 = load i32, i32* %4, align 4
- store i32 %5, i32* %3, align 8
- %6 = bitcast %struct.pair.162* %__a to i8*
- %7 = bitcast %struct.pair.162* %__b to i8*
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %6, i8* %7, i64 12, i1 false)
- %8 = bitcast %struct.pair.162* %memtmp to i8*
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %7, i8* %8, i64 12, i1 false)
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2016-07-17-UseAfterFree.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2016-07-17-UseAfterFree.ll
deleted file mode 100644
index 7b74dde7d6b0..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/2016-07-17-UseAfterFree.ll
+++ /dev/null
@@ -1,32 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S -enable-dse-partial-overwrite-tracking | FileCheck %s
-; PR28588
-
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Function Attrs: nounwind
-define void @_UPT_destroy(i8* nocapture %ptr) local_unnamed_addr #0 {
-entry:
- %edi = getelementptr inbounds i8, i8* %ptr, i64 8
-
-; CHECK-NOT: tail call void @llvm.memset.p0i8.i64(i8* align 8 %edi, i8 0, i64 176, i1 false)
-; CHECK-NOT: store i32 -1, i32* %addr
-
- tail call void @llvm.memset.p0i8.i64(i8* align 8 %edi, i8 0, i64 176, i1 false)
- %format4.i = getelementptr inbounds i8, i8* %ptr, i64 144
- %addr = bitcast i8* %format4.i to i32*
- store i32 -1, i32* %addr, align 8
-
-; CHECK: tail call void @free
- tail call void @free(i8* nonnull %ptr)
- ret void
-}
-
-; Function Attrs: nounwind
-declare void @free(i8* nocapture) local_unnamed_addr #0
-
-; Function Attrs: argmemonly nounwind
-declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #1
-
-attributes #0 = { nounwind }
-attributes #1 = { argmemonly nounwind }
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/DeleteThrowableInst.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/DeleteThrowableInst.ll
deleted file mode 100644
index 768b3bb91daf..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/DeleteThrowableInst.ll
+++ /dev/null
@@ -1,41 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-declare i8* @_Znwj(i32) willreturn
-declare void @foo() readnone willreturn
-
-define void @test1(i8** %ptr) {
-; CHECK-LABEL: @test1(
-; CHECK-NEXT: [[VAL:%.*]] = inttoptr i64 23452 to i8*
-; CHECK-NEXT: store i8* [[VAL]], i8** [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
- %val = inttoptr i64 23452 to i8*
- store i8* %val, i8** %ptr
- %call = call i8* @_Znwj(i32 1)
- store i8* %call, i8** %ptr
- store i8* %val, i8** %ptr
- ret void
-}
-
-define void @test2(i8** %ptr, i8* %p1, i8* %p2) {
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: [[VAL:%.*]] = inttoptr i64 23452 to i8*
-; CHECK-NEXT: store i8* [[VAL]], i8** [[PTR:%.*]]
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: store i8* [[P1:%.*]], i8** [[PTR]]
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: store i8* [[VAL]], i8** [[PTR]]
-; CHECK-NEXT: ret void
-;
- %val = inttoptr i64 23452 to i8*
- store i8* %val, i8** %ptr
- call void @foo()
- store i8* %p1, i8** %ptr
- call void @foo()
- store i8* %p2, i8** %ptr
- %call = call i8* @_Znwj(i32 1)
- store i8* %call, i8** %ptr
- store i8* %val, i8** %ptr
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreBegin.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreBegin.ll
deleted file mode 100644
index 93279b8eb37e..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreBegin.ll
+++ /dev/null
@@ -1,395 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-define void @write4to7(i32* nocapture %p) {
-; CHECK-LABEL: @write4to7(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i1 false)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 1
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i1 false)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 1
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @write4to7_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @write4to7_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 1
-; CHECK-NEXT: store atomic i32 1, i32* [[ARRAYIDX1]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 1
- store atomic i32 1, i32* %arrayidx1 unordered, align 4
- ret void
-}
-
-define void @write0to3(i32* nocapture %p) {
-; CHECK-LABEL: @write0to3(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i1 false)
-; CHECK-NEXT: store i32 1, i32* [[P]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i1 false)
- store i32 1, i32* %p, align 4
- ret void
-}
-
-define void @write0to3_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @write0to3_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: store atomic i32 1, i32* [[P]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- store atomic i32 1, i32* %p unordered, align 4
- ret void
-}
-
-; Atomicity of the store is weaker from the memset
-define void @write0to3_atomic_weaker(i32* nocapture %p) {
-; CHECK-LABEL: @write0to3_atomic_weaker(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: store i32 1, i32* [[P]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- store i32 1, i32* %p, align 4
- ret void
-}
-
-define void @write0to7(i32* nocapture %p) {
-; CHECK-LABEL: @write0to7(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 8
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i1 false)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i64*
-; CHECK-NEXT: store i64 1, i64* [[P4]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i1 false)
- %p4 = bitcast i32* %p to i64*
- store i64 1, i64* %p4, align 8
- ret void
-}
-
-; Changing the memset start and length is okay here because the
-; store is a multiple of the memset element size
-define void @write0to7_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @write0to7_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 8
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i64*
-; CHECK-NEXT: store atomic i64 1, i64* [[P4]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i32 4)
- %p4 = bitcast i32* %p to i64*
- store atomic i64 1, i64* %p4 unordered, align 8
- ret void
-}
-
-define void @write0to7_2(i32* nocapture %p) {
-; CHECK-LABEL: @write0to7_2(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i1 false)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i64*
-; CHECK-NEXT: store i64 1, i64* [[P4]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i1 false)
- %p4 = bitcast i32* %p to i64*
- store i64 1, i64* %p4, align 8
- ret void
-}
-
-define void @write0to7_2_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @write0to7_2_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i64*
-; CHECK-NEXT: store atomic i64 1, i64* [[P4]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- %p4 = bitcast i32* %p to i64*
- store atomic i64 1, i64* %p4 unordered, align 8
- ret void
-}
-
-; We do not trim the beginning of the eariler write if the alignment of the
-; start pointer is changed.
-define void @dontwrite0to3_align8(i32* nocapture %p) {
-; CHECK-LABEL: @dontwrite0to3_align8(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[P3]], i8 0, i64 32, i1 false)
-; CHECK-NEXT: store i32 1, i32* [[P]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 8 %p3, i8 0, i64 32, i1 false)
- store i32 1, i32* %p, align 4
- ret void
-}
-
-define void @dontwrite0to3_align8_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @dontwrite0to3_align8_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[P3]], i8 0, i64 32, i32 4)
-; CHECK-NEXT: store atomic i32 1, i32* [[P]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %p3, i8 0, i64 32, i32 4)
- store atomic i32 1, i32* %p unordered, align 4
- ret void
-}
-
-define void @dontwrite0to1(i32* nocapture %p) {
-; CHECK-LABEL: @dontwrite0to1(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 32, i1 false)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i16*
-; CHECK-NEXT: store i16 1, i16* [[P4]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i1 false)
- %p4 = bitcast i32* %p to i16*
- store i16 1, i16* %p4, align 4
- ret void
-}
-
-define void @dontwrite0to1_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @dontwrite0to1_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 32, i32 4)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i16*
-; CHECK-NEXT: store atomic i16 1, i16* [[P4]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i32 4)
- %p4 = bitcast i32* %p to i16*
- store atomic i16 1, i16* %p4 unordered, align 4
- ret void
-}
-
-define void @write2to10(i32* nocapture %p) {
-; CHECK-LABEL: @write2to10(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 28, i1 false)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i16*
-; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, i16* [[P4]], i64 1
-; CHECK-NEXT: [[P5:%.*]] = bitcast i16* [[ARRAYIDX2]] to i64*
-; CHECK-NEXT: store i64 1, i64* [[P5]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i1 false)
- %p4 = bitcast i32* %p to i16*
- %arrayidx2 = getelementptr inbounds i16, i16* %p4, i64 1
- %p5 = bitcast i16* %arrayidx2 to i64*
- store i64 1, i64* %p5, align 8
- ret void
-}
-
-define void @write2to10_atomic(i32* nocapture %p) {
-; CHECK-LABEL: @write2to10_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[P3]], i64 4
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[TMP0]], i8 0, i64 28, i32 4)
-; CHECK-NEXT: [[P4:%.*]] = bitcast i32* [[P]] to i16*
-; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i16, i16* [[P4]], i64 1
-; CHECK-NEXT: [[P5:%.*]] = bitcast i16* [[ARRAYIDX2]] to i64*
-; CHECK-NEXT: store atomic i64 1, i64* [[P5]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i32 4)
- %p4 = bitcast i32* %p to i16*
- %arrayidx2 = getelementptr inbounds i16, i16* %p4, i64 1
- %p5 = bitcast i16* %arrayidx2 to i64*
- store atomic i64 1, i64* %p5 unordered, align 8
- ret void
-}
-
-define void @write8To15AndThen0To7(i64* nocapture %P) {
-; CHECK-LABEL: @write8To15AndThen0To7(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[MYBASE0]], i64 16
-; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP0]], i8 0, i64 16, i1 false)
-; CHECK-NEXT: [[BASE64_0:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 0
-; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 1
-; CHECK-NEXT: store i64 1, i64* [[BASE64_1]]
-; CHECK-NEXT: store i64 2, i64* [[BASE64_0]]
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i1 false)
-
- %base64_0 = getelementptr inbounds i64, i64* %P, i64 0
- %base64_1 = getelementptr inbounds i64, i64* %P, i64 1
-
- store i64 1, i64* %base64_1
- store i64 2, i64* %base64_0
- ret void
-}
-
-define void @write8To15AndThen0To7_atomic(i64* nocapture %P) {
-; CHECK-LABEL: @write8To15AndThen0To7_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[MYBASE0]], i64 16
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[TMP0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_0:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 0
-; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 1
-; CHECK-NEXT: store atomic i64 1, i64* [[BASE64_1]] unordered, align 8
-; CHECK-NEXT: store atomic i64 2, i64* [[BASE64_0]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_0 = getelementptr inbounds i64, i64* %P, i64 0
- %base64_1 = getelementptr inbounds i64, i64* %P, i64 1
-
- store atomic i64 1, i64* %base64_1 unordered, align 8
- store atomic i64 2, i64* %base64_0 unordered, align 8
- ret void
-}
-
-define void @write8To15AndThen0To7_atomic_weaker(i64* nocapture %P) {
-; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[MYBASE0]], i64 16
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[TMP0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_0:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 0
-; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 1
-; CHECK-NEXT: store atomic i64 1, i64* [[BASE64_1]] unordered, align 8
-; CHECK-NEXT: store i64 2, i64* [[BASE64_0]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_0 = getelementptr inbounds i64, i64* %P, i64 0
- %base64_1 = getelementptr inbounds i64, i64* %P, i64 1
-
- store atomic i64 1, i64* %base64_1 unordered, align 8
- store i64 2, i64* %base64_0, align 8
- ret void
-}
-
-define void @write8To15AndThen0To7_atomic_weaker_2(i64* nocapture %P) {
-; CHECK-LABEL: @write8To15AndThen0To7_atomic_weaker_2(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, i8* [[MYBASE0]], i64 16
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[TMP0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_0:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 0
-; CHECK-NEXT: [[BASE64_1:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 1
-; CHECK-NEXT: store i64 1, i64* [[BASE64_1]], align 8
-; CHECK-NEXT: store atomic i64 2, i64* [[BASE64_0]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_0 = getelementptr inbounds i64, i64* %P, i64 0
- %base64_1 = getelementptr inbounds i64, i64* %P, i64 1
-
- store i64 1, i64* %base64_1, align 8
- store atomic i64 2, i64* %base64_0 unordered, align 8
- ret void
-}
-
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
-declare void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* nocapture, i8, i64, i32) nounwind
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreEnd.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreEnd.ll
deleted file mode 100644
index a8f09e3e3b44..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/OverwriteStoreEnd.ll
+++ /dev/null
@@ -1,390 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-
-%struct.vec2 = type { <4 x i32>, <4 x i32> }
-%struct.vec2plusi = type { <4 x i32>, <4 x i32>, i32 }
-
- at glob1 = global %struct.vec2 zeroinitializer, align 16
- at glob2 = global %struct.vec2plusi zeroinitializer, align 16
-
-define void @write24to28(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write24to28(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 24, i1 false)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i1 false)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @write24to28_atomic(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write24to28_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store atomic i32 1, i32* [[ARRAYIDX1]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store atomic i32 1, i32* %arrayidx1 unordered, align 4
- ret void
-}
-
-; Atomicity of the store is weaker from the memset
-define void @write24to28_atomic_weaker(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write24to28_atomic_weaker(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[ARRAYIDX0:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i64 1
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[ARRAYIDX0]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 24, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %arrayidx0 = getelementptr inbounds i32, i32* %p, i64 1
- %p3 = bitcast i32* %arrayidx0 to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 28, i32 4)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @write28to32(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write28to32(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 28, i1 false)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i1 false)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @write28to32_atomic(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write28to32_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[P3]], i8 0, i64 28, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store atomic i32 1, i32* [[ARRAYIDX1]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %p3, i8 0, i64 32, i32 4)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store atomic i32 1, i32* %arrayidx1 unordered, align 4
- ret void
-}
-
-define void @dontwrite28to32memset(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @dontwrite28to32memset(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 16 [[P3]], i8 0, i64 32, i1 false)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.p0i8.i64(i8* align 16 %p3, i8 0, i64 32, i1 false)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @dontwrite28to32memset_atomic(i32* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @dontwrite28to32memset_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[P3:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 16 [[P3]], i8 0, i64 32, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 7
-; CHECK-NEXT: store atomic i32 1, i32* [[ARRAYIDX1]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %p3 = bitcast i32* %p to i8*
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 16 %p3, i8 0, i64 32, i32 4)
- %arrayidx1 = getelementptr inbounds i32, i32* %p, i64 7
- store atomic i32 1, i32* %arrayidx1 unordered, align 4
- ret void
-}
-
-define void @write32to36(%struct.vec2plusi* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write32to36(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2plusi* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 32, i1 false)
-; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], %struct.vec2plusi* [[P]], i64 0, i32 2
-; CHECK-NEXT: store i32 1, i32* [[C]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2plusi* %p to i8*
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 36, i1 false)
- %c = getelementptr inbounds %struct.vec2plusi, %struct.vec2plusi* %p, i64 0, i32 2
- store i32 1, i32* %c, align 4
- ret void
-}
-
-define void @write32to36_atomic(%struct.vec2plusi* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write32to36_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2plusi* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 32, i32 4)
-; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], %struct.vec2plusi* [[P]], i64 0, i32 2
-; CHECK-NEXT: store atomic i32 1, i32* [[C]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2plusi* %p to i8*
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 36, i32 4)
- %c = getelementptr inbounds %struct.vec2plusi, %struct.vec2plusi* %p, i64 0, i32 2
- store atomic i32 1, i32* %c unordered, align 4
- ret void
-}
-
-; Atomicity of the store is weaker than the memcpy
-define void @write32to36_atomic_weaker(%struct.vec2plusi* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write32to36_atomic_weaker(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2plusi* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 32, i32 4)
-; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2PLUSI:%.*]], %struct.vec2plusi* [[P]], i64 0, i32 2
-; CHECK-NEXT: store i32 1, i32* [[C]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2plusi* %p to i8*
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2plusi* @glob2 to i8*), i64 36, i32 4)
- %c = getelementptr inbounds %struct.vec2plusi, %struct.vec2plusi* %p, i64 0, i32 2
- store i32 1, i32* %c, align 4
- ret void
-}
-
-define void @write16to32(%struct.vec2* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write16to32(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 16, i1 false)
-; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], %struct.vec2* [[P]], i64 0, i32 1
-; CHECK-NEXT: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* [[C]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2* %p to i8*
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i1 false)
- %c = getelementptr inbounds %struct.vec2, %struct.vec2* %p, i64 0, i32 1
- store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %c, align 4
- ret void
-}
-
-define void @write16to32_atomic(%struct.vec2* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @write16to32_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 16, i32 4)
-; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], %struct.vec2* [[P]], i64 0, i32 1
-; CHECK-NEXT: store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* [[C]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2* %p to i8*
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i32 4)
- %c = getelementptr inbounds %struct.vec2, %struct.vec2* %p, i64 0, i32 1
- store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %c, align 4
- ret void
-}
-
-define void @dontwrite28to32memcpy(%struct.vec2* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @dontwrite28to32memcpy(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i1 false)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], %struct.vec2* [[P]], i64 0, i32 0, i64 7
-; CHECK-NEXT: store i32 1, i32* [[ARRAYIDX1]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2* %p to i8*
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i1 false)
- %arrayidx1 = getelementptr inbounds %struct.vec2, %struct.vec2* %p, i64 0, i32 0, i64 7
- store i32 1, i32* %arrayidx1, align 4
- ret void
-}
-
-define void @dontwrite28to32memcpy_atomic(%struct.vec2* nocapture %p) nounwind uwtable ssp {
-; CHECK-LABEL: @dontwrite28to32memcpy_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = bitcast %struct.vec2* [[P:%.*]] to i8*
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 [[TMP0]], i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i32 4)
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [[STRUCT_VEC2:%.*]], %struct.vec2* [[P]], i64 0, i32 0, i64 7
-; CHECK-NEXT: store atomic i32 1, i32* [[ARRAYIDX1]] unordered, align 4
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = bitcast %struct.vec2* %p to i8*
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 16 %0, i8* align 16 bitcast (%struct.vec2* @glob1 to i8*), i64 32, i32 4)
- %arrayidx1 = getelementptr inbounds %struct.vec2, %struct.vec2* %p, i64 0, i32 0, i64 7
- store atomic i32 1, i32* %arrayidx1 unordered, align 4
- ret void
-}
-
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
-declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
-declare void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* nocapture, i8, i64, i32) nounwind
-
-%struct.trapframe = type { i64, i64, i64 }
-
-; bugzilla 11455 - make sure negative GEP's don't break this optimisation
-define void @cpu_lwp_fork(%struct.trapframe* %md_regs, i64 %pcb_rsp0) nounwind uwtable noinline ssp {
-; CHECK-LABEL: @cpu_lwp_fork(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = inttoptr i64 [[PCB_RSP0:%.*]] to %struct.trapframe*
-; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds [[STRUCT_TRAPFRAME:%.*]], %struct.trapframe* [[TMP0]], i64 -1
-; CHECK-NEXT: [[TMP1:%.*]] = bitcast %struct.trapframe* [[ADD_PTR]] to i8*
-; CHECK-NEXT: [[TMP2:%.*]] = bitcast %struct.trapframe* [[MD_REGS:%.*]] to i8*
-; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[TMP1]], i8* [[TMP2]], i64 24, i1 false)
-; CHECK-NEXT: [[TF_TRAPNO:%.*]] = getelementptr inbounds [[STRUCT_TRAPFRAME]], %struct.trapframe* [[TMP0]], i64 -1, i32 1
-; CHECK-NEXT: store i64 3, i64* [[TF_TRAPNO]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %0 = inttoptr i64 %pcb_rsp0 to %struct.trapframe*
- %add.ptr = getelementptr inbounds %struct.trapframe, %struct.trapframe* %0, i64 -1
- %1 = bitcast %struct.trapframe* %add.ptr to i8*
- %2 = bitcast %struct.trapframe* %md_regs to i8*
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 24, i1 false)
- %tf_trapno = getelementptr inbounds %struct.trapframe, %struct.trapframe* %0, i64 -1, i32 1
- store i64 3, i64* %tf_trapno, align 8
- ret void
-}
-
-define void @write16To23AndThen24To31(i64* nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) {
-; CHECK-LABEL: @write16To23AndThen24To31(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* align 8 [[MYBASE0]], i8 0, i64 16, i1 false)
-; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 2
-; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 3
-; CHECK-NEXT: store i64 3, i64* [[BASE64_2]]
-; CHECK-NEXT: store i64 3, i64* [[BASE64_3]]
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i1 false)
-
- %base64_2 = getelementptr inbounds i64, i64* %P, i64 2
- %base64_3 = getelementptr inbounds i64, i64* %P, i64 3
-
- store i64 3, i64* %base64_2
- store i64 3, i64* %base64_3
- ret void
-}
-
-define void @write16To23AndThen24To31_atomic(i64* nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) {
-; CHECK-LABEL: @write16To23AndThen24To31_atomic(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[MYBASE0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 2
-; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 3
-; CHECK-NEXT: store atomic i64 3, i64* [[BASE64_2]] unordered, align 8
-; CHECK-NEXT: store atomic i64 3, i64* [[BASE64_3]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_2 = getelementptr inbounds i64, i64* %P, i64 2
- %base64_3 = getelementptr inbounds i64, i64* %P, i64 3
-
- store atomic i64 3, i64* %base64_2 unordered, align 8
- store atomic i64 3, i64* %base64_3 unordered, align 8
- ret void
-}
-
-define void @write16To23AndThen24To31_atomic_weaker1(i64* nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) {
-; CHECK-LABEL: @write16To23AndThen24To31_atomic_weaker1(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[MYBASE0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 2
-; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 3
-; CHECK-NEXT: store i64 3, i64* [[BASE64_2]], align 8
-; CHECK-NEXT: store atomic i64 3, i64* [[BASE64_3]] unordered, align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_2 = getelementptr inbounds i64, i64* %P, i64 2
- %base64_3 = getelementptr inbounds i64, i64* %P, i64 3
-
- store i64 3, i64* %base64_2, align 8
- store atomic i64 3, i64* %base64_3 unordered, align 8
- ret void
-}
-
-define void @write16To23AndThen24To31_atomic_weaker2(i64* nocapture %P, i64 %n64, i32 %n32, i16 %n16, i8 %n8) {
-; CHECK-LABEL: @write16To23AndThen24To31_atomic_weaker2(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BASE0:%.*]] = bitcast i64* [[P:%.*]] to i8*
-; CHECK-NEXT: [[MYBASE0:%.*]] = getelementptr inbounds i8, i8* [[BASE0]], i64 0
-; CHECK-NEXT: tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 [[MYBASE0]], i8 0, i64 16, i32 8)
-; CHECK-NEXT: [[BASE64_2:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 2
-; CHECK-NEXT: [[BASE64_3:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 3
-; CHECK-NEXT: store atomic i64 3, i64* [[BASE64_2]] unordered, align 8
-; CHECK-NEXT: store i64 3, i64* [[BASE64_3]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
-
- %base0 = bitcast i64* %P to i8*
- %mybase0 = getelementptr inbounds i8, i8* %base0, i64 0
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 8 %mybase0, i8 0, i64 32, i32 8)
-
- %base64_2 = getelementptr inbounds i64, i64* %P, i64 2
- %base64_3 = getelementptr inbounds i64, i64* %P, i64 3
-
- store atomic i64 3, i64* %base64_2 unordered, align 8
- store i64 3, i64* %base64_3, align 8
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore.ll
deleted file mode 100644
index bb6d024701ba..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore.ll
+++ /dev/null
@@ -1,87 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging=false -S | FileCheck %s
-target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
-
-; Ensure that the dead store is deleted in this case. It is wholely
-; overwritten by the second store.
-define void @test1(i32 *%V) {
- %V2 = bitcast i32* %V to i8* ; <i8*> [#uses=1]
- store i8 0, i8* %V2
- store i32 1234567, i32* %V
- ret void
-; CHECK-LABEL: @test1(
-; CHECK-NEXT: store i32 1234567
-}
-
-; Note that we could do better by merging the two stores into one.
-define void @test2(i32* %P) {
-; CHECK-LABEL: @test2(
- store i32 0, i32* %P
-; CHECK: store i32
- %Q = bitcast i32* %P to i16*
- store i16 1, i16* %Q
-; CHECK: store i16
- ret void
-}
-
-
-define i32 @test3(double %__x) {
-; CHECK-LABEL: @test3(
-; CHECK: store double
- %__u = alloca { [3 x i32] }
- %tmp.1 = bitcast { [3 x i32] }* %__u to double*
- store double %__x, double* %tmp.1
- %tmp.4 = getelementptr { [3 x i32] }, { [3 x i32] }* %__u, i32 0, i32 0, i32 1
- %tmp.5 = load i32, i32* %tmp.4
- %tmp.6 = icmp slt i32 %tmp.5, 0
- %tmp.7 = zext i1 %tmp.6 to i32
- ret i32 %tmp.7
-}
-
-; PR6043
-define void @test4(i8* %P) {
-; CHECK-LABEL: @test4(
-; CHECK-NEXT: bitcast
-; CHECK-NEXT: store double
-
- store i8 19, i8* %P ;; dead
- %A = getelementptr i8, i8* %P, i32 3
-
- store i8 42, i8* %A ;; dead
-
- %Q = bitcast i8* %P to double*
- store double 0.0, double* %Q
- ret void
-}
-
-; PR8657
-declare void @test5a(i32*)
-define void @test5(i32 %i) nounwind ssp {
- %A = alloca i32
- %B = bitcast i32* %A to i8*
- %C = getelementptr i8, i8* %B, i32 %i
- store i8 10, i8* %C ;; Dead store to variable index.
- store i32 20, i32* %A
-
- call void @test5a(i32* %A)
- ret void
-; CHECK-LABEL: @test5(
-; CHECK-NEXT: alloca
-; CHECK-NEXT: store i32 20
-; CHECK-NEXT: call void @test5a
-}
-
-declare void @test5a_as1(i32*)
-define void @test5_addrspacecast(i32 %i) nounwind ssp {
- %A = alloca i32
- %B = addrspacecast i32* %A to i8 addrspace(1)*
- %C = getelementptr i8, i8 addrspace(1)* %B, i32 %i
- store i8 10, i8 addrspace(1)* %C ;; Dead store to variable index.
- store i32 20, i32* %A
-
- call void @test5a(i32* %A)
- ret void
-; CHECK-LABEL: @test5_addrspacecast(
-; CHECK-NEXT: alloca
-; CHECK-NEXT: store i32 20
-; CHECK-NEXT: call void @test5a
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore2.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore2.ll
deleted file mode 100644
index 33d6b43634ce..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/PartialStore2.ll
+++ /dev/null
@@ -1,55 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s --data-layout "e" -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging=true -S | FileCheck %s
-; RUN: opt < %s --data-layout "E" -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging=true -S | FileCheck %s
-
-; This test used to hit an assertion (see PR41949).
-;
-; Better safe than sorry, do not assume anything about the padding for the
-; i28 store that has 32 bits as store size.
-define void @test1(i32* %p) {
-; CHECK-LABEL: @test1(
-; CHECK-NEXT: [[A:%.*]] = alloca i32
-; CHECK-NEXT: [[B:%.*]] = bitcast i32* [[A]] to i28*
-; CHECK-NEXT: [[C:%.*]] = bitcast i32* [[A]] to { i16, i16 }*
-; CHECK-NEXT: [[C1:%.*]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* [[C]], i32 0, i32 1
-; CHECK-NEXT: store i28 10, i28* [[B]]
-; CHECK-NEXT: store i16 20, i16* [[C1]]
-; CHECK-NEXT: call void @test1(i32* [[A]])
-; CHECK-NEXT: ret void
-;
- %a = alloca i32
- %b = bitcast i32* %a to i28*
- %c = bitcast i32* %a to { i16, i16 }*
- %c1 = getelementptr inbounds { i16, i16 }, { i16, i16 }* %c, i32 0, i32 1
- store i28 10, i28* %b
- store i16 20, i16* %c1
-
- call void @test1(i32* %a)
- ret void
-}
-
-
-; This test used to mis-compile (see PR41949).
-;
-; Better safe than sorry, do not assume anything about the padding for the
-; i12 store that has 16 bits as store size.
-define void @test2(i32* %p) {
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: [[U:%.*]] = alloca i32
-; CHECK-NEXT: [[A:%.*]] = bitcast i32* [[U]] to i32*
-; CHECK-NEXT: [[B:%.*]] = bitcast i32* [[U]] to i12*
-; CHECK-NEXT: store i32 -1, i32* [[A]]
-; CHECK-NEXT: store i12 20, i12* [[B]]
-; CHECK-NEXT: call void @test2(i32* [[U]])
-; CHECK-NEXT: ret void
-;
- %u = alloca i32
- %a = bitcast i32* %u to i32*
- %b = bitcast i32* %u to i12*
- store i32 -1, i32* %a
- store i12 20, i12* %b
-
- call void @test2(i32* %u)
- ret void
-}
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/X86/gather-null-pointer.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/X86/gather-null-pointer.ll
deleted file mode 100644
index ee56a6df6aab..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/X86/gather-null-pointer.ll
+++ /dev/null
@@ -1,21 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-; Both stores should be emitted because we can't tell if the gather aliases.
-
-define <4 x i32> @bar(<4 x i32> %arg, i32* %arg1) {
-; CHECK-LABEL: @bar(
-; CHECK-NEXT: bb:
-; CHECK-NEXT: store i32 5, i32* [[ARG1:%.*]]
-; CHECK-NEXT: [[TMP:%.*]] = tail call <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32> zeroinitializer, i8* null, <4 x i32> [[ARG:%.*]], <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i8 1)
-; CHECK-NEXT: store i32 10, i32* [[ARG1]]
-; CHECK-NEXT: ret <4 x i32> [[TMP]]
-;
-bb:
- store i32 5, i32* %arg1
- %tmp = tail call <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32> zeroinitializer, i8* null, <4 x i32> %arg, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, i8 1)
- store i32 10, i32* %arg1
- ret <4 x i32> %tmp
-}
-
-declare <4 x i32> @llvm.x86.avx2.gather.d.d(<4 x i32>, i8*, <4 x i32>, <4 x i32>, i8)
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/atomic.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/atomic.ll
deleted file mode 100644
index ec1917f82b81..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/atomic.ll
+++ /dev/null
@@ -1,132 +0,0 @@
-; RUN: opt -basic-aa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-apple-macosx10.7.0"
-
-; Sanity tests for atomic stores.
-; Note that it turns out essentially every transformation DSE does is legal on
-; atomic ops, just some transformations are not allowed across release-acquire pairs.
-
- at x = common global i32 0, align 4
- at y = common global i32 0, align 4
-
-declare void @randomop(i32*)
-
-; DSE across unordered store (allowed)
-define void @test1() {
-; CHECK-LABEL: test1
-; CHECK-NOT: store i32 0
-; CHECK: store i32 1
- store i32 0, i32* @x
- store atomic i32 0, i32* @y unordered, align 4
- store i32 1, i32* @x
- ret void
-}
-
-; DSE remove unordered store (allowed)
-define void @test4() {
-; CHECK-LABEL: test4
-; CHECK-NOT: store atomic
-; CHECK: store i32 1
- store atomic i32 0, i32* @x unordered, align 4
- store i32 1, i32* @x
- ret void
-}
-
-; DSE unordered store overwriting non-atomic store (allowed)
-define void @test5() {
-; CHECK-LABEL: test5
-; CHECK: store atomic i32 1
- store i32 0, i32* @x
- store atomic i32 1, i32* @x unordered, align 4
- ret void
-}
-
-; DSE no-op unordered atomic store (allowed)
-define void @test6() {
-; CHECK-LABEL: test6
-; CHECK-NOT: store
-; CHECK: ret void
- %x = load atomic i32, i32* @x unordered, align 4
- store atomic i32 %x, i32* @x unordered, align 4
- ret void
-}
-
-; DSE seq_cst store (be conservative; DSE doesn't have infrastructure
-; to reason about atomic operations).
-define void @test7() {
-; CHECK-LABEL: test7
-; CHECK: store atomic
- %a = alloca i32
- store atomic i32 0, i32* %a seq_cst, align 4
- ret void
-}
-
-; DSE and seq_cst load (be conservative; DSE doesn't have infrastructure
-; to reason about atomic operations).
-define i32 @test8() {
-; CHECK-LABEL: test8
-; CHECK: store
-; CHECK: load atomic
- %a = alloca i32
- call void @randomop(i32* %a)
- store i32 0, i32* %a, align 4
- %x = load atomic i32, i32* @x seq_cst, align 4
- ret i32 %x
-}
-
-; DSE across monotonic load (allowed as long as the eliminated store isUnordered)
-define i32 @test9() {
-; CHECK-LABEL: test9
-; CHECK-NOT: store i32 0
-; CHECK: store i32 1
- store i32 0, i32* @x
- %x = load atomic i32, i32* @y monotonic, align 4
- store i32 1, i32* @x
- ret i32 %x
-}
-
-; DSE across monotonic store (allowed as long as the eliminated store isUnordered)
-define void @test10() {
-; CHECK-LABEL: test10
-; CHECK-NOT: store i32 0
-; CHECK: store i32 1
- store i32 0, i32* @x
- store atomic i32 42, i32* @y monotonic, align 4
- store i32 1, i32* @x
- ret void
-}
-
-; DSE across monotonic load (forbidden since the eliminated store is atomic)
-define i32 @test11() {
-; CHECK-LABEL: test11
-; CHECK: store atomic i32 0
-; CHECK: store atomic i32 1
- store atomic i32 0, i32* @x monotonic, align 4
- %x = load atomic i32, i32* @y monotonic, align 4
- store atomic i32 1, i32* @x monotonic, align 4
- ret i32 %x
-}
-
-; DSE across monotonic store (forbidden since the eliminated store is atomic)
-define void @test12() {
-; CHECK-LABEL: test12
-; CHECK: store atomic i32 0
-; CHECK: store atomic i32 1
- store atomic i32 0, i32* @x monotonic, align 4
- store atomic i32 42, i32* @y monotonic, align 4
- store atomic i32 1, i32* @x monotonic, align 4
- ret void
-}
-
-; But DSE is not allowed across a release-acquire pair.
-define i32 @test15() {
-; CHECK-LABEL: test15
-; CHECK: store i32 0
-; CHECK: store i32 1
- store i32 0, i32* @x
- store atomic i32 0, i32* @y release, align 4
- %x = load atomic i32, i32* @y acquire, align 4
- store i32 1, i32* @x
- ret i32 %x
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/calloc-store.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/calloc-store.ll
deleted file mode 100644
index cfc73f45853d..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/calloc-store.ll
+++ /dev/null
@@ -1,65 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-declare noalias i8* @calloc(i64, i64)
-
-define i32* @test1() {
-; CHECK-LABEL: test1
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- %2 = bitcast i8* %1 to i32*
- ; This store is dead and should be removed
- store i32 0, i32* %2, align 4
-; CHECK-NOT: store i32 0, i32* %2, align 4
- ret i32* %2
-}
-
-define i32* @test2() {
-; CHECK-LABEL: test2
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- %2 = bitcast i8* %1 to i32*
- %3 = getelementptr i32, i32* %2, i32 5
- store i32 0, i32* %3, align 4
-; CHECK-NOT: store i32 0, i32* %2, align 4
- ret i32* %2
-}
-
-define i32* @test3(i32 *%arg) {
-; CHECK-LABEL: test3
- store i32 0, i32* %arg, align 4
-; CHECK: store i32 0, i32* %arg, align 4
- ret i32* %arg
-}
-
-declare void @clobber_memory(i8*)
-define i8* @test4() {
-; CHECK-LABEL: test4
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- call void @clobber_memory(i8* %1)
- store i8 0, i8* %1, align 4
-; CHECK: store i8 0, i8* %1, align 4
- ret i8* %1
-}
-
-define i32* @test5() {
-; CHECK-LABEL: test5
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- %2 = bitcast i8* %1 to i32*
- store volatile i32 0, i32* %2, align 4
-; CHECK: store volatile i32 0, i32* %2, align 4
- ret i32* %2
-}
-
-define i8* @test6() {
-; CHECK-LABEL: test6
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- store i8 5, i8* %1, align 4
-; CHECK: store i8 5, i8* %1, align 4
- ret i8* %1
-}
-
-define i8* @test7(i8 %arg) {
-; CHECK-LABEL: test7
- %1 = tail call noalias i8* @calloc(i64 1, i64 4)
- store i8 %arg, i8* %1, align 4
-; CHECK: store i8 %arg, i8* %1, align 4
- ret i8* %1
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/combined-partial-overwrites.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/combined-partial-overwrites.ll
deleted file mode 100644
index b0bbf7ef0186..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/combined-partial-overwrites.ll
+++ /dev/null
@@ -1,239 +0,0 @@
-; RUN: opt -S -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging=false < %s | FileCheck %s
-target datalayout = "E-m:e-i64:64-n32:64"
-target triple = "powerpc64le-unknown-linux"
-
-%"struct.std::complex" = type { { float, float } }
-
-define void @_Z4testSt7complexIfE(%"struct.std::complex"* noalias nocapture sret(%"struct.std::complex") %agg.result, i64 %c.coerce) {
-entry:
-; CHECK-LABEL: @_Z4testSt7complexIfE
-
- %ref.tmp = alloca i64, align 8
- %tmpcast = bitcast i64* %ref.tmp to %"struct.std::complex"*
- %c.sroa.0.0.extract.shift = lshr i64 %c.coerce, 32
- %c.sroa.0.0.extract.trunc = trunc i64 %c.sroa.0.0.extract.shift to i32
- %0 = bitcast i32 %c.sroa.0.0.extract.trunc to float
- %c.sroa.2.0.extract.trunc = trunc i64 %c.coerce to i32
- %1 = bitcast i32 %c.sroa.2.0.extract.trunc to float
- call void @_Z3barSt7complexIfE(%"struct.std::complex"* nonnull sret(%"struct.std::complex") %tmpcast, i64 %c.coerce)
- %2 = bitcast %"struct.std::complex"* %agg.result to i64*
- %3 = load i64, i64* %ref.tmp, align 8
- store i64 %3, i64* %2, align 4
-; CHECK-NOT: store i64
-
- %_M_value.realp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 0
- %4 = lshr i64 %3, 32
- %5 = trunc i64 %4 to i32
- %6 = bitcast i32 %5 to float
- %_M_value.imagp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 1
- %7 = trunc i64 %3 to i32
- %8 = bitcast i32 %7 to float
- %mul_ad.i.i = fmul fast float %6, %1
- %mul_bc.i.i = fmul fast float %8, %0
- %mul_i.i.i = fadd fast float %mul_ad.i.i, %mul_bc.i.i
- %mul_ac.i.i = fmul fast float %6, %0
- %mul_bd.i.i = fmul fast float %8, %1
- %mul_r.i.i = fsub fast float %mul_ac.i.i, %mul_bd.i.i
- store float %mul_r.i.i, float* %_M_value.realp.i.i, align 4
- store float %mul_i.i.i, float* %_M_value.imagp.i.i, align 4
- ret void
-; CHECK: ret void
-}
-
-declare void @_Z3barSt7complexIfE(%"struct.std::complex"* sret(%"struct.std::complex"), i64)
-
-define void @test1(i32 *%ptr) {
-entry:
-; CHECK-LABEL: @test1
-
- store i32 5, i32* %ptr
- %bptr = bitcast i32* %ptr to i8*
- store i8 7, i8* %bptr
- %wptr = bitcast i32* %ptr to i16*
- store i16 -30062, i16* %wptr
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- store i8 25, i8* %bptr2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- store i8 47, i8* %bptr3
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %wptrp = bitcast i8* %bptr1 to i16*
- store i16 2020, i16* %wptrp, align 1
- ret void
-
-; CHECK-NOT: store i32 5, i32* %ptr
-; CHECK-NOT: store i8 7, i8* %bptr
-; CHECK: store i16 -30062, i16* %wptr
-; CHECK-NOT: store i8 25, i8* %bptr2
-; CHECK: store i8 47, i8* %bptr3
-; CHECK: store i16 2020, i16* %wptrp, align 1
-
-; CHECK: ret void
-}
-
-define void @test2(i32 *%ptr) {
-entry:
-; CHECK-LABEL: @test2
-
- store i32 5, i32* %ptr
-
- %bptr = bitcast i32* %ptr to i8*
- %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
-
- %wptr = bitcast i8* %bptr to i16*
- %wptrm1 = bitcast i8* %bptrm1 to i16*
- %wptr1 = bitcast i8* %bptr1 to i16*
- %wptr2 = bitcast i8* %bptr2 to i16*
- %wptr3 = bitcast i8* %bptr3 to i16*
-
- store i16 1456, i16* %wptrm1, align 1
- store i16 1346, i16* %wptr, align 1
- store i16 1756, i16* %wptr1, align 1
- store i16 1126, i16* %wptr2, align 1
- store i16 5656, i16* %wptr3, align 1
-
-; CHECK-NOT: store i32 5, i32* %ptr
-
-; CHECK: store i16 1456, i16* %wptrm1, align 1
-; CHECK: store i16 1346, i16* %wptr, align 1
-; CHECK: store i16 1756, i16* %wptr1, align 1
-; CHECK: store i16 1126, i16* %wptr2, align 1
-; CHECK: store i16 5656, i16* %wptr3, align 1
-
- ret void
-
-; CHECK: ret void
-}
-
-define signext i8 @test3(i32 *%ptr) {
-entry:
-; CHECK-LABEL: @test3
-
- store i32 5, i32* %ptr
-
- %bptr = bitcast i32* %ptr to i8*
- %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
-
- %wptr = bitcast i8* %bptr to i16*
- %wptrm1 = bitcast i8* %bptrm1 to i16*
- %wptr1 = bitcast i8* %bptr1 to i16*
- %wptr2 = bitcast i8* %bptr2 to i16*
- %wptr3 = bitcast i8* %bptr3 to i16*
-
- %v = load i8, i8* %bptr, align 1
- store i16 1456, i16* %wptrm1, align 1
- store i16 1346, i16* %wptr, align 1
- store i16 1756, i16* %wptr1, align 1
- store i16 1126, i16* %wptr2, align 1
- store i16 5656, i16* %wptr3, align 1
-
-; CHECK: store i32 5, i32* %ptr
-
- ret i8 %v
-
-; CHECK: ret i8 %v
-}
-
-%struct.foostruct = type {
-i32 (i8*, i8**, i32, i8, i8*)*,
-i32 (i8*, i8**, i32, i8, i8*)*,
-i32 (i8*, i8**, i32, i8, i8*)*,
-i32 (i8*, i8**, i32, i8, i8*)*,
-void (i8*, i32, i32)*
-}
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1)
-declare void @goFunc(%struct.foostruct*)
-declare i32 @fa(i8*, i8**, i32, i8, i8*)
-
-define void @test4() {
-entry:
-; CHECK-LABEL: @test4
-
- %bang = alloca %struct.foostruct, align 8
- %v1 = bitcast %struct.foostruct* %bang to i8*
- call void @llvm.memset.p0i8.i64(i8* align 8 %v1, i8 0, i64 40, i1 false)
- %v2 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 0
- store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v2, align 8
- %v3 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 1
- store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v3, align 8
- %v4 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 2
- store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v4, align 8
- %v5 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 3
- store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v5, align 8
- %v6 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 4
- store void (i8*, i32, i32)* null, void (i8*, i32, i32)** %v6, align 8
- call void @goFunc(%struct.foostruct* %bang)
- ret void
-
-; CHECK-NOT: memset
-; CHECK: ret void
-}
-
-define signext i8 @test5(i32 *%ptr) {
-entry:
-; CHECK-LABEL: @test5
-
- store i32 0, i32* %ptr
-
- %bptr = bitcast i32* %ptr to i8*
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
-
- %wptr = bitcast i8* %bptr to i16*
- %wptr1 = bitcast i8* %bptr1 to i16*
- %wptr2 = bitcast i8* %bptr2 to i16*
-
- store i16 65535, i16* %wptr2, align 1
- store i16 1456, i16* %wptr1, align 1
- store i16 1346, i16* %wptr, align 1
-
-; CHECK-NOT: store i32 0, i32* %ptr
-
- ret i8 0
-}
-
-define signext i8 @test6(i32 *%ptr) {
-entry:
-; CHECK-LABEL: @test6
-
- store i32 0, i32* %ptr
-
- %bptr = bitcast i32* %ptr to i16*
- %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
- %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
-
- store i16 1456, i16* %bptr2, align 1
- store i16 65535, i16* %bptr1, align 1
-
-; CHECK-NOT: store i32 0, i32* %ptr
-
- ret i8 0
-}
-
-define signext i8 @test7(i64 *%ptr) {
-entry:
-; CHECK-LABEL: @test7
-
- store i64 0, i64* %ptr
-
- %bptr = bitcast i64* %ptr to i16*
- %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0
- %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1
- %bptr3 = getelementptr inbounds i16, i16* %bptr, i64 2
- %bptr4 = getelementptr inbounds i16, i16* %bptr, i64 3
-
- store i16 1346, i16* %bptr1, align 1
- store i16 1756, i16* %bptr3, align 1
- store i16 1456, i16* %bptr2, align 1
- store i16 5656, i16* %bptr4, align 1
-
-; CHECK-NOT: store i64 0, i64* %ptr
-
- ret i8 0
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/const-pointers.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/const-pointers.ll
deleted file mode 100644
index 16be53c7a23b..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/const-pointers.ll
+++ /dev/null
@@ -1,40 +0,0 @@
-; RUN: opt -basic-aa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-
-%t = type { i32 }
-
- at g = global i32 42
-
-define void @test1(%t* noalias %pp) {
- %p = getelementptr inbounds %t, %t* %pp, i32 0, i32 0
-
- store i32 1, i32* %p; <-- This is dead
- %x = load i32, i32* inttoptr (i32 12345 to i32*)
- store i32 %x, i32* %p
- ret void
-; CHECK-LABEL: define void @test1(
-; CHECK: store
-; CHECK-NOT: store
-; CHECK: ret void
-}
-
-define void @test3() {
- store i32 1, i32* @g; <-- This is dead.
- store i32 42, i32* @g
- ret void
-; CHECK-LABEL: define void @test3(
-; CHECK: store
-; CHECK-NOT: store
-; CHECK: ret void
-}
-
-define void @test4(i32* %p) {
- store i32 1, i32* %p
- %x = load i32, i32* @g; <-- %p and @g could alias
- store i32 %x, i32* %p
- ret void
-; CHECK-LABEL: define void @test4(
-; CHECK: store
-; CHECK: store
-; CHECK: ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/crash.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/crash.ll
deleted file mode 100644
index d211ff97dac7..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/crash.ll
+++ /dev/null
@@ -1,74 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S
-
-target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
-target triple = "i386-apple-darwin10.0"
-
- at g80 = external global i8 ; <i8*> [#uses=3]
-
-declare signext i8 @foo(i8 signext, i8 signext) nounwind readnone ssp
-
-declare i32 @func68(i32) nounwind readonly ssp
-
-; PR4815
-define void @test1(i32 %int32p54) noreturn nounwind ssp {
-entry:
- br label %bb
-
-bb: ; preds = %bb, %entry
- %storemerge = phi i8 [ %2, %bb ], [ 1, %entry ] ; <i8> [#uses=1]
- store i8 %storemerge, i8* @g80
- %0 = tail call i32 @func68(i32 1) nounwind ssp ; <i32> [#uses=1]
- %1 = trunc i32 %0 to i8 ; <i8> [#uses=1]
- store i8 %1, i8* @g80, align 1
- store i8 undef, i8* @g80, align 1
- %2 = tail call signext i8 @foo(i8 signext undef, i8 signext 1) nounwind ; <i8> [#uses=1]
- br label %bb
-}
-
-define fastcc i32 @test2() nounwind ssp {
-bb14: ; preds = %bb4
- %0 = bitcast i8* undef to i8** ; <i8**> [#uses=1]
- %1 = getelementptr inbounds i8*, i8** %0, i64 undef ; <i8**> [#uses=1]
- %2 = bitcast i8** %1 to i16* ; <i16*> [#uses=2]
- %3 = getelementptr inbounds i16, i16* %2, i64 undef ; <i16*> [#uses=1]
- %4 = bitcast i16* %3 to i8* ; <i8*> [#uses=1]
- %5 = getelementptr inbounds i8, i8* %4, i64 undef ; <i8*> [#uses=1]
- %6 = getelementptr inbounds i16, i16* %2, i64 undef ; <i16*> [#uses=1]
- store i16 undef, i16* %6, align 2
- %7 = getelementptr inbounds i8, i8* %5, i64 undef ; <i8*> [#uses=1]
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %7, i8* undef, i64 undef, i1 false)
- unreachable
-}
-
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
-
-
-; rdar://7635088
-define i32 @test3() {
-entry:
- ret i32 0
-
-dead:
- %P2 = getelementptr i32, i32 *%P2, i32 52
- %Q2 = getelementptr i32, i32 *%Q2, i32 52
- store i32 4, i32* %P2
- store i32 4, i32* %Q2
- br label %dead
-}
-
-
-; PR3141
-%struct.ada__tags__dispatch_table = type { [1 x i32] }
-%struct.f393a00_1__object = type { %struct.ada__tags__dispatch_table*, i8 }
-%struct.f393a00_2__windmill = type { %struct.f393a00_1__object, i16 }
-
-define void @test4(%struct.f393a00_2__windmill* %a, %struct.f393a00_2__windmill* %b) {
-entry:
- %t = alloca %struct.f393a00_2__windmill ; <%struct.f393a00_2__windmill*> [#uses=1]
- %0 = getelementptr %struct.f393a00_2__windmill, %struct.f393a00_2__windmill* %t, i32 0, i32 0, i32 0 ; <%struct.ada__tags__dispatch_table**> [#uses=1]
- %1 = load %struct.ada__tags__dispatch_table*, %struct.ada__tags__dispatch_table** null, align 4 ; <%struct.ada__tags__dispatch_table*> [#uses=1]
- %2 = load %struct.ada__tags__dispatch_table*, %struct.ada__tags__dispatch_table** %0, align 8 ; <%struct.ada__tags__dispatch_table*> [#uses=1]
- store %struct.ada__tags__dispatch_table* %2, %struct.ada__tags__dispatch_table** null, align 4
- store %struct.ada__tags__dispatch_table* %1, %struct.ada__tags__dispatch_table** null, align 4
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/cs-cs-aliasing.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/cs-cs-aliasing.ll
deleted file mode 100644
index 9df0bad79929..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/cs-cs-aliasing.ll
+++ /dev/null
@@ -1,74 +0,0 @@
-; RUN: opt -basic-aa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-%class.basic_string = type { %"class.__gnu_cxx::__versa_string" }
-%"class.__gnu_cxx::__versa_string" = type { %"class.__gnu_cxx::__sso_string_base" }
-%"class.__gnu_cxx::__sso_string_base" = type { %"struct.__gnu_cxx::__vstring_utility<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider", i64, %union.anon }
-%"struct.__gnu_cxx::__vstring_utility<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider" = type { i8* }
-%union.anon = type { i64, [8 x i8] }
-
-; Function Attrs: nounwind
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) #0
-
-; Function Attrs: noinline nounwind readonly uwtable
-declare zeroext i1 @callee_takes_string(%class.basic_string* nonnull) #1 align 2
-
-; Function Attrs: nounwind uwtable
-define weak_odr zeroext i1 @test() #2 align 2 {
-
-; CHECK-LABEL: @test
-
-bb:
- %tmp = alloca %class.basic_string, align 8
- %tmp1 = alloca %class.basic_string, align 8
- %tmp3 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp, i64 0, i32 0, i32 0, i32 2
- %tmp4 = bitcast %union.anon* %tmp3 to i8*
- %tmp5 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp, i64 0, i32 0, i32 0, i32 0, i32 0
- %tmp6 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp, i64 0, i32 0, i32 0, i32 1
- %tmp7 = getelementptr inbounds i8, i8* %tmp4, i64 1
- %tmp8 = bitcast %class.basic_string* %tmp to i8*
- %tmp9 = bitcast i64 0 to i64
- %tmp10 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp1, i64 0, i32 0, i32 0, i32 2
- %tmp11 = bitcast %union.anon* %tmp10 to i8*
- %tmp12 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp1, i64 0, i32 0, i32 0, i32 0, i32 0
- %tmp13 = getelementptr inbounds %class.basic_string, %class.basic_string* %tmp1, i64 0, i32 0, i32 0, i32 1
- %tmp14 = getelementptr inbounds i8, i8* %tmp11, i64 1
- %tmp15 = bitcast %class.basic_string* %tmp1 to i8*
- br label %_ZN12basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS2_.exit
-
-_ZN12basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS2_.exit: ; preds = %bb
- store i8* %tmp4, i8** %tmp5, align 8
- store i8 62, i8* %tmp4, align 8
- store i64 1, i64* %tmp6, align 8
- store i8 0, i8* %tmp7, align 1
- %tmp16 = call zeroext i1 @callee_takes_string(%class.basic_string* nonnull %tmp)
- br label %_ZN9__gnu_cxx17__sso_string_baseIcSt11char_traitsIcESaIcEED2Ev.exit3
-
-_ZN9__gnu_cxx17__sso_string_baseIcSt11char_traitsIcESaIcEED2Ev.exit3: ; preds = %_ZN12basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS2_.exit
-
-; CHECK: _ZN9__gnu_cxx17__sso_string_baseIcSt11char_traitsIcESaIcEED2Ev.exit3:
-
-; The following can be read through the call %tmp17:
- store i8* %tmp11, i8** %tmp12, align 8
- store i8 125, i8* %tmp11, align 8
- store i64 1, i64* %tmp13, align 8
- store i8 0, i8* %tmp14, align 1
-
-; CHECK: store i8* %tmp11, i8** %tmp12, align 8
-; CHECK: store i8 125, i8* %tmp11, align 8
-; CHECK: store i64 1, i64* %tmp13, align 8
-; CHECK: store i8 0, i8* %tmp14, align 1
-
- %tmp17 = call zeroext i1 @callee_takes_string(%class.basic_string* nonnull %tmp1)
- call void @llvm.memset.p0i8.i64(i8* align 8 %tmp11, i8 -51, i64 16, i1 false) #0
- call void @llvm.memset.p0i8.i64(i8* align 8 %tmp15, i8 -51, i64 32, i1 false) #0
- call void @llvm.memset.p0i8.i64(i8* align 8 %tmp4, i8 -51, i64 16, i1 false) #0
- call void @llvm.memset.p0i8.i64(i8* align 8 %tmp8, i8 -51, i64 32, i1 false) #0
- ret i1 %tmp17
-}
-
-attributes #0 = { nounwind }
-attributes #1 = { noinline nounwind readonly uwtable }
-attributes #2 = { nounwind uwtable }
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/debuginfo.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/debuginfo.ll
deleted file mode 100644
index fbca29decdec..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/debuginfo.ll
+++ /dev/null
@@ -1,31 +0,0 @@
-; RUN: opt < %s -debugify -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
-
-declare noalias i8* @malloc(i32)
-
-declare void @test_f()
-
-define i32* @test_salvage(i32 %arg) {
-; Check that all four original local variables have their values preserved.
-; CHECK-LABEL: @test_salvage(
-; CHECK-NEXT: malloc
-; CHECK-NEXT: @llvm.dbg.value(metadata i8* %p, metadata ![[p:.*]], metadata !DIExpression())
-; CHECK-NEXT: bitcast
-; CHECK-NEXT: @llvm.dbg.value(metadata i32* %P, metadata ![[P:.*]], metadata !DIExpression())
-; CHECK-NEXT: @llvm.dbg.value(metadata i32 %arg, metadata ![[DEAD:.*]], metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value))
-; CHECK-NEXT: call void @test_f()
-; CHECK-NEXT: store i32 0, i32* %P
-
- %p = tail call i8* @malloc(i32 4)
- %P = bitcast i8* %p to i32*
- %DEAD = add i32 %arg, 1
- store i32 %DEAD, i32* %P
- call void @test_f()
- store i32 0, i32* %P
- ret i32* %P
-}
-
-; CHECK: ![[p]] = !DILocalVariable(name: "1"
-; CHECK: ![[P]] = !DILocalVariable(name: "2"
-; CHECK: ![[DEAD]] = !DILocalVariable(name: "3"
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/dominate.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/dominate.ll
deleted file mode 100644
index 63f1a3ffc8ff..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/dominate.ll
+++ /dev/null
@@ -1,25 +0,0 @@
-; RUN: opt -dse -enable-dse-memoryssa=false -disable-output < %s
-; test that we don't crash
-declare void @bar()
-
-define void @foo() {
-bb1:
- %memtmp3.i = alloca [21 x i8], align 1
- %0 = getelementptr inbounds [21 x i8], [21 x i8]* %memtmp3.i, i64 0, i64 0
- br label %bb3
-
-bb2:
- call void @llvm.lifetime.end.p0i8(i64 -1, i8* %0)
- br label %bb3
-
-bb3:
- call void @bar()
- call void @llvm.lifetime.end.p0i8(i64 -1, i8* %0)
- br label %bb4
-
-bb4:
- ret void
-
-}
-
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/fence.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/fence.ll
deleted file mode 100644
index 55b6b8a6d5ab..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/fence.ll
+++ /dev/null
@@ -1,96 +0,0 @@
-; RUN: opt -S -basic-aa -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-
-; We conservative choose to prevent dead store elimination
-; across release or stronger fences. It's not required
-; (since the must still be a race on %addd.i), but
-; it is conservatively correct. A legal optimization
-; could hoist the second store above the fence, and then
-; DSE one of them.
-define void @test1(i32* %addr.i) {
-; CHECK-LABEL: @test1
-; CHECK: store i32 5
-; CHECK: fence
-; CHECK: store i32 5
-; CHECK: ret
- store i32 5, i32* %addr.i, align 4
- fence release
- store i32 5, i32* %addr.i, align 4
- ret void
-}
-
-; Same as previous, but with
diff erent values. If we ever optimize
-; this more aggressively, this allows us to check that the correct
-; store is retained (the 'i32 1' store in this case)
-define void @test1b(i32* %addr.i) {
-; CHECK-LABEL: @test1b
-; CHECK: store i32 42
-; CHECK: fence release
-; CHECK: store i32 1
-; CHECK: ret
- store i32 42, i32* %addr.i, align 4
- fence release
- store i32 1, i32* %addr.i, align 4
- ret void
-}
-
-; We *could* DSE across this fence, but don't. No other thread can
-; observe the order of the acquire fence and the store.
-define void @test2(i32* %addr.i) {
-; CHECK-LABEL: @test2
-; CHECK: store
-; CHECK: fence
-; CHECK: store
-; CHECK: ret
- store i32 5, i32* %addr.i, align 4
- fence acquire
- store i32 5, i32* %addr.i, align 4
- ret void
-}
-
-; We DSE stack alloc'ed and byval locations, in the presence of fences.
-; Fence does not make an otherwise thread local store visible.
-; Right now the DSE in presence of fence is only done in end blocks (with no successors),
-; but the same logic applies to other basic blocks as well.
-; The store to %addr.i can be removed since it is a byval attribute
-define void @test3(i32* byval(i32) %addr.i) {
-; CHECK-LABEL: @test3
-; CHECK-NOT: store
-; CHECK: fence
-; CHECK: ret
- store i32 5, i32* %addr.i, align 4
- fence release
- ret void
-}
-
-declare void @foo(i8* nocapture %p)
-
-declare noalias i8* @malloc(i32)
-
-; DSE of stores in locations allocated through library calls.
-define void @test_nocapture() {
-; CHECK-LABEL: @test_nocapture
-; CHECK: malloc
-; CHECK: foo
-; CHECK-NOT: store
-; CHECK: fence
- %m = call i8* @malloc(i32 24)
- call void @foo(i8* %m)
- store i8 4, i8* %m
- fence release
- ret void
-}
-
-
-; This is a full fence, but it does not make a thread local store visible.
-; We can DSE the store in presence of the fence.
-define void @fence_seq_cst() {
-; CHECK-LABEL: @fence_seq_cst
-; CHECK-NEXT: fence seq_cst
-; CHECK-NEXT: ret void
- %P1 = alloca i32
- store i32 0, i32* %P1, align 4
- fence seq_cst
- store i32 4, i32* %P1, align 4
- ret void
-}
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/free.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/free.ll
deleted file mode 100644
index 275b7e372f11..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/free.ll
+++ /dev/null
@@ -1,70 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-target datalayout = "e-p:64:64:64"
-
-declare void @free(i8* nocapture)
-declare noalias i8* @malloc(i64)
-
-; CHECK-LABEL: @test(
-; CHECK-NEXT: bitcast
-; CHECK-NEXT: @free
-; CHECK-NEXT: ret void
-define void @test(i32* %Q, i32* %P) {
- %DEAD = load i32, i32* %Q ; <i32> [#uses=1]
- store i32 %DEAD, i32* %P
- %1 = bitcast i32* %P to i8*
- tail call void @free(i8* %1) nounwind
- ret void
-}
-
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: bitcast
-; CHECK-NEXT: @free
-; CHECK-NEXT: ret void
-define void @test2({i32, i32}* %P) {
- %Q = getelementptr {i32, i32}, {i32, i32} *%P, i32 0, i32 1
- store i32 4, i32* %Q
- %1 = bitcast {i32, i32}* %P to i8*
- tail call void @free(i8* %1) nounwind
- ret void
-}
-
-; CHECK-LABEL: @test3(
-; CHECK-NOT: store
-; CHECK: ret void
-define void @test3() {
- %m = call i8* @malloc(i64 24)
- store i8 0, i8* %m
- %m1 = getelementptr i8, i8* %m, i64 1
- store i8 1, i8* %m1
- call void @free(i8* %m) nounwind
- ret void
-}
-
-; PR11240
-; CHECK-LABEL: @test4(
-; CHECK-NOT: store
-; CHECK: ret void
-define void @test4(i1 %x) nounwind {
-entry:
- %alloc1 = tail call noalias i8* @malloc(i64 4) nounwind
- br i1 %x, label %skipinit1, label %init1
-
-init1:
- store i8 1, i8* %alloc1
- br label %skipinit1
-
-skipinit1:
- tail call void @free(i8* %alloc1) nounwind
- ret void
-}
-
-; CHECK-LABEL: @test5(
-define void @test5() {
- br label %bb
-
-bb:
- tail call void @free(i8* undef) nounwind
- br label %bb
-}
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/inst-limits.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/inst-limits.ll
deleted file mode 100644
index 6e5f4c150459..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/inst-limits.ll
+++ /dev/null
@@ -1,261 +0,0 @@
-; RUN: opt -S -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-
-; If there are two stores to the same location, DSE should be able to remove
-; the first store if the two stores are separated by no more than 98
-; instructions. The existence of debug intrinsics between the stores should
-; not affect this instruction limit.
-
- at x = global i32 0, align 4
-
-; Function Attrs: nounwind
-define i32 @test_within_limit() !dbg !4 {
-entry:
- ; The first store; later there is a second store to the same location,
- ; so this store should be optimized away by DSE.
- ; CHECK-NOT: store i32 1, i32* @x, align 4
- store i32 1, i32* @x, align 4
-
- ; Insert 98 dummy instructions between the two stores
- %0 = bitcast i32 0 to i32
- %1 = bitcast i32 0 to i32
- %2 = bitcast i32 0 to i32
- %3 = bitcast i32 0 to i32
- %4 = bitcast i32 0 to i32
- %5 = bitcast i32 0 to i32
- %6 = bitcast i32 0 to i32
- %7 = bitcast i32 0 to i32
- %8 = bitcast i32 0 to i32
- %9 = bitcast i32 0 to i32
- %10 = bitcast i32 0 to i32
- %11 = bitcast i32 0 to i32
- %12 = bitcast i32 0 to i32
- %13 = bitcast i32 0 to i32
- %14 = bitcast i32 0 to i32
- %15 = bitcast i32 0 to i32
- %16 = bitcast i32 0 to i32
- %17 = bitcast i32 0 to i32
- %18 = bitcast i32 0 to i32
- %19 = bitcast i32 0 to i32
- %20 = bitcast i32 0 to i32
- %21 = bitcast i32 0 to i32
- %22 = bitcast i32 0 to i32
- %23 = bitcast i32 0 to i32
- %24 = bitcast i32 0 to i32
- %25 = bitcast i32 0 to i32
- %26 = bitcast i32 0 to i32
- %27 = bitcast i32 0 to i32
- %28 = bitcast i32 0 to i32
- %29 = bitcast i32 0 to i32
- %30 = bitcast i32 0 to i32
- %31 = bitcast i32 0 to i32
- %32 = bitcast i32 0 to i32
- %33 = bitcast i32 0 to i32
- %34 = bitcast i32 0 to i32
- %35 = bitcast i32 0 to i32
- %36 = bitcast i32 0 to i32
- %37 = bitcast i32 0 to i32
- %38 = bitcast i32 0 to i32
- %39 = bitcast i32 0 to i32
- %40 = bitcast i32 0 to i32
- %41 = bitcast i32 0 to i32
- %42 = bitcast i32 0 to i32
- %43 = bitcast i32 0 to i32
- %44 = bitcast i32 0 to i32
- %45 = bitcast i32 0 to i32
- %46 = bitcast i32 0 to i32
- %47 = bitcast i32 0 to i32
- %48 = bitcast i32 0 to i32
- %49 = bitcast i32 0 to i32
- %50 = bitcast i32 0 to i32
- %51 = bitcast i32 0 to i32
- %52 = bitcast i32 0 to i32
- %53 = bitcast i32 0 to i32
- %54 = bitcast i32 0 to i32
- %55 = bitcast i32 0 to i32
- %56 = bitcast i32 0 to i32
- %57 = bitcast i32 0 to i32
- %58 = bitcast i32 0 to i32
- %59 = bitcast i32 0 to i32
- %60 = bitcast i32 0 to i32
- %61 = bitcast i32 0 to i32
- %62 = bitcast i32 0 to i32
- %63 = bitcast i32 0 to i32
- %64 = bitcast i32 0 to i32
- %65 = bitcast i32 0 to i32
- %66 = bitcast i32 0 to i32
- %67 = bitcast i32 0 to i32
- %68 = bitcast i32 0 to i32
- %69 = bitcast i32 0 to i32
- %70 = bitcast i32 0 to i32
- %71 = bitcast i32 0 to i32
- %72 = bitcast i32 0 to i32
- %73 = bitcast i32 0 to i32
- %74 = bitcast i32 0 to i32
- %75 = bitcast i32 0 to i32
- %76 = bitcast i32 0 to i32
- %77 = bitcast i32 0 to i32
- %78 = bitcast i32 0 to i32
- %79 = bitcast i32 0 to i32
- %80 = bitcast i32 0 to i32
- %81 = bitcast i32 0 to i32
- %82 = bitcast i32 0 to i32
- %83 = bitcast i32 0 to i32
- %84 = bitcast i32 0 to i32
- %85 = bitcast i32 0 to i32
- %86 = bitcast i32 0 to i32
- %87 = bitcast i32 0 to i32
- %88 = bitcast i32 0 to i32
- %89 = bitcast i32 0 to i32
- %90 = bitcast i32 0 to i32
- %91 = bitcast i32 0 to i32
- %92 = bitcast i32 0 to i32
- %93 = bitcast i32 0 to i32
- %94 = bitcast i32 0 to i32
- %95 = bitcast i32 0 to i32
- %96 = bitcast i32 0 to i32
- %97 = bitcast i32 0 to i32
-
- ; Insert a meaningless dbg.value intrinsic; it should have no
- ; effect on the working of DSE in any way.
- call void @llvm.dbg.value(metadata i32 undef, metadata !10, metadata !DIExpression()), !dbg !DILocation(scope: !4)
-
- ; CHECK: store i32 -1, i32* @x, align 4
- store i32 -1, i32* @x, align 4
- ret i32 0
-}
-
-; Function Attrs: nounwind
-define i32 @test_outside_limit() {
-entry:
- ; The first store; later there is a second store to the same location
- ; CHECK: store i32 1, i32* @x, align 4
- store i32 1, i32* @x, align 4
-
- ; Insert 99 dummy instructions between the two stores; this is
- ; one too many instruction for the DSE to take place.
- %0 = bitcast i32 0 to i32
- %1 = bitcast i32 0 to i32
- %2 = bitcast i32 0 to i32
- %3 = bitcast i32 0 to i32
- %4 = bitcast i32 0 to i32
- %5 = bitcast i32 0 to i32
- %6 = bitcast i32 0 to i32
- %7 = bitcast i32 0 to i32
- %8 = bitcast i32 0 to i32
- %9 = bitcast i32 0 to i32
- %10 = bitcast i32 0 to i32
- %11 = bitcast i32 0 to i32
- %12 = bitcast i32 0 to i32
- %13 = bitcast i32 0 to i32
- %14 = bitcast i32 0 to i32
- %15 = bitcast i32 0 to i32
- %16 = bitcast i32 0 to i32
- %17 = bitcast i32 0 to i32
- %18 = bitcast i32 0 to i32
- %19 = bitcast i32 0 to i32
- %20 = bitcast i32 0 to i32
- %21 = bitcast i32 0 to i32
- %22 = bitcast i32 0 to i32
- %23 = bitcast i32 0 to i32
- %24 = bitcast i32 0 to i32
- %25 = bitcast i32 0 to i32
- %26 = bitcast i32 0 to i32
- %27 = bitcast i32 0 to i32
- %28 = bitcast i32 0 to i32
- %29 = bitcast i32 0 to i32
- %30 = bitcast i32 0 to i32
- %31 = bitcast i32 0 to i32
- %32 = bitcast i32 0 to i32
- %33 = bitcast i32 0 to i32
- %34 = bitcast i32 0 to i32
- %35 = bitcast i32 0 to i32
- %36 = bitcast i32 0 to i32
- %37 = bitcast i32 0 to i32
- %38 = bitcast i32 0 to i32
- %39 = bitcast i32 0 to i32
- %40 = bitcast i32 0 to i32
- %41 = bitcast i32 0 to i32
- %42 = bitcast i32 0 to i32
- %43 = bitcast i32 0 to i32
- %44 = bitcast i32 0 to i32
- %45 = bitcast i32 0 to i32
- %46 = bitcast i32 0 to i32
- %47 = bitcast i32 0 to i32
- %48 = bitcast i32 0 to i32
- %49 = bitcast i32 0 to i32
- %50 = bitcast i32 0 to i32
- %51 = bitcast i32 0 to i32
- %52 = bitcast i32 0 to i32
- %53 = bitcast i32 0 to i32
- %54 = bitcast i32 0 to i32
- %55 = bitcast i32 0 to i32
- %56 = bitcast i32 0 to i32
- %57 = bitcast i32 0 to i32
- %58 = bitcast i32 0 to i32
- %59 = bitcast i32 0 to i32
- %60 = bitcast i32 0 to i32
- %61 = bitcast i32 0 to i32
- %62 = bitcast i32 0 to i32
- %63 = bitcast i32 0 to i32
- %64 = bitcast i32 0 to i32
- %65 = bitcast i32 0 to i32
- %66 = bitcast i32 0 to i32
- %67 = bitcast i32 0 to i32
- %68 = bitcast i32 0 to i32
- %69 = bitcast i32 0 to i32
- %70 = bitcast i32 0 to i32
- %71 = bitcast i32 0 to i32
- %72 = bitcast i32 0 to i32
- %73 = bitcast i32 0 to i32
- %74 = bitcast i32 0 to i32
- %75 = bitcast i32 0 to i32
- %76 = bitcast i32 0 to i32
- %77 = bitcast i32 0 to i32
- %78 = bitcast i32 0 to i32
- %79 = bitcast i32 0 to i32
- %80 = bitcast i32 0 to i32
- %81 = bitcast i32 0 to i32
- %82 = bitcast i32 0 to i32
- %83 = bitcast i32 0 to i32
- %84 = bitcast i32 0 to i32
- %85 = bitcast i32 0 to i32
- %86 = bitcast i32 0 to i32
- %87 = bitcast i32 0 to i32
- %88 = bitcast i32 0 to i32
- %89 = bitcast i32 0 to i32
- %90 = bitcast i32 0 to i32
- %91 = bitcast i32 0 to i32
- %92 = bitcast i32 0 to i32
- %93 = bitcast i32 0 to i32
- %94 = bitcast i32 0 to i32
- %95 = bitcast i32 0 to i32
- %96 = bitcast i32 0 to i32
- %97 = bitcast i32 0 to i32
- %98 = bitcast i32 0 to i32
-
- ; CHECK: store i32 -1, i32* @x, align 4
- store i32 -1, i32* @x, align 4
- ret i32 0
-}
-
-; Function Attrs: nounwind readnone
-declare void @llvm.dbg.value(metadata, metadata, metadata)
-
-!llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!11, !13}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.4", isOptimized: true, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
-!1 = !DIFile(filename: "test.c", directory: "/home/tmp")
-!2 = !{}
-!4 = distinct !DISubprogram(name: "test_within_limit", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 4, file: !1, scope: !5, type: !6, retainedNodes: !2)
-!5 = !DIFile(filename: "test.c", directory: "/home/tmp")
-!6 = !DISubroutineType(types: !7)
-!7 = !{!8}
-!8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
-!9 = !{!10}
-!10 = !DILocalVariable(name: "x", scope: !4, type: !8)
-!11 = !{i32 2, !"Dwarf Version", i32 4}
-!12 = !{i32* undef}
-
-!13 = !{i32 1, !"Debug Info Version", i32 3}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/int_sideeffect.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/int_sideeffect.ll
deleted file mode 100644
index 806c7362267d..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/int_sideeffect.ll
+++ /dev/null
@@ -1,15 +0,0 @@
-; RUN: opt -S < %s -dse -enable-dse-memoryssa=false | FileCheck %s
-
-declare void @llvm.sideeffect()
-
-; Dead store elimination across a @llvm.sideeffect.
-
-; CHECK-LABEL: dse
-; CHECK: store
-; CHECK-NOT: store
-define void @dse(float* %p) {
- store float 0.0, float* %p
- call void @llvm.sideeffect()
- store float 0.0, float* %p
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/invariant.start.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/invariant.start.ll
deleted file mode 100644
index 5a0c1f05a2d3..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/invariant.start.ll
+++ /dev/null
@@ -1,34 +0,0 @@
-; Test to make sure llvm.invariant.start calls are not treated as clobbers.
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) nounwind readonly
-
-; We cannot remove the store 1 to %p.
-; FIXME: By the semantics of invariant.start, the store 3 to p is unreachable.
-define void @test(i8 *%p) {
- store i8 1, i8* %p, align 4
- %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %p)
- store i8 3, i8* %p, align 4
- ret void
-; CHECK-LABEL: @test(
-; CHECK-NEXT: store i8 1, i8* %p, align 4
-; CHECK-NEXT: %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %p)
-; CHECK-NEXT: store i8 3, i8* %p, align 4
-; CHECK-NEXT: ret void
-}
-
-; FIXME: We should be able to remove the first store to p, even though p and q
-; may alias.
-define void @test2(i8* %p, i8* %q) {
- store i8 1, i8* %p, align 4
- store i8 2, i8* %q, align 4
- %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %q)
- store i8 3, i8* %p, align 4
- ret void
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: store i8 1, i8* %p, align 4
-; CHECK-NEXT: store i8 2, i8* %q, align 4
-; CHECK-NEXT: %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %q)
-; CHECK-NEXT: store i8 3, i8* %p, align 4
-; CHECK-NEXT: ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/launder.invariant.group.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/launder.invariant.group.ll
deleted file mode 100644
index 815ad02d4fc0..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/launder.invariant.group.ll
+++ /dev/null
@@ -1,65 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-; CHECK-LABEL: void @skipBarrier(i8* %ptr)
-define void @skipBarrier(i8* %ptr) {
-; CHECK-NOT: store i8 42
- store i8 42, i8* %ptr
-; CHECK: %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
- %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
-; CHECK: store i8 43
- store i8 43, i8* %ptr2
- ret void
-}
-
-; CHECK-LABEL: void @skip2Barriers(i8* %ptr)
-define void @skip2Barriers(i8* %ptr) {
-; CHECK-NOT: store i8 42
- store i8 42, i8* %ptr
-; CHECK: %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
- %ptr2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr)
-; CHECK-NOT: store i8 43
- store i8 43, i8* %ptr2
- %ptr3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr2)
- %ptr4 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr3)
-
-; CHECK: store i8 44
- store i8 44, i8* %ptr4
- ret void
-}
-
-; CHECK-LABEL: void @skip3Barriers(i8* %ptr)
-define void @skip3Barriers(i8* %ptr) {
-; CHECK-NOT: store i8 42
- store i8 42, i8* %ptr
-; CHECK: %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
- %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
-; CHECK-NOT: store i8 43
- store i8 43, i8* %ptr2
- %ptr3 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr2)
- %ptr4 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr3)
-
-; CHECK: store i8 44
- store i8 44, i8* %ptr4
- ret void
-}
-
-; CHECK-LABEL: void @skip4Barriers(i8* %ptr)
-define void @skip4Barriers(i8* %ptr) {
-; CHECK-NOT: store i8 42
- store i8 42, i8* %ptr
-; CHECK: %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
- %ptr2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr)
-; CHECK-NOT: store i8 43
- store i8 43, i8* %ptr2
- %ptr3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr2)
- %ptr4 = call i8* @llvm.strip.invariant.group.p0i8(i8* %ptr3)
- %ptr5 = call i8* @llvm.launder.invariant.group.p0i8(i8* %ptr3)
-
-; CHECK: store i8 44
- store i8 44, i8* %ptr5
- ret void
-}
-
-
-declare i8* @llvm.launder.invariant.group.p0i8(i8*)
-declare i8* @llvm.strip.invariant.group.p0i8(i8*)
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls.ll
deleted file mode 100644
index 692a9a03ea82..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls.ll
+++ /dev/null
@@ -1,72 +0,0 @@
-; RUN: opt -S -basic-aa -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-
-target triple = "x86_64-unknown-linux-gnu"
-
-declare i8* @strcpy(i8* %dest, i8* %src) nounwind
-define void @test1(i8* %src) {
-; CHECK-LABEL: @test1(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK-NOT: @strcpy
- %call = call i8* @strcpy(i8* %dest, i8* %src)
-; CHECK: ret void
- ret void
-}
-
-declare i8* @strncpy(i8* %dest, i8* %src, i64 %n) nounwind
-define void @test2(i8* %src) {
-; CHECK-LABEL: @test2(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK-NOT: @strncpy
- %call = call i8* @strncpy(i8* %dest, i8* %src, i64 12)
-; CHECK: ret void
- ret void
-}
-
-declare i8* @strcat(i8* %dest, i8* %src) nounwind
-define void @test3(i8* %src) {
-; CHECK-LABEL: @test3(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK-NOT: @strcat
- %call = call i8* @strcat(i8* %dest, i8* %src)
-; CHECK: ret void
- ret void
-}
-
-declare i8* @strncat(i8* %dest, i8* %src, i64 %n) nounwind
-define void @test4(i8* %src) {
-; CHECK-LABEL: @test4(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK-NOT: @strncat
- %call = call i8* @strncat(i8* %dest, i8* %src, i64 12)
-; CHECK: ret void
- ret void
-}
-
-define void @test5(i8* nocapture %src) {
-; CHECK-LABEL: @test5(
- %dest = alloca [100 x i8], align 16
- %arraydecay = getelementptr inbounds [100 x i8], [100 x i8]* %dest, i64 0, i64 0
- %call = call i8* @strcpy(i8* %arraydecay, i8* %src)
-; CHECK: %call = call i8* @strcpy
- %arrayidx = getelementptr inbounds i8, i8* %call, i64 10
- store i8 97, i8* %arrayidx, align 1
- ret void
-}
-
-declare void @user(i8* %p)
-define void @test6(i8* %src) {
-; CHECK-LABEL: @test6(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK: @strcpy
- %call = call i8* @strcpy(i8* %dest, i8* %src)
-; CHECK: @user
- call void @user(i8* %dest)
-; CHECK: ret void
- ret void
-}
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls2.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls2.ll
deleted file mode 100644
index 23440f18b052..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/libcalls2.ll
+++ /dev/null
@@ -1,14 +0,0 @@
-; RUN: opt -S -basic-aa -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-
-target triple = "x86_64-unknown-linux-gnu"
-
-declare i8* @strncpy(i8* %dest, i8* %src, i32 %n) nounwind
-define void @test2(i8* %src) {
-; CHECK-LABEL: @test2(
- %B = alloca [16 x i8]
- %dest = getelementptr inbounds [16 x i8], [16 x i8]* %B, i64 0, i64 0
-; CHECK: @strncpy
- %call = call i8* @strncpy(i8* %dest, i8* %src, i32 12)
-; CHECK: ret void
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/lifetime.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/lifetime.ll
deleted file mode 100644
index 3f20d9e1dda2..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/lifetime.ll
+++ /dev/null
@@ -1,35 +0,0 @@
-; RUN: opt -S -basic-aa -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-
-target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
-
-declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind
-declare void @llvm.memset.p0i8.i8(i8* nocapture, i8, i8, i1) nounwind
-
-define void @test1() {
-; CHECK-LABEL: @test1(
- %A = alloca i8
-
- store i8 0, i8* %A ;; Written to by memset
- call void @llvm.lifetime.end.p0i8(i64 1, i8* %A)
-; CHECK-NOT: lifetime.end
-
- call void @llvm.memset.p0i8.i8(i8* %A, i8 0, i8 -1, i1 false)
-; CHECK-NOT: memset
-
- ret void
-; CHECK: ret void
-}
-
-define void @test2(i32* %P) {
-; CHECK: test2
- %Q = getelementptr i32, i32* %P, i32 1
- %R = bitcast i32* %Q to i8*
- call void @llvm.lifetime.start.p0i8(i64 4, i8* %R)
- store i32 0, i32* %Q ;; This store is dead.
-; CHECK-NOT: store
- call void @llvm.lifetime.end.p0i8(i64 4, i8* %R)
- ret void
-}
-
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/mda-with-dbg-values.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/mda-with-dbg-values.ll
deleted file mode 100644
index b46e1392723c..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/mda-with-dbg-values.ll
+++ /dev/null
@@ -1,72 +0,0 @@
-; RUN: opt -S -dse -enable-dse-memoryssa=false -memdep-block-scan-limit=3 < %s | FileCheck %s
-; RUN: opt -S -strip-debug -dse -enable-dse-memoryssa=false -memdep-block-scan-limit=3 < %s | FileCheck %s
-
-; Test case to check that the memory dependency analysis gets the same
-; result even if we have a dbg value between the memcpy and
-; store. The memory dependency is then used by DSE to remove the store.
-
-; We use -memdep-block-scan-limit=3 to be able to create a small test case.
-; Without it, we would need to squeeze in 100 instructions since the default
-; limit is 100.
-
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
- at g = common global [1 x i8] zeroinitializer, align 1, !dbg !0
-
-; Function Attrs: noinline nounwind uwtable
-define void @foo() #0 !dbg !14 {
-entry:
- %i = alloca i8, align 1
- store i8 1, i8* %i, align 1, !dbg !19
- call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !17, metadata !DIExpression()), !dbg !18
- %0 = bitcast [1 x i8]* @g to i8*
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %i, i8* %0, i64 1, i1 false), !dbg !20
- br label %bb2
-
-bb2: ; preds = %0
- ret void, !dbg !21
-}
-
-; Function Attrs: nounwind readnone speculatable
-declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
-
-; Function Attrs: argmemonly nounwind
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #2
-
-attributes #0 = { noinline nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
-attributes #1 = { nounwind readnone speculatable }
-attributes #2 = { argmemonly nounwind }
-
-!llvm.dbg.cu = !{!2}
-!llvm.module.flags = !{!10, !11, !12}
-!llvm.ident = !{!13}
-
-!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
-!1 = distinct !DIGlobalVariable(name: "g", scope: !2, file: !3, line: 3, type: !6, isLocal: false, isDefinition: true)
-!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 6.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
-!3 = !DIFile(filename: "foo.c", directory: "/bar")
-!4 = !{}
-!5 = !{!0}
-!6 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 8, elements: !8)
-!7 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
-!8 = !{!9}
-!9 = !DISubrange(count: 1)
-!10 = !{i32 2, !"Dwarf Version", i32 4}
-!11 = !{i32 2, !"Debug Info Version", i32 3}
-!12 = !{i32 1, !"wchar_size", i32 4}
-!13 = !{!"clang version 6.0.0"}
-!14 = distinct !DISubprogram(name: "foo", scope: !3, file: !3, line: 5, type: !15, isLocal: false, isDefinition: true, scopeLine: 6, isOptimized: false, unit: !2, retainedNodes: !4)
-!15 = !DISubroutineType(types: !16)
-!16 = !{null}
-!17 = !DILocalVariable(name: "i", scope: !14, file: !3, line: 7, type: !7)
-!18 = !DILocation(line: 7, column: 10, scope: !14)
-!19 = !DILocation(line: 8, column: 7, scope: !14)
-!20 = !DILocation(line: 9, column: 5, scope: !14)
-!21 = !DILocation(line: 10, column: 1, scope: !14)
-
-; Check that the store is removed and that the memcpy is still there
-; CHECK-LABEL: foo
-; CHECK-NOT: store i8
-; CHECK: call void @llvm.memcpy
-; CHECK: ret void
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memintrinsics.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memintrinsics.ll
deleted file mode 100644
index 4a54d848b65c..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memintrinsics.ll
+++ /dev/null
@@ -1,95 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -S -dse -enable-dse-memoryssa=false < %s | FileCheck %s
-
-declare void @llvm.memcpy.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i1) nounwind
-declare void @llvm.memmove.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i1) nounwind
-declare void @llvm.memset.p0i8.i8(i8* nocapture, i8, i8, i1) nounwind
-
-define void @test1() {
-; CHECK-LABEL: @test1(
-; CHECK-NEXT: ret void
-;
- %A = alloca i8
- %B = alloca i8
-
- store i8 0, i8* %A ;; Written to by memcpy
-
- call void @llvm.memcpy.p0i8.p0i8.i8(i8* %A, i8* %B, i8 -1, i1 false)
-
- ret void
-}
-
-define void @test2() {
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: ret void
-;
- %A = alloca i8
- %B = alloca i8
-
- store i8 0, i8* %A ;; Written to by memmove
-
- call void @llvm.memmove.p0i8.p0i8.i8(i8* %A, i8* %B, i8 -1, i1 false)
-
- ret void
-}
-
-define void @test3() {
-; CHECK-LABEL: @test3(
-; CHECK-NEXT: ret void
-;
- %A = alloca i8
-
- store i8 0, i8* %A ;; Written to by memset
-
- call void @llvm.memset.p0i8.i8(i8* %A, i8 0, i8 -1, i1 false)
-
- ret void
-}
-
-declare void @llvm.memcpy.element.unordered.atomic.p0i16.p0i16.i16(i16* nocapture, i16* nocapture, i16, i32) nounwind
-declare void @llvm.memmove.element.unordered.atomic.p0i16.p0i16.i16(i16* nocapture, i16* nocapture, i16, i32) nounwind
-declare void @llvm.memset.element.unordered.atomic.p0i16.i16(i16* nocapture, i8, i16, i32) nounwind
-
-
-define void @test4() {
-; CHECK-LABEL: @test4(
-; CHECK-NEXT: ret void
-;
- %A = alloca i16, i16 1024, align 2
- %B = alloca i16, i16 1024, align 2
-
- store atomic i16 0, i16* %A unordered, align 2 ;; Written to by memcpy
- store atomic i16 0, i16* %B unordered, align 2 ;; Read by memcpy
-
- call void @llvm.memcpy.element.unordered.atomic.p0i16.p0i16.i16(i16* align 2 %A, i16* align 2 %B, i16 1024, i32 2)
-
- ret void
-}
-
-define void @test5() {
-; CHECK-LABEL: @test5(
-; CHECK-NEXT: ret void
-;
- %A = alloca i16, i16 1024, align 2
- %B = alloca i16, i16 1024, align 2
-
- store atomic i16 0, i16* %A unordered, align 2 ;; Written to by memmove
- store atomic i16 0, i16* %B unordered, align 2 ;; Read by memmove
-
- call void @llvm.memmove.element.unordered.atomic.p0i16.p0i16.i16(i16* align 2 %A, i16* align 2 %B, i16 1024, i32 2)
-
- ret void
-}
-
-define void @test6() {
-; CHECK-LABEL: @test6(
-; CHECK-NEXT: ret void
-;
- %A = alloca i16, i16 1024, align 2
-
- store atomic i16 0, i16* %A unordered, align 2 ;; Written to by memset
-
- call void @llvm.memset.element.unordered.atomic.p0i16.i16(i16* align 2 %A, i8 0, i16 1024, i32 2)
-
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memset-missing-debugloc.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memset-missing-debugloc.ll
deleted file mode 100644
index ea07f9149239..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/memset-missing-debugloc.ll
+++ /dev/null
@@ -1,89 +0,0 @@
-; Test that the getelementptr generated when the dse pass determines that
-; a memset can be shortened has the debugloc carried over from the memset.
-
-; RUN: opt -S -march=native -dse -enable-dse-memoryssa=false < %s| FileCheck %s
-; CHECK: bitcast [5 x i64]* %{{[a-zA-Z_][a-zA-Z0-9_]*}} to i8*, !dbg
-; CHECK-NEXT: %{{[0-9]+}} = getelementptr inbounds i8, i8* %0, i64 32, !dbg ![[DBG:[0-9]+]]
-; CHECK: ![[DBG]] = !DILocation(line: 2,
-
-; The test IR is generated by running:
-;
-; clang Debugify_Dead_Store_Elimination.cpp -Wno-c++11-narrowing -S \
-; -emit-llvm -O0 -w -Xclang -disable-O0-optnone -march=native -fdeclspec \
-; --target=x86_64-gnu-linux-unknown -Werror=unreachable-code -o -
-;
-; Where Debugify_Dead_Store_Elimination.cpp contains:
-;
-; int a() {
-; long b[]{2, 2, 2, 2, 0};
-; if (a())
-; ;
-; }
-
-
-define dso_local i32 @_Z1av() !dbg !7 {
-entry:
- %retval = alloca i32, align 4
- %b = alloca [5 x i64], align 16
- call void @llvm.dbg.declare(metadata [5 x i64]* %b, metadata !11, metadata !DIExpression()), !dbg !16
- %0 = bitcast [5 x i64]* %b to i8*, !dbg !16
- call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 40, i1 false), !dbg !16
- %1 = bitcast i8* %0 to [5 x i64]*, !dbg !16
- %2 = getelementptr inbounds [5 x i64], [5 x i64]* %1, i32 0, i32 0, !dbg !16
- store i64 2, i64* %2, align 16, !dbg !16
- %3 = getelementptr inbounds [5 x i64], [5 x i64]* %1, i32 0, i32 1, !dbg !16
- store i64 2, i64* %3, align 8, !dbg !16
- %4 = getelementptr inbounds [5 x i64], [5 x i64]* %1, i32 0, i32 2, !dbg !16
- store i64 2, i64* %4, align 16, !dbg !16
- %5 = getelementptr inbounds [5 x i64], [5 x i64]* %1, i32 0, i32 3, !dbg !16
- store i64 2, i64* %5, align 8, !dbg !16
- %call = call i32 @_Z1av(), !dbg !17
- %tobool = icmp ne i32 %call, 0, !dbg !17
- br i1 %tobool, label %if.then, label %if.end, !dbg !19
-
-if.then: ; preds = %entry
- br label %if.end, !dbg !19
-
-if.end: ; preds = %if.then, %entry
- call void @llvm.trap(), !dbg !20
- unreachable, !dbg !20
-
-return: ; No predecessors!
- %6 = load i32, i32* %retval, align 4, !dbg !21
- ret i32 %6, !dbg !21
-}
-
-; Function Attrs: nounwind readnone speculatable
-declare void @llvm.dbg.declare(metadata, metadata, metadata)
-
-; Function Attrs: argmemonly nounwind
-declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg)
-
-; Function Attrs: cold noreturn nounwind
-declare void @llvm.trap()
-
-!llvm.module.flags = !{!3, !4, !5}
-!llvm.ident = !{!6}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 9.0.0 (https://github.com/llvm/llvm-project.git eb1a156d7f7ba56ea8f9a26da36e6a93d1e98bda)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
-!1 = !DIFile(filename: "Debugify_Dead_Store_Elimination.cpp", directory: "")
-!2 = !{}
-!3 = !{i32 2, !"Dwarf Version", i32 4}
-!4 = !{i32 2, !"Debug Info Version", i32 3}
-!5 = !{i32 1, !"wchar_size", i32 4}
-!6 = !{!"clang version 9.0.0 (https://github.com/llvm/llvm-project.git eb1a156d7f7ba56ea8f9a26da36e6a93d1e98bda)"}
-!7 = distinct !DISubprogram(name: "a", linkageName: "_Z1av", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
-!8 = !DISubroutineType(types: !9)
-!9 = !{!10}
-!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-!11 = !DILocalVariable(name: "b", scope: !7, file: !1, line: 2, type: !12)
-!12 = !DICompositeType(tag: DW_TAG_array_type, baseType: !13, size: 320, elements: !14)
-!13 = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
-!14 = !{!15}
-!15 = !DISubrange(count: 5)
-!16 = !DILocation(line: 2, column: 8, scope: !7)
-!17 = !DILocation(line: 3, column: 7, scope: !18)
-!18 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 7)
-!19 = !DILocation(line: 3, column: 7, scope: !7)
-!20 = !DILocation(line: 3, column: 9, scope: !18)
-!21 = !DILocation(line: 5, column: 1, scope: !7)
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores-big-endian.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores-big-endian.ll
deleted file mode 100644
index 1d4f7b38b4c0..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores-big-endian.ll
+++ /dev/null
@@ -1,172 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging -S < %s | FileCheck %s
-target datalayout = "E-m:e-i64:64-i128:128-n32:64-S128"
-
-define void @byte_by_byte_replacement(i32 *%ptr) {
-; CHECK-LABEL: @byte_by_byte_replacement(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i32 151653132, i32* [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
-entry:
- ;; This store's value should be modified as it should be better to use one
- ;; larger store than several smaller ones.
- ;; store will turn into 0x090A0B0C == 151653132
- store i32 305419896, i32* %ptr ; 0x12345678
- %bptr = bitcast i32* %ptr to i8*
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
-
- ;; We should be able to merge these four stores with the i32 above
- ; value (and bytes) stored before ; 0x12345678
- store i8 9, i8* %bptr ; 09
- store i8 10, i8* %bptr1 ; 0A
- store i8 11, i8* %bptr2 ; 0B
- store i8 12, i8* %bptr3 ; 0C
- ; 0x090A0B0C
-
- ret void
-}
-
-define void @word_replacement(i64 *%ptr) {
-; CHECK-LABEL: @word_replacement(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 72638273700655232, i64* [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 72623859790382856, i64* %ptr ; 0x0102030405060708
-
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %wptr3 = getelementptr inbounds i16, i16* %wptr, i64 3
-
- ;; We should be able to merge these two stores with the i64 one above
- ; value (and bytes) stored before ; 0x0102030405060708
- store i16 4128, i16* %wptr1 ; 1020
- store i16 28800, i16* %wptr3 ; 7080
- ; 0x0102102005067080
-
- ret void
-}
-
-
-define void @
diff erently_sized_replacements(i64 *%ptr) {
-; CHECK-LABEL: @
diff erently_sized_replacements(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 289077004501059343, i64* [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr6 = getelementptr inbounds i8, i8* %bptr, i64 6
- %wptr = bitcast i64* %ptr to i16*
- %wptr2 = getelementptr inbounds i16, i16* %wptr, i64 2
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (and bytes) stored before ; 0x08090a0b0c0d0e0f
- store i8 7, i8* %bptr6 ; 07
- store i16 1541, i16* %wptr2 ; 0605
- store i32 67305985, i32* %dptr ; 04030201
- ; 0x040302010605070f
- ret void
-}
-
-
-define void @multiple_replacements_to_same_byte(i64 *%ptr) {
-; CHECK-LABEL: @multiple_replacements_to_same_byte(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 289077004602248719, i64* [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (and bytes) stored before ; 0x08090a0b0c0d0e0f
- store i8 7, i8* %bptr3 ; 07
- store i16 1541, i16* %wptr1 ; 0605
- store i32 67305985, i32* %dptr ; 04030201
- ; 0x040302010c0d0e0f
- ret void
-}
-
-define void @merged_merges(i64 *%ptr) {
-; CHECK-LABEL: @merged_merges(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 289081428418563599, i64* [[PTR:%.*]]
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (not bytes) stored before ; 0x08090a0b0c0d0e0f
- store i32 67305985, i32* %dptr ; 04030201
- store i16 1541, i16* %wptr1 ; 0605
- store i8 7, i8* %bptr3 ; 07
- ; 0x040306070c0d0e0f
- ret void
-}
-
-define signext i8 @shouldnt_merge_since_theres_a_full_overlap(i64 *%ptr) {
-; CHECK-LABEL: @shouldnt_merge_since_theres_a_full_overlap(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BPTR:%.*]] = bitcast i64* [[PTR:%.*]] to i8*
-; CHECK-NEXT: [[BPTRM1:%.*]] = getelementptr inbounds i8, i8* [[BPTR]], i64 -1
-; CHECK-NEXT: [[BPTR3:%.*]] = getelementptr inbounds i8, i8* [[BPTR]], i64 3
-; CHECK-NEXT: [[DPTR:%.*]] = bitcast i8* [[BPTRM1]] to i32*
-; CHECK-NEXT: [[QPTR:%.*]] = bitcast i8* [[BPTR3]] to i64*
-; CHECK-NEXT: store i32 1234, i32* [[DPTR]], align 1
-; CHECK-NEXT: store i64 5678, i64* [[QPTR]], align 1
-; CHECK-NEXT: ret i8 0
-;
-entry:
-
- store i64 0, i64* %ptr
-
- %bptr = bitcast i64* %ptr to i8*
- %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %dptr = bitcast i8* %bptrm1 to i32*
- %qptr = bitcast i8* %bptr3 to i64*
-
- store i32 1234, i32* %dptr, align 1
- store i64 5678, i64* %qptr, align 1
-
- ret i8 0
-}
-
-;; Test case from PR31777
-%union.U = type { i64 }
-
-define void @foo(%union.U* nocapture %u) {
-; CHECK-LABEL: @foo(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[I:%.*]] = getelementptr inbounds [[UNION_U:%.*]], %union.U* [[U:%.*]], i64 0, i32 0
-; CHECK-NEXT: store i64 11821949021847552, i64* [[I]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- %i = getelementptr inbounds %union.U, %union.U* %u, i64 0, i32 0
- store i64 0, i64* %i, align 8
- %s = bitcast %union.U* %u to i16*
- store i16 42, i16* %s, align 8
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores.ll
deleted file mode 100644
index b3e16f8e5a8e..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/merge-stores.ll
+++ /dev/null
@@ -1,236 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -dse -enable-dse-memoryssa=false -enable-dse-partial-store-merging -S < %s | FileCheck %s
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64"
-
-define void @byte_by_byte_replacement(i32 *%ptr) {
-; CHECK-LABEL: @byte_by_byte_replacement(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i32 202050057, i32* [[PTR:%.*]], align 4
-; CHECK-NEXT: ret void
-;
-entry:
- ;; This store's value should be modified as it should be better to use one
- ;; larger store than several smaller ones.
- ;; store will turn into 0x0C0B0A09 == 202050057
- store i32 305419896, i32* %ptr ; 0x12345678
- %bptr = bitcast i32* %ptr to i8*
- %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1
- %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
-
- ;; We should be able to merge these four stores with the i32 above
- ; value (and bytes) stored before ; 0x12345678
- store i8 9, i8* %bptr ; 09
- store i8 10, i8* %bptr1 ; 0A
- store i8 11, i8* %bptr2 ; 0B
- store i8 12, i8* %bptr3 ; 0C
- ; 0x0C0B0A09
- ret void
-}
-
-define void @word_replacement(i64 *%ptr) {
-; CHECK-LABEL: @word_replacement(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 8106482645252179720, i64* [[PTR:%.*]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 72623859790382856, i64* %ptr ; 0x0102030405060708
-
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %wptr3 = getelementptr inbounds i16, i16* %wptr, i64 3
-
- ;; We should be able to merge these two stores with the i64 one above
- ; value (not bytes) stored before ; 0x0102030405060708
- store i16 4128, i16* %wptr1 ; 1020
- store i16 28800, i16* %wptr3 ; 7080
- ; 0x7080030410200708
- ret void
-}
-
-
-define void @
diff erently_sized_replacements(i64 *%ptr) {
-; CHECK-LABEL: @
diff erently_sized_replacements(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 578437695752307201, i64* [[PTR:%.*]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr6 = getelementptr inbounds i8, i8* %bptr, i64 6
- %wptr = bitcast i64* %ptr to i16*
- %wptr2 = getelementptr inbounds i16, i16* %wptr, i64 2
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (not bytes) stored before ; 0x08090a0b0c0d0e0f
- store i8 7, i8* %bptr6 ; 07
- store i16 1541, i16* %wptr2 ; 0605
- store i32 67305985, i32* %dptr ; 04030201
- ; 0x0807060504030201
- ret void
-}
-
-
-define void @multiple_replacements_to_same_byte(i64 *%ptr) {
-; CHECK-LABEL: @multiple_replacements_to_same_byte(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 579005069522043393, i64* [[PTR:%.*]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (not bytes) stored before ; 0x08090a0b0c0d0e0f
- store i8 7, i8* %bptr3 ; 07
- store i16 1541, i16* %wptr1 ; 0605
- store i32 67305985, i32* %dptr ; 04030201
- ; 0x08090a0b04030201
- ret void
-}
-
-define void @merged_merges(i64 *%ptr) {
-; CHECK-LABEL: @merged_merges(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: store i64 579005069572506113, i64* [[PTR:%.*]], align 8
-; CHECK-NEXT: ret void
-;
-entry:
- store i64 579005069656919567, i64* %ptr ; 0x08090a0b0c0d0e0f
-
- %bptr = bitcast i64* %ptr to i8*
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %wptr = bitcast i64* %ptr to i16*
- %wptr1 = getelementptr inbounds i16, i16* %wptr, i64 1
- %dptr = bitcast i64* %ptr to i32*
-
- ;; We should be able to merge all these stores with the i64 one above
- ; value (not bytes) stored before ; 0x08090a0b0c0d0e0f
- store i32 67305985, i32* %dptr ; 04030201
- store i16 1541, i16* %wptr1 ; 0605
- store i8 7, i8* %bptr3 ; 07
- ; 0x08090a0b07050201
- ret void
-}
-
-define signext i8 @shouldnt_merge_since_theres_a_full_overlap(i64 *%ptr) {
-; CHECK-LABEL: @shouldnt_merge_since_theres_a_full_overlap(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[BPTR:%.*]] = bitcast i64* [[PTR:%.*]] to i8*
-; CHECK-NEXT: [[BPTRM1:%.*]] = getelementptr inbounds i8, i8* [[BPTR]], i64 -1
-; CHECK-NEXT: [[BPTR3:%.*]] = getelementptr inbounds i8, i8* [[BPTR]], i64 3
-; CHECK-NEXT: [[DPTR:%.*]] = bitcast i8* [[BPTRM1]] to i32*
-; CHECK-NEXT: [[QPTR:%.*]] = bitcast i8* [[BPTR3]] to i64*
-; CHECK-NEXT: store i32 1234, i32* [[DPTR]], align 1
-; CHECK-NEXT: store i64 5678, i64* [[QPTR]], align 1
-; CHECK-NEXT: ret i8 0
-;
-entry:
-
- ; Also check that alias.scope metadata doesn't get dropped
- store i64 0, i64* %ptr, !alias.scope !32
-
- %bptr = bitcast i64* %ptr to i8*
- %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1
- %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3
- %dptr = bitcast i8* %bptrm1 to i32*
- %qptr = bitcast i8* %bptr3 to i64*
-
- store i32 1234, i32* %dptr, align 1
- store i64 5678, i64* %qptr, align 1
-
- ret i8 0
-}
-
-;; Test case from PR31777
-%union.U = type { i64 }
-
-define void @foo(%union.U* nocapture %u) {
-; CHECK-LABEL: @foo(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[I:%.*]] = getelementptr inbounds [[UNION_U:%.*]], %union.U* [[U:%.*]], i64 0, i32 0
-; CHECK-NEXT: store i64 42, i64* [[I]], align 8, !tbaa !0, !noalias !3, !nontemporal !4
-; CHECK-NEXT: ret void
-;
-entry:
- %i = getelementptr inbounds %union.U, %union.U* %u, i64 0, i32 0
- store i64 0, i64* %i, align 8, !dbg !22, !tbaa !26, !noalias !30, !nontemporal !29
- %s = bitcast %union.U* %u to i16*
- store i16 42, i16* %s, align 8
- ret void
-}
-
-; Don't crash by operating on stale data if we merge (kill) the last 2 stores.
-
-define void @PR34074(i32* %x, i64* %y) {
-; CHECK-LABEL: @PR34074(
-; CHECK-NEXT: store i64 42, i64* [[Y:%.*]], align 8
-; CHECK-NEXT: store i32 4, i32* [[X:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- store i64 42, i64* %y ; independent store
- %xbc = bitcast i32* %x to i8*
- store i32 0, i32* %x ; big store of constant
- store i8 4, i8* %xbc ; small store with mergeable constant
- ret void
-}
-
-; We can't eliminate the last store because P and Q may alias.
-
-define void @PR36129(i32* %P, i32* %Q) {
-; CHECK-LABEL: @PR36129(
-; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4
-; CHECK-NEXT: [[P2:%.*]] = bitcast i32* [[P]] to i8*
-; CHECK-NEXT: store i32 2, i32* [[Q:%.*]], align 4
-; CHECK-NEXT: store i8 3, i8* [[P2]], align 1
-; CHECK-NEXT: ret void
-;
- store i32 1, i32* %P
- %P2 = bitcast i32* %P to i8*
- store i32 2, i32* %Q
- store i8 3, i8* %P2
- ret void
-}
-
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 306512)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
-!1 = !DIFile(filename: "me.cpp", directory: "/compiler-explorer")
-!2 = !{}
-!7 = distinct !DISubprogram(name: "foo", linkageName: "foo(U*)", scope: !1, file: !1, line: 9, type: !8, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !20)
-!8 = !DISubroutineType(types: !9)
-!9 = !{null, !10}
-!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
-!11 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "U", file: !1, line: 4, size: 64, elements: !12, identifier: "typeinfo name for U")
-!12 = !{!13, !17}
-!13 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !11, file: !1, line: 5, baseType: !14, size: 64)
-!14 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint64_t", file: !15, line: 55, baseType: !16)
-!15 = !DIFile(filename: "/usr/include/stdint.h", directory: "/compiler-explorer")
-!16 = !DIBasicType(name: "long unsigned int", size: 64, encoding: DW_ATE_unsigned)
-!17 = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: !11, file: !1, line: 6, baseType: !18, size: 16)
-!18 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint16_t", file: !15, line: 49, baseType: !19)
-!19 = !DIBasicType(name: "unsigned short", size: 16, encoding: DW_ATE_unsigned)
-!20 = !{!21}
-!21 = !DILocalVariable(name: "u", arg: 1, scope: !7, file: !1, line: 9, type: !10)
-!22 = !DILocation(line: 10, column: 8, scope: !7)
-
-!26 = !{!27, !27, i64 0}
-!27 = !{!"omnipotent char", !28, i64 0}
-!28 = !{!"Simple C++ TBAA"}
-
-!29 = !{i32 1}
-
-; Domains and scopes which might alias
-!30 = !{!30}
-!31 = !{!31, !30}
-
-!32 = !{!32}
-!33 = !{!33, !32}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/no-targetdata.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/no-targetdata.ll
deleted file mode 100644
index ae32017c6a45..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/no-targetdata.ll
+++ /dev/null
@@ -1,21 +0,0 @@
-; RUN: opt -basic-aa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
-
-define void @fn(i8* nocapture %buf) #0 {
-entry:
-
-; We would not eliminate the first memcpy with data layout, and we should not
-; eliminate it without data layout.
-; CHECK-LABEL: @fn
-; CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64
-; CHECK: tail call void @llvm.memcpy.p0i8.p0i8.i64
-; CHECK: ret void
-
- %arrayidx = getelementptr i8, i8* %buf, i64 18
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %arrayidx, i8* %buf, i64 18, i1 false)
- store i8 1, i8* %arrayidx, align 1
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %buf, i8* %arrayidx, i64 18, i1 false)
- ret void
-}
-
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/operand-bundles.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/operand-bundles.ll
deleted file mode 100644
index 18117b3def8d..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/operand-bundles.ll
+++ /dev/null
@@ -1,55 +0,0 @@
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-
-declare noalias i8* @malloc(i64) "malloc-like"
-
-declare void @foo()
-declare void @bar(i8*)
-
-define void @test() {
- %obj = call i8* @malloc(i64 8)
- store i8 0, i8* %obj
- ; don't remove store. %obj should be treated like it will be read by the @foo.
- ; CHECK: store i8 0, i8* %obj
- call void @foo() ["deopt" (i8* %obj)]
- ret void
-}
-
-define void @test1() {
- %obj = call i8* @malloc(i64 8)
- store i8 0, i8* %obj
- ; CHECK: store i8 0, i8* %obj
- call void @bar(i8* nocapture %obj)
- ret void
-}
-
-define void @test2() {
- %obj = call i8* @malloc(i64 8)
- store i8 0, i8* %obj
- ; CHECK-NOT: store i8 0, i8* %obj
- call void @foo()
- ret void
-}
-
-define void @test3() {
- ; CHECK-LABEL: @test3(
- %s = alloca i64
- ; Verify that this first store is not considered killed by the second one
- ; since it could be observed from the deopt continuation.
- ; CHECK: store i64 1, i64* %s
- store i64 1, i64* %s
- call void @foo() [ "deopt"(i64* %s) ]
- store i64 0, i64* %s
- ret void
-}
-
-declare noalias i8* @calloc(i64, i64)
-
-define void @test4() {
-; CHECK-LABEL: @test4
- %local_obj = call i8* @calloc(i64 1, i64 4)
- call void @foo() ["deopt" (i8* %local_obj)]
- store i8 0, i8* %local_obj, align 4
- ; CHECK-NOT: store i8 0, i8* %local_obj, align 4
- call void @bar(i8* nocapture %local_obj)
- ret void
-}
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/pr11390.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/pr11390.ll
deleted file mode 100644
index ac806d6f170a..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/pr11390.ll
+++ /dev/null
@@ -1,38 +0,0 @@
-; RUN: opt -basic-aa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-; PR11390
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-define fastcc void @cat_domain(i8* nocapture %name, i8* nocapture %domain, i8**
-nocapture %s) nounwind uwtable {
-entry:
- %call = tail call i64 @strlen(i8* %name) nounwind readonly
- %call1 = tail call i64 @strlen(i8* %domain) nounwind readonly
- %add = add i64 %call, 1
- %add2 = add i64 %add, %call1
- %add3 = add i64 %add2, 1
- %call4 = tail call noalias i8* @malloc(i64 %add3) nounwind
- store i8* %call4, i8** %s, align 8
- %tobool = icmp eq i8* %call4, null
- br i1 %tobool, label %return, label %if.end
-
-if.end: ; preds = %entry
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %call4, i8* %name, i64 %call, i1 false)
- %arrayidx = getelementptr inbounds i8, i8* %call4, i64 %call
- store i8 46, i8* %arrayidx, align 1
-; CHECK: store i8 46
- %add.ptr5 = getelementptr inbounds i8, i8* %call4, i64 %add
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %add.ptr5, i8* %domain, i64 %call1, i1 false)
- %arrayidx8 = getelementptr inbounds i8, i8* %call4, i64 %add2
- store i8 0, i8* %arrayidx8, align 1
- br label %return
-
-return: ; preds = %if.end, %entry
- ret void
-}
-
-declare i64 @strlen(i8* nocapture) nounwind readonly
-
-declare noalias i8* @malloc(i64) nounwind
-
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/simple.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/simple.ll
deleted file mode 100644
index 1d6a9c691fc8..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/simple.ll
+++ /dev/null
@@ -1,1215 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
-; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -enable-dse-memoryssa=false -S | FileCheck %s
-target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
-
-declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
-declare void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* nocapture, i8, i64, i32) nounwind
-declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
-declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind
-declare void @llvm.init.trampoline(i8*, i8*, i8*)
-
-define void @test1(i32* %Q, i32* %P) {
-; CHECK-LABEL: @test1(
-; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- %DEAD = load i32, i32* %Q
- store i32 %DEAD, i32* %P
- store i32 0, i32* %P
- ret void
-}
-
-; PR8576 - Should delete store of 10 even though p/q are may aliases.
-define void @test2(i32 *%p, i32 *%q) {
-; CHECK-LABEL: @test2(
-; CHECK-NEXT: store i32 20, i32* [[Q:%.*]], align 4
-; CHECK-NEXT: store i32 30, i32* [[P:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- store i32 10, i32* %p, align 4
- store i32 20, i32* %q, align 4
- store i32 30, i32* %p, align 4
- ret void
-}
-
-
-; PR8677
- at g = global i32 1
-
-define i32 @test3(i32* %g_addr) nounwind {
-; CHECK-LABEL: @test3(
-; CHECK-NEXT: [[G_VALUE:%.*]] = load i32, i32* [[G_ADDR:%.*]], align 4
-; CHECK-NEXT: store i32 -1, i32* @g, align 4
-; CHECK-NEXT: store i32 [[G_VALUE]], i32* [[G_ADDR]], align 4
-; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* @g, align 4
-; CHECK-NEXT: ret i32 [[TMP3]]
-;
- %g_value = load i32, i32* %g_addr, align 4
- store i32 -1, i32* @g, align 4
- store i32 %g_value, i32* %g_addr, align 4
- %tmp3 = load i32, i32* @g, align 4
- ret i32 %tmp3
-}
-
-
-define void @test4(i32* %Q) {
-; CHECK-LABEL: @test4(
-; CHECK-NEXT: [[A:%.*]] = load i32, i32* [[Q:%.*]], align 4
-; CHECK-NEXT: store volatile i32 [[A]], i32* [[Q]], align 4
-; CHECK-NEXT: ret void
-;
- %a = load i32, i32* %Q
- store volatile i32 %a, i32* %Q
- ret void
-}
-
-define void @test5(i32* %Q) {
-; CHECK-LABEL: @test5(
-; CHECK-NEXT: [[A:%.*]] = load volatile i32, i32* [[Q:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- %a = load volatile i32, i32* %Q
- store i32 %a, i32* %Q
- ret void
-}
-
-; Should delete store of 10 even though memset is a may-store to P (P and Q may
-; alias).
-define void @test6(i32 *%p, i8 *%q) {
-; CHECK-LABEL: @test6(
-; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[Q:%.*]], i8 42, i64 900, i1 false)
-; CHECK-NEXT: store i32 30, i32* [[P:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- store i32 10, i32* %p, align 4 ;; dead.
- call void @llvm.memset.p0i8.i64(i8* %q, i8 42, i64 900, i1 false)
- store i32 30, i32* %p, align 4
- ret void
-}
-
-; Should delete store of 10 even though memset is a may-store to P (P and Q may
-; alias).
-define void @test6_atomic(i32* align 4 %p, i8* align 4 %q) {
-; CHECK-LABEL: @test6_atomic(
-; CHECK-NEXT: call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 [[Q:%.*]], i8 42, i64 900, i32 4)
-; CHECK-NEXT: store atomic i32 30, i32* [[P:%.*]] unordered, align 4
-; CHECK-NEXT: ret void
-;
- store atomic i32 10, i32* %p unordered, align 4 ;; dead.
- call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 4 %q, i8 42, i64 900, i32 4)
- store atomic i32 30, i32* %p unordered, align 4
- ret void
-}
-
-; Should delete store of 10 even though memcpy is a may-store to P (P and Q may
-; alias).
-define void @test7(i32 *%p, i8 *%q, i8* noalias %r) {
-; CHECK-LABEL: @test7(
-; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[Q:%.*]], i8* [[R:%.*]], i64 900, i1 false)
-; CHECK-NEXT: store i32 30, i32* [[P:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- store i32 10, i32* %p, align 4 ;; dead.
- call void @llvm.memcpy.p0i8.p0i8.i64(i8* %q, i8* %r, i64 900, i1 false)
- store i32 30, i32* %p, align 4
- ret void
-}
-
-; Should delete store of 10 even though memcpy is a may-store to P (P and Q may
-; alias).
-define void @test7_atomic(i32* align 4 %p, i8* align 4 %q, i8* noalias align 4 %r) {
-; CHECK-LABEL: @test7_atomic(
-; CHECK-NEXT: call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 4 [[Q:%.*]], i8* align 4 [[R:%.*]], i64 900, i32 4)
-; CHECK-NEXT: store atomic i32 30, i32* [[P:%.*]] unordered, align 4
-; CHECK-NEXT: ret void
-;
- store atomic i32 10, i32* %p unordered, align 4 ;; dead.
- call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 4 %q, i8* align 4 %r, i64 900, i32 4)
- store atomic i32 30, i32* %p unordered, align 4
- ret void
-}
-
-; Do not delete stores that are only partially killed.
-define i32 @test8() {
-; CHECK-LABEL: @test8(
-; CHECK-NEXT: [[V:%.*]] = alloca i32, align 4
-; CHECK-NEXT: store i32 1234567, i32* [[V]], align 4
-; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[V]], align 4
-; CHECK-NEXT: ret i32 [[X]]
-;
- %V = alloca i32
- store i32 1234567, i32* %V
- %V2 = bitcast i32* %V to i8*
- store i8 0, i8* %V2
- %X = load i32, i32* %V
- ret i32 %X
-
-}
-
-
-; Test for byval handling.
-%struct.x = type { i32, i32, i32, i32 }
-define void @test9(%struct.x* byval(%struct.x) %a) nounwind {
-; CHECK-LABEL: @test9(
-; CHECK-NEXT: ret void
-;
- %tmp2 = getelementptr %struct.x, %struct.x* %a, i32 0, i32 0
- store i32 1, i32* %tmp2, align 4
- ret void
-}
-
-; Test for inalloca handling.
-define void @test9_2(%struct.x* inalloca %a) nounwind {
-; CHECK-LABEL: @test9_2(
-; CHECK-NEXT: ret void
-;
- %tmp2 = getelementptr %struct.x, %struct.x* %a, i32 0, i32 0
- store i32 1, i32* %tmp2, align 4
- ret void
-}
-
-; Test for preallocated handling.
-define void @test9_3(%struct.x* preallocated(%struct.x) %a) nounwind {
-; CHECK-LABEL: @test9_3(
-; CHECK-NEXT: ret void
-;
- %tmp2 = getelementptr %struct.x, %struct.x* %a, i32 0, i32 0
- store i32 1, i32* %tmp2, align 4
- ret void
-}
-
-; va_arg has fuzzy dependence, the store shouldn't be zapped.
-define double @test10(i8* %X) {
-; CHECK-LABEL: @test10(
-; CHECK-NEXT: [[X_ADDR:%.*]] = alloca i8*, align 8
-; CHECK-NEXT: store i8* [[X:%.*]], i8** [[X_ADDR]], align 8
-; CHECK-NEXT: [[TMP_0:%.*]] = va_arg i8** [[X_ADDR]], double
-; CHECK-NEXT: ret double [[TMP_0]]
-;
- %X_addr = alloca i8*
- store i8* %X, i8** %X_addr
- %tmp.0 = va_arg i8** %X_addr, double
- ret double %tmp.0
-}
-
-
-; DSE should delete the dead trampoline.
-declare void @test11f()
-define void @test11() {
-; CHECK-LABEL: @test11(
-; CHECK-NEXT: ret void
-;
- %storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1]
- %cast = getelementptr [10 x i8], [10 x i8]* %storage, i32 0, i32 0 ; <i8*> [#uses=1]
- call void @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @test11f to i8*), i8* null ) ; <i8*> [#uses=1]
- ret void
-}
-
-
-; PR2599 - load -> store to same address.
-define void @test12({ i32, i32 }* %x) nounwind {
-; CHECK-LABEL: @test12(
-; CHECK-NEXT: [[TMP7:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[X:%.*]], i32 0, i32 1
-; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
-; CHECK-NEXT: [[TMP17:%.*]] = sub i32 0, [[TMP8]]
-; CHECK-NEXT: store i32 [[TMP17]], i32* [[TMP7]], align 4
-; CHECK-NEXT: ret void
-;
- %tmp4 = getelementptr { i32, i32 }, { i32, i32 }* %x, i32 0, i32 0
- %tmp5 = load i32, i32* %tmp4, align 4
- %tmp7 = getelementptr { i32, i32 }, { i32, i32 }* %x, i32 0, i32 1
- %tmp8 = load i32, i32* %tmp7, align 4
- %tmp17 = sub i32 0, %tmp8
- store i32 %tmp5, i32* %tmp4, align 4
- store i32 %tmp17, i32* %tmp7, align 4
- ret void
-}
-
-
-; %P doesn't escape, the DEAD instructions should be removed.
-declare void @test13f()
-define i32* @test13() {
-; CHECK-LABEL: @test13(
-; CHECK-NEXT: [[PTR:%.*]] = tail call i8* @malloc(i32 4)
-; CHECK-NEXT: [[P:%.*]] = bitcast i8* [[PTR]] to i32*
-; CHECK-NEXT: call void @test13f()
-; CHECK-NEXT: store i32 0, i32* [[P]], align 4
-; CHECK-NEXT: ret i32* [[P]]
-;
- %ptr = tail call i8* @malloc(i32 4)
- %P = bitcast i8* %ptr to i32*
- %DEAD = load i32, i32* %P
- %DEAD2 = add i32 %DEAD, 1
- store i32 %DEAD2, i32* %P
- call void @test13f( )
- store i32 0, i32* %P
- ret i32* %P
-}
-
-define i32 addrspace(1)* @test13_addrspacecast() {
-; CHECK-LABEL: @test13_addrspacecast(
-; CHECK-NEXT: [[P:%.*]] = tail call i8* @malloc(i32 4)
-; CHECK-NEXT: [[P_BC:%.*]] = bitcast i8* [[P]] to i32*
-; CHECK-NEXT: [[P:%.*]] = addrspacecast i32* [[P_BC]] to i32 addrspace(1)*
-; CHECK-NEXT: call void @test13f()
-; CHECK-NEXT: store i32 0, i32 addrspace(1)* [[P]], align 4
-; CHECK-NEXT: ret i32 addrspace(1)* [[P]]
-;
- %p = tail call i8* @malloc(i32 4)
- %p.bc = bitcast i8* %p to i32*
- %P = addrspacecast i32* %p.bc to i32 addrspace(1)*
- %DEAD = load i32, i32 addrspace(1)* %P
- %DEAD2 = add i32 %DEAD, 1
- store i32 %DEAD2, i32 addrspace(1)* %P
- call void @test13f( )
- store i32 0, i32 addrspace(1)* %P
- ret i32 addrspace(1)* %P
-}
-
-declare noalias i8* @malloc(i32) willreturn
-declare noalias i8* @calloc(i32, i32) willreturn
-declare noalias i8* @aligned_alloc(i32, i32)
-declare void @free(i8*)
-
-
-define void @test14(i32* %Q) {
-; CHECK-LABEL: @test14(
-; CHECK-NEXT: ret void
-;
- %P = alloca i32
- %DEAD = load i32, i32* %Q
- store i32 %DEAD, i32* %P
- ret void
-
-}
-
-; Dead store on an aligned_alloc: should know that %M doesn't alias with %A.
-define i32 @test14a(i8* %M, i8 %value) {
-; CHECK-LABEL: @test14a(
-; CHECK-NEXT: [[A:%.*]] = tail call i8* @aligned_alloc(i32 32, i32 1024)
-; CHECK-NEXT: tail call void @free(i8* [[A]])
-; CHECK-NEXT: ret i32 0
-;
- %A = tail call i8* @aligned_alloc(i32 32, i32 1024)
- store i8 %value, i8* %A
- tail call void @free(i8* %A)
- ret i32 0
-}
-
-; PR8701
-
-;; Fully dead overwrite of memcpy.
-define void @test15(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test15(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- ret void
-}
-
-;; Fully dead overwrite of memcpy.
-define void @test15_atomic(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test15_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Fully dead overwrite of memcpy.
-define void @test15_atomic_weaker(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test15_atomic_weaker(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i1 false)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Fully dead overwrite of memcpy.
-define void @test15_atomic_weaker_2(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test15_atomic_weaker_2(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i1 false)
- ret void
-}
-
-;; Full overwrite of smaller memcpy.
-define void @test16(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test16(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- ret void
-}
-
-;; Full overwrite of smaller memcpy.
-define void @test16_atomic(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test16_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 8, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Full overwrite of smaller memory where overwrite has stronger atomicity
-define void @test16_atomic_weaker(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test16_atomic_weaker(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 8, i1 false)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Full overwrite of smaller memory where overwrite has weaker atomicity.
-define void @test16_atomic_weaker_2(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test16_atomic_weaker_2(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 8, i32 1)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i1 false)
- ret void
-}
-
-;; Overwrite of memset by memcpy.
-define void @test17(i8* %P, i8* noalias %Q) nounwind ssp {
-; CHECK-LABEL: @test17(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- ret void
-}
-
-;; Overwrite of memset by memcpy.
-define void @test17_atomic(i8* %P, i8* noalias %Q) nounwind ssp {
-; CHECK-LABEL: @test17_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 1 %P, i8 42, i64 8, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Overwrite of memset by memcpy. Overwrite is stronger atomicity. We can
-;; remove the memset.
-define void @test17_atomic_weaker(i8* %P, i8* noalias %Q) nounwind ssp {
-; CHECK-LABEL: @test17_atomic_weaker(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memset.p0i8.i64(i8* align 1 %P, i8 42, i64 8, i1 false)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-;; Overwrite of memset by memcpy. Overwrite is weaker atomicity. We can remove
-;; the memset.
-define void @test17_atomic_weaker_2(i8* %P, i8* noalias %Q) nounwind ssp {
-; CHECK-LABEL: @test17_atomic_weaker_2(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memset.element.unordered.atomic.p0i8.i64(i8* align 1 %P, i8 42, i64 8, i32 1)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i1 false)
- ret void
-}
-
-; Should not delete the volatile memset.
-define void @test17v(i8* %P, i8* %Q) nounwind ssp {
-; CHECK-LABEL: @test17v(
-; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[P:%.*]], i8 42, i64 8, i1 true)
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 true)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- ret void
-}
-
-; PR8728
-; Do not delete instruction where possible situation is:
-; A = B
-; A = A
-;
-; NB! See PR11763 - currently LLVM allows memcpy's source and destination to be
-; equal (but not inequal and overlapping).
-define void @test18(i8* %P, i8* %Q, i8* %R) nounwind ssp {
-; CHECK-LABEL: @test18(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P]], i8* [[R:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
- ret void
-}
-
-define void @test18_atomic(i8* %P, i8* %Q, i8* %R) nounwind ssp {
-; CHECK-LABEL: @test18_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P]], i8* align 1 [[R:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %R, i64 12, i32 1)
- ret void
-}
-
-
-; The store here is not dead because the byval call reads it.
-declare void @test19f({i32}* byval({i32}) align 4 %P)
-
-define void @test19({i32} * nocapture byval({i32}) align 4 %arg5) nounwind ssp {
-; CHECK-LABEL: @test19(
-; CHECK-NEXT: bb:
-; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds { i32 }, { i32 }* [[ARG5:%.*]], i32 0, i32 0
-; CHECK-NEXT: store i32 912, i32* [[TMP7]], align 4
-; CHECK-NEXT: call void @test19f({ i32 }* byval({ i32 }) align 4 [[ARG5]])
-; CHECK-NEXT: ret void
-;
-bb:
- %tmp7 = getelementptr inbounds {i32}, {i32}* %arg5, i32 0, i32 0
- store i32 912, i32* %tmp7
- call void @test19f({i32}* byval({i32}) align 4 %arg5)
- ret void
-
-}
-
-define void @test20() {
-; CHECK-LABEL: @test20(
-; CHECK-NEXT: ret void
-;
- %m = call i8* @malloc(i32 24)
- store i8 0, i8* %m
- ret void
-}
-
-define void @test21() {
-; CHECK-LABEL: @test21(
-; CHECK-NEXT: ret void
-;
- %m = call i8* @calloc(i32 9, i32 7)
- store i8 0, i8* %m
- ret void
-}
-
-define void @test22(i1 %i, i32 %k, i32 %m) nounwind {
-; CHECK-LABEL: @test22(
-; CHECK-NEXT: ret void
-;
- %k.addr = alloca i32
- %m.addr = alloca i32
- %k.addr.m.addr = select i1 %i, i32* %k.addr, i32* %m.addr
- store i32 0, i32* %k.addr.m.addr, align 4
- ret void
-}
-
-; PR13547
-declare noalias i8* @strdup(i8* nocapture) nounwind
-define noalias i8* @test23() nounwind uwtable ssp {
-; CHECK-LABEL: @test23(
-; CHECK-NEXT: [[X:%.*]] = alloca [2 x i8], align 1
-; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i8], [2 x i8]* [[X]], i64 0, i64 0
-; CHECK-NEXT: store i8 97, i8* [[ARRAYIDX]], align 1
-; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [2 x i8], [2 x i8]* [[X]], i64 0, i64 1
-; CHECK-NEXT: store i8 0, i8* [[ARRAYIDX1]], align 1
-; CHECK-NEXT: [[CALL:%.*]] = call i8* @strdup(i8* [[ARRAYIDX]]) [[ATTR5:#.*]]
-; CHECK-NEXT: ret i8* [[CALL]]
-;
- %x = alloca [2 x i8], align 1
- %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %x, i64 0, i64 0
- store i8 97, i8* %arrayidx, align 1
- %arrayidx1 = getelementptr inbounds [2 x i8], [2 x i8]* %x, i64 0, i64 1
- store i8 0, i8* %arrayidx1, align 1
- %call = call i8* @strdup(i8* %arrayidx) nounwind
- ret i8* %call
-}
-
-; Make sure same sized store to later element is deleted
-define void @test24([2 x i32]* %a, i32 %b, i32 %c) nounwind {
-; CHECK-LABEL: @test24(
-; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[A:%.*]], i64 0, i64 0
-; CHECK-NEXT: store i32 [[B:%.*]], i32* [[TMP1]], align 4
-; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[A]], i64 0, i64 1
-; CHECK-NEXT: store i32 [[C:%.*]], i32* [[TMP2]], align 4
-; CHECK-NEXT: ret void
-;
- %1 = getelementptr inbounds [2 x i32], [2 x i32]* %a, i64 0, i64 0
- store i32 0, i32* %1, align 4
- %2 = getelementptr inbounds [2 x i32], [2 x i32]* %a, i64 0, i64 1
- store i32 0, i32* %2, align 4
- %3 = getelementptr inbounds [2 x i32], [2 x i32]* %a, i64 0, i64 0
- store i32 %b, i32* %3, align 4
- %4 = getelementptr inbounds [2 x i32], [2 x i32]* %a, i64 0, i64 1
- store i32 %c, i32* %4, align 4
- ret void
-}
-
-; Check another case like PR13547 where strdup is not like malloc.
-define i8* @test25(i8* %p) nounwind {
-; CHECK-LABEL: @test25(
-; CHECK-NEXT: [[P_4:%.*]] = getelementptr i8, i8* [[P:%.*]], i64 4
-; CHECK-NEXT: [[TMP:%.*]] = load i8, i8* [[P_4]], align 1
-; CHECK-NEXT: store i8 0, i8* [[P_4]], align 1
-; CHECK-NEXT: [[Q:%.*]] = call i8* @strdup(i8* [[P]]) [[ATTR8:#.*]]
-; CHECK-NEXT: store i8 [[TMP]], i8* [[P_4]], align 1
-; CHECK-NEXT: ret i8* [[Q]]
-;
- %p.4 = getelementptr i8, i8* %p, i64 4
- %tmp = load i8, i8* %p.4, align 1
- store i8 0, i8* %p.4, align 1
- %q = call i8* @strdup(i8* %p) nounwind optsize
- store i8 %tmp, i8* %p.4, align 1
- ret i8* %q
-}
-
-; Remove redundant store if loaded value is in another block.
-define i32 @test26(i1 %c, i32* %p) {
-; CHECK-LABEL: @test26(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB3:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: br label [[BB3]]
-; CHECK: bb3:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br i1 %c, label %bb1, label %bb2
-bb1:
- br label %bb3
-bb2:
- store i32 %v, i32* %p, align 4
- br label %bb3
-bb3:
- ret i32 0
-}
-
-; Remove redundant store if loaded value is in another block.
-define i32 @test27(i1 %c, i32* %p) {
-; CHECK-LABEL: @test27(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB3:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: br label [[BB3]]
-; CHECK: bb3:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br i1 %c, label %bb1, label %bb2
-bb1:
- br label %bb3
-bb2:
- br label %bb3
-bb3:
- store i32 %v, i32* %p, align 4
- ret i32 0
-}
-
-; Don't remove redundant store because of may-aliased store.
-define i32 @test28(i1 %c, i32* %p, i32* %p2, i32 %i) {
-; CHECK-LABEL: @test28(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[P:%.*]], align 4
-; CHECK-NEXT: store i32 [[I:%.*]], i32* [[P2:%.*]], align 4
-; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB3:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: br label [[BB3]]
-; CHECK: bb3:
-; CHECK-NEXT: store i32 [[V]], i32* [[P]], align 4
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
-
- ; Might overwrite value at %p
- store i32 %i, i32* %p2, align 4
- br i1 %c, label %bb1, label %bb2
-bb1:
- br label %bb3
-bb2:
- br label %bb3
-bb3:
- store i32 %v, i32* %p, align 4
- ret i32 0
-}
-
-; Don't remove redundant store because of may-aliased store.
-define i32 @test29(i1 %c, i32* %p, i32* %p2, i32 %i) {
-; CHECK-LABEL: @test29(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[P:%.*]], align 4
-; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB3:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: store i32 [[I:%.*]], i32* [[P2:%.*]], align 4
-; CHECK-NEXT: br label [[BB3]]
-; CHECK: bb3:
-; CHECK-NEXT: store i32 [[V]], i32* [[P]], align 4
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br i1 %c, label %bb1, label %bb2
-bb1:
- br label %bb3
-bb2:
- ; Might overwrite value at %p
- store i32 %i, i32* %p2, align 4
- br label %bb3
-bb3:
- store i32 %v, i32* %p, align 4
- ret i32 0
-}
-
-declare void @unknown_func()
-
-; Don't remove redundant store because of unknown call.
-define i32 @test30(i1 %c, i32* %p, i32 %i) {
-; CHECK-LABEL: @test30(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[P:%.*]], align 4
-; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB3:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: call void @unknown_func()
-; CHECK-NEXT: br label [[BB3]]
-; CHECK: bb3:
-; CHECK-NEXT: store i32 [[V]], i32* [[P]], align 4
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br i1 %c, label %bb1, label %bb2
-bb1:
- br label %bb3
-bb2:
- ; Might overwrite value at %p
- call void @unknown_func()
- br label %bb3
-bb3:
- store i32 %v, i32* %p, align 4
- ret i32 0
-}
-
-; Remove redundant store if loaded value is in another block inside a loop.
-define i32 @test31(i1 %c, i32* %p, i32 %i) {
-; CHECK-LABEL: @test31(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: br label [[BB1:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br i1 undef, label [[BB1]], label [[BB2:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br label %bb1
-bb1:
- store i32 %v, i32* %p, align 4
- br i1 undef, label %bb1, label %bb2
-bb2:
- ret i32 0
-}
-
-; Don't remove redundant store in a loop with a may-alias store.
-define i32 @test32(i1 %c, i32* %p, i32 %i) {
-; CHECK-LABEL: @test32(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[P:%.*]], align 4
-; CHECK-NEXT: br label [[BB1:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: store i32 [[V]], i32* [[P]], align 4
-; CHECK-NEXT: call void @unknown_func()
-; CHECK-NEXT: br i1 undef, label [[BB1]], label [[BB2:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %v = load i32, i32* %p, align 4
- br label %bb1
-bb1:
- store i32 %v, i32* %p, align 4
- ; Might read and overwrite value at %p
- call void @unknown_func()
- br i1 undef, label %bb1, label %bb2
-bb2:
- ret i32 0
-}
-
-; Remove redundant store, which is in the lame loop as the load.
-define i32 @test33(i1 %c, i32* %p, i32 %i) {
-; CHECK-LABEL: @test33(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: br label [[BB1:%.*]]
-; CHECK: bb1:
-; CHECK-NEXT: br label [[BB2:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: call void @unknown_func()
-; CHECK-NEXT: br i1 undef, label [[BB1]], label [[BB3:%.*]]
-; CHECK: bb3:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- br label %bb1
-bb1:
- %v = load i32, i32* %p, align 4
- br label %bb2
-bb2:
- store i32 %v, i32* %p, align 4
- ; Might read and overwrite value at %p, but doesn't matter.
- call void @unknown_func()
- br i1 undef, label %bb1, label %bb3
-bb3:
- ret i32 0
-}
-
-; Don't remove redundant store: unknown_func could unwind
-define void @test34(i32* noalias %p) {
-; CHECK-LABEL: @test34(
-; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4
-; CHECK-NEXT: call void @unknown_func()
-; CHECK-NEXT: store i32 0, i32* [[P]], align 4
-; CHECK-NEXT: ret void
-;
- store i32 1, i32* %p
- call void @unknown_func()
- store i32 0, i32* %p
- ret void
-}
-
-; Remove redundant store even with an unwinding function in the same block
-define void @test35(i32* noalias %p) {
-; CHECK-LABEL: @test35(
-; CHECK-NEXT: call void @unknown_func()
-; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4
-; CHECK-NEXT: ret void
-;
- call void @unknown_func()
- store i32 1, i32* %p
- store i32 0, i32* %p
- ret void
-}
-
-; We cannot optimize away the first memmove since %P could overlap with %Q.
-define void @test36(i8* %P, i8* %Q) {
-; CHECK-LABEL: @test36(
-; CHECK-NEXT: tail call void @llvm.memmove.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: tail call void @llvm.memmove.p0i8.p0i8.i64(i8* [[P]], i8* [[Q]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- ret void
-}
-
-define void @test36_atomic(i8* %P, i8* %Q) {
-; CHECK-LABEL: @test36_atomic(
-; CHECK-NEXT: tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P]], i8* align 1 [[Q]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- ret void
-}
-
-define void @test37(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test37(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: tail call void @llvm.memmove.p0i8.p0i8.i64(i8* [[P]], i8* [[R:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
- ret void
-}
-
-define void @test37_atomic(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test37_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P]], i8* align 1 [[R:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %R, i64 12, i32 1)
- ret void
-}
-
-; Same caveat about memcpy as in @test18 applies here.
-define void @test38(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test38(
-; CHECK-NEXT: tail call void @llvm.memmove.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P]], i8* [[R:%.*]], i64 12, i1 false)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
- ret void
-}
-
-define void @test38_atomic(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test38_atomic(
-; CHECK-NEXT: tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P]], i8* align 1 [[R:%.*]], i64 12, i32 1)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %R, i64 12, i32 1)
- ret void
-}
-
-define void @test39(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test39(
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P:%.*]], i8* [[Q:%.*]], i64 12, i1 false)
-; CHECK-NEXT: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[P]], i8* [[R:%.*]], i64 8, i1 false)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
- tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 8, i1 false)
- ret void
-}
-
-define void @test39_atomic(i8* %P, i8* %Q, i8* %R) {
-; CHECK-LABEL: @test39_atomic(
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P:%.*]], i8* align 1 [[Q:%.*]], i64 12, i32 1)
-; CHECK-NEXT: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 [[P]], i8* align 1 [[R:%.*]], i64 8, i32 1)
-; CHECK-NEXT: ret void
-;
-
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
- tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %R, i64 8, i32 1)
- ret void
-}
-
-define i32 @test40() {
-; CHECK-LABEL: @test40(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br label [[LOOP:%.*]]
-; CHECK: loop:
-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
-; CHECK-NEXT: [[P_NEXT:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV_NEXT]]
-; CHECK-NEXT: store i8 1, i8* [[P_NEXT]], align 1
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ugt i64 [[INDVARS_IV]], 15
-; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br label %loop
-loop:
- %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
- %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
- %p.next = getelementptr inbounds i8, i8* %m, i64 %indvars.iv.next
- store i8 1, i8* %p.next
- %p = getelementptr inbounds i8, i8* %m, i64 %indvars.iv
- store i8 0, i8* %p
- %continue = icmp ugt i64 %indvars.iv, 15
- br i1 %continue, label %loop, label %return
-return:
- ret i32 0
-}
-
-define i32 @test41() {
-; CHECK-LABEL: @test41(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br label [[LOOP:%.*]]
-; CHECK: loop:
-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[CONT:%.*]] ]
-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
-; CHECK-NEXT: [[P_NEXT:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV_NEXT]]
-; CHECK-NEXT: store i8 1, i8* [[P_NEXT]], align 1
-; CHECK-NEXT: br label [[CONT]]
-; CHECK: cont:
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ugt i64 [[INDVARS_IV]], 15
-; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br label %loop
-loop:
- %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %cont ]
- %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
- %p.next = getelementptr inbounds i8, i8* %m, i64 %indvars.iv.next
- store i8 1, i8* %p.next
- br label %cont
-
-cont:
- %p = getelementptr inbounds i8, i8* %m, i64 %indvars.iv
- store i8 0, i8* %p
- %continue = icmp ugt i64 %indvars.iv, 15
- br i1 %continue, label %loop, label %return
-
-return:
- ret i32 0
-}
-
-; The store is redundant here, but currently we fail to eliminate it.
-; We are walking from the store up to the calloc and translate phis as
-; needed. In this case we fail to translate %p while going over the
-; backedge. Because of that we conservatively assume that zero initialized
-; memory is clobbered.
-define i32 @test42() {
-; CHECK-LABEL: @test42(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br label [[LOOP:%.*]]
-; CHECK: loop:
-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[CONT:%.*]] ]
-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
-; CHECK-NEXT: br label [[CONT]]
-; CHECK: cont:
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ugt i64 [[INDVARS_IV]], 15
-; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br label %loop
-loop:
- %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %cont ]
- %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
- br label %cont
-
-cont:
- %p = getelementptr inbounds i8, i8* %m, i64 %indvars.iv
- store i8 0, i8* %p
- %continue = icmp ugt i64 %indvars.iv, 15
- br i1 %continue, label %loop, label %return
-
-return:
- ret i32 0
-}
-
-define i32 @test43() {
-; CHECK-LABEL: @test43(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br label [[LOOP:%.*]]
-; CHECK: loop:
-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[CONT_2:%.*]] ]
-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
-; CHECK-NEXT: [[P_NEXT:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV_NEXT]]
-; CHECK-NEXT: store i8 1, i8* [[P_NEXT]], align 1
-; CHECK-NEXT: br label [[CONT:%.*]]
-; CHECK: cont:
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: br label [[CONT_2]]
-; CHECK: cont.2:
-; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ugt i64 [[INDVARS_IV]], 15
-; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br label %loop
-loop:
- %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %cont.2 ]
- %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
- %p.next = getelementptr inbounds i8, i8* %m, i64 %indvars.iv.next
- store i8 1, i8* %p.next
- br label %cont
-
-cont:
- %p = getelementptr inbounds i8, i8* %m, i64 %indvars.iv
- store i8 0, i8* %p
- br label %cont.2
-
-cont.2:
- %continue = icmp ugt i64 %indvars.iv, 15
- br i1 %continue, label %loop, label %return
-
-return:
- ret i32 0
-}
-
-define i32 @test44() {
-; CHECK-LABEL: @test44(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br label [[LOOP:%.*]]
-; CHECK: loop:
-; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[CONT_2:%.*]] ]
-; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
-; CHECK-NEXT: [[P_NEXT:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV_NEXT]]
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[INDVARS_IV]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: br label [[CONT:%.*]]
-; CHECK: cont:
-; CHECK-NEXT: store i8 1, i8* [[P_NEXT]], align 1
-; CHECK-NEXT: br label [[CONT_2]]
-; CHECK: cont.2:
-; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ugt i64 [[INDVARS_IV]], 15
-; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br label %loop
-loop:
- %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %cont.2 ]
- %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
- %p.next = getelementptr inbounds i8, i8* %m, i64 %indvars.iv.next
- %p = getelementptr inbounds i8, i8* %m, i64 %indvars.iv
- store i8 0, i8* %p
- br label %cont
-
-cont:
- store i8 1, i8* %p.next
- br label %cont.2
-
-cont.2:
- %continue = icmp ugt i64 %indvars.iv, 15
- br i1 %continue, label %loop, label %return
-
-return:
- ret i32 0
-}
-
-; This is an example which can potentially benefit from PHI translation.
-; Current implementation doesn't handle this case though. This is because
-; we don't visit the same block with
diff erent addresses while looking for
-; clobbering instructions.
-define i32 @test45(i1 %c) {
-; CHECK-LABEL: @test45(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
-; CHECK: true:
-; CHECK-NEXT: [[P_1:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 1
-; CHECK-NEXT: store i8 1, i8* [[P_1]], align 1
-; CHECK-NEXT: br label [[CONT:%.*]]
-; CHECK: false:
-; CHECK-NEXT: [[P_2:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 2
-; CHECK-NEXT: store i8 1, i8* [[P_2]], align 1
-; CHECK-NEXT: br label [[CONT]]
-; CHECK: cont:
-; CHECK-NEXT: [[OFFSET:%.*]] = phi i64 [ 2, [[TRUE]] ], [ 1, [[FALSE]] ]
-; CHECK-NEXT: [[P:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 [[OFFSET]]
-; CHECK-NEXT: store i8 0, i8* [[P]], align 1
-; CHECK-NEXT: br label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- br i1 %c, label %true, label %false
-
-true:
- %p.1 = getelementptr inbounds i8, i8* %m, i64 1
- store i8 1, i8* %p.1
- br label %cont
-
-false:
- %p.2 = getelementptr inbounds i8, i8* %m, i64 2
- store i8 1, i8* %p.2
- br label %cont
-
-cont:
- %offset = phi i64 [ 2, %true ], [ 1, %false ]
- %p = getelementptr inbounds i8, i8* %m, i64 %offset
- store i8 0, i8* %p
- br label %return
-
-return:
- ret i32 0
-}
-
-; This is test45 modified in a way to demonstrate PHI translation
-; improving the accuracy of the analysis (on a slightly convoluted
-; case though).
-define i32 @test46(i1 %c) {
-; CHECK-LABEL: @test46(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[M:%.*]] = call i8* @calloc(i32 9, i32 20)
-; CHECK-NEXT: [[P_1:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 1
-; CHECK-NEXT: [[P_2:%.*]] = getelementptr inbounds i8, i8* [[M]], i64 2
-; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
-; CHECK: true:
-; CHECK-NEXT: store i8 1, i8* [[P_1]], align 1
-; CHECK-NEXT: br label [[CONT:%.*]]
-; CHECK: false:
-; CHECK-NEXT: store i8 1, i8* [[P_1]], align 1
-; CHECK-NEXT: br label [[CONT]]
-; CHECK: cont:
-; CHECK-NEXT: br label [[RETURN:%.*]]
-; CHECK: return:
-; CHECK-NEXT: ret i32 0
-;
-entry:
- %m = call i8* @calloc(i32 9, i32 20)
- %p.1 = getelementptr inbounds i8, i8* %m, i64 1
- %p.2 = getelementptr inbounds i8, i8* %m, i64 2
- br i1 %c, label %true, label %false
-
-true:
- store i8 1, i8* %p.1
- br label %cont
-
-false:
- store i8 1, i8* %p.1
- br label %cont
-
-cont:
- %offset = phi i64 [ 2, %true ], [ 2, %false ]
- %p = getelementptr inbounds i8, i8* %m, i64 %offset
- store i8 0, i8* %p
- br label %return
-
-return:
- ret i32 0
-}
-
-declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1)
-declare void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32)
diff --git a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/tail-byval.ll b/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/tail-byval.ll
deleted file mode 100644
index 698f49a49b4b..000000000000
--- a/llvm/test/Transforms/DeadStoreElimination/MemDepAnalysis/tail-byval.ll
+++ /dev/null
@@ -1,23 +0,0 @@
-; RUN: opt -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-
-; Don't eliminate stores to allocas before tail calls to functions that use
-; byval. It's correct to mark calls like these as 'tail'. To implement this tail
-; call, the backend should copy the bytes from the alloca into the argument area
-; before clearing the stack.
-
-target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
-target triple = "i386-unknown-linux-gnu"
-
-declare void @g(i32* byval(i32) %p)
-
-define void @f(i32* byval(i32) %x) {
-entry:
- %p = alloca i32
- %v = load i32, i32* %x
- store i32 %v, i32* %p
- tail call void @g(i32* byval(i32) %p)
- ret void
-}
-; CHECK-LABEL: define void @f(i32* byval(i32) %x)
-; CHECK: store i32 %v, i32* %p
-; CHECK: tail call void @g(i32* byval(i32) %p)
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreBegin.ll b/llvm/test/Transforms/DeadStoreElimination/OverwriteStoreBegin.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreBegin.ll
rename to llvm/test/Transforms/DeadStoreElimination/OverwriteStoreBegin.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreEnd.ll b/llvm/test/Transforms/DeadStoreElimination/OverwriteStoreEnd.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/OverwriteStoreEnd.ll
rename to llvm/test/Transforms/DeadStoreElimination/OverwriteStoreEnd.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore.ll b/llvm/test/Transforms/DeadStoreElimination/PartialStore.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore.ll
rename to llvm/test/Transforms/DeadStoreElimination/PartialStore.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore2.ll b/llvm/test/Transforms/DeadStoreElimination/PartialStore2.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/PartialStore2.ll
rename to llvm/test/Transforms/DeadStoreElimination/PartialStore2.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/X86/gather-null-pointer.ll b/llvm/test/Transforms/DeadStoreElimination/X86/gather-null-pointer.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/X86/gather-null-pointer.ll
rename to llvm/test/Transforms/DeadStoreElimination/X86/gather-null-pointer.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-overlapping.ll b/llvm/test/Transforms/DeadStoreElimination/atomic-overlapping.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-overlapping.ll
rename to llvm/test/Transforms/DeadStoreElimination/atomic-overlapping.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-todo.ll b/llvm/test/Transforms/DeadStoreElimination/atomic-todo.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/atomic-todo.ll
rename to llvm/test/Transforms/DeadStoreElimination/atomic-todo.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/atomic.ll b/llvm/test/Transforms/DeadStoreElimination/atomic.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/atomic.ll
rename to llvm/test/Transforms/DeadStoreElimination/atomic.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/calloc-store.ll b/llvm/test/Transforms/DeadStoreElimination/calloc-store.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/calloc-store.ll
rename to llvm/test/Transforms/DeadStoreElimination/calloc-store.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/combined-partial-overwrites.ll b/llvm/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/combined-partial-overwrites.ll
rename to llvm/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/const-pointers.ll b/llvm/test/Transforms/DeadStoreElimination/const-pointers.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/const-pointers.ll
rename to llvm/test/Transforms/DeadStoreElimination/const-pointers.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/crash.ll b/llvm/test/Transforms/DeadStoreElimination/crash.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/crash.ll
rename to llvm/test/Transforms/DeadStoreElimination/crash.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/cs-cs-aliasing.ll b/llvm/test/Transforms/DeadStoreElimination/cs-cs-aliasing.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/cs-cs-aliasing.ll
rename to llvm/test/Transforms/DeadStoreElimination/cs-cs-aliasing.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/debug-counter.ll b/llvm/test/Transforms/DeadStoreElimination/debug-counter.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/debug-counter.ll
rename to llvm/test/Transforms/DeadStoreElimination/debug-counter.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/debuginfo.ll b/llvm/test/Transforms/DeadStoreElimination/debuginfo.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/debuginfo.ll
rename to llvm/test/Transforms/DeadStoreElimination/debuginfo.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/dominate.ll b/llvm/test/Transforms/DeadStoreElimination/dominate.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/dominate.ll
rename to llvm/test/Transforms/DeadStoreElimination/dominate.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/fence-todo.ll b/llvm/test/Transforms/DeadStoreElimination/fence-todo.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/fence-todo.ll
rename to llvm/test/Transforms/DeadStoreElimination/fence-todo.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/fence.ll b/llvm/test/Transforms/DeadStoreElimination/fence.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/fence.ll
rename to llvm/test/Transforms/DeadStoreElimination/fence.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/free.ll b/llvm/test/Transforms/DeadStoreElimination/free.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/free.ll
rename to llvm/test/Transforms/DeadStoreElimination/free.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/inst-limits.ll b/llvm/test/Transforms/DeadStoreElimination/inst-limits.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/inst-limits.ll
rename to llvm/test/Transforms/DeadStoreElimination/inst-limits.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/int_sideeffect.ll b/llvm/test/Transforms/DeadStoreElimination/int_sideeffect.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/int_sideeffect.ll
rename to llvm/test/Transforms/DeadStoreElimination/int_sideeffect.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/invariant.start.ll b/llvm/test/Transforms/DeadStoreElimination/invariant.start.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/invariant.start.ll
rename to llvm/test/Transforms/DeadStoreElimination/invariant.start.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/launder.invariant.group.ll b/llvm/test/Transforms/DeadStoreElimination/launder.invariant.group.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/launder.invariant.group.ll
rename to llvm/test/Transforms/DeadStoreElimination/launder.invariant.group.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll
rename to llvm/test/Transforms/DeadStoreElimination/libcalls.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/lifetime.ll b/llvm/test/Transforms/DeadStoreElimination/lifetime.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/lifetime.ll
rename to llvm/test/Transforms/DeadStoreElimination/lifetime.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll b/llvm/test/Transforms/DeadStoreElimination/loop-invariant-entry-block.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/loop-invariant-entry-block.ll
rename to llvm/test/Transforms/DeadStoreElimination/loop-invariant-entry-block.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/masked-dead-store-inseltpoison.ll b/llvm/test/Transforms/DeadStoreElimination/masked-dead-store-inseltpoison.ll
index 4f3592523d05..b72e51a29d55 100644
--- a/llvm/test/Transforms/DeadStoreElimination/masked-dead-store-inseltpoison.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/masked-dead-store-inseltpoison.ll
@@ -1,6 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -tbaa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-; RUN: opt -tbaa -dse -enable-dse-memoryssa=true -S < %s | FileCheck %s
+; RUN: opt -tbaa -dse -S < %s | FileCheck %s
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
define dllexport i32 @f0(i8** %a0, i8** %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) #0 {
diff --git a/llvm/test/Transforms/DeadStoreElimination/masked-dead-store.ll b/llvm/test/Transforms/DeadStoreElimination/masked-dead-store.ll
index 85673e9fe543..4fea8db99949 100644
--- a/llvm/test/Transforms/DeadStoreElimination/masked-dead-store.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/masked-dead-store.ll
@@ -1,6 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -tbaa -dse -enable-dse-memoryssa=false -S < %s | FileCheck %s
-; RUN: opt -tbaa -dse -enable-dse-memoryssa=true -S < %s | FileCheck %s
+; RUN: opt -tbaa -dse -S < %s | FileCheck %s
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
define dllexport i32 @f0(i8** %a0, i8** %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) #0 {
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/mda-with-dbg-values.ll b/llvm/test/Transforms/DeadStoreElimination/mda-with-dbg-values.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/mda-with-dbg-values.ll
rename to llvm/test/Transforms/DeadStoreElimination/mda-with-dbg-values.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-complete-overwrite.ll b/llvm/test/Transforms/DeadStoreElimination/memcpy-complete-overwrite.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-complete-overwrite.ll
rename to llvm/test/Transforms/DeadStoreElimination/memcpy-complete-overwrite.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-lifetimes.ll b/llvm/test/Transforms/DeadStoreElimination/memcpy-lifetimes.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memcpy-lifetimes.ll
rename to llvm/test/Transforms/DeadStoreElimination/memcpy-lifetimes.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memintrinsics.ll b/llvm/test/Transforms/DeadStoreElimination/memintrinsics.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memintrinsics.ll
rename to llvm/test/Transforms/DeadStoreElimination/memintrinsics.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll b/llvm/test/Transforms/DeadStoreElimination/memoryssa-scan-limit.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memoryssa-scan-limit.ll
rename to llvm/test/Transforms/DeadStoreElimination/memoryssa-scan-limit.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memset-and-memcpy.ll b/llvm/test/Transforms/DeadStoreElimination/memset-and-memcpy.ll
similarity index 98%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memset-and-memcpy.ll
rename to llvm/test/Transforms/DeadStoreElimination/memset-and-memcpy.ll
index bb4a17f4cfcd..266f686905a2 100644
--- a/llvm/test/Transforms/DeadStoreElimination/MSSA/memset-and-memcpy.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/memset-and-memcpy.ll
@@ -1,6 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -basic-aa -dse -S | FileCheck %s
-; RUN: opt < %s -basic-aa -dse -enable-dse-memoryssa=false -S | FileCheck %s
; RUN: opt < %s -aa-pipeline=basic-aa -passes=dse -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memset-missing-debugloc.ll b/llvm/test/Transforms/DeadStoreElimination/memset-missing-debugloc.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memset-missing-debugloc.ll
rename to llvm/test/Transforms/DeadStoreElimination/memset-missing-debugloc.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/memset-unknown-sizes.ll b/llvm/test/Transforms/DeadStoreElimination/memset-unknown-sizes.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/memset-unknown-sizes.ll
rename to llvm/test/Transforms/DeadStoreElimination/memset-unknown-sizes.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores-big-endian.ll b/llvm/test/Transforms/DeadStoreElimination/merge-stores-big-endian.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores-big-endian.ll
rename to llvm/test/Transforms/DeadStoreElimination/merge-stores-big-endian.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores.ll b/llvm/test/Transforms/DeadStoreElimination/merge-stores.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/merge-stores.ll
rename to llvm/test/Transforms/DeadStoreElimination/merge-stores.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-captures.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-captures.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-captures.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-captures.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-exceptions.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-exceptions.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-exceptions.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-exceptions.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loop-carried-dependence.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-loop-carried-dependence.ll
similarity index 99%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loop-carried-dependence.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-loop-carried-dependence.ll
index b7a882a65bc1..5f20841b6cff 100644
--- a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loop-carried-dependence.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/multiblock-loop-carried-dependence.ll
@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -dse -enable-dse-memoryssa -S %s | FileCheck %s
+; RUN: opt -dse -S %s | FileCheck %s
target datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512"
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-loops.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-malloc-free.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-malloc-free.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-malloc-free.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memintrinsics.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-memintrinsics.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memintrinsics.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-memintrinsics.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memoryphis.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-memoryphis.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-memoryphis.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-memoryphis.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath-throwing.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-multipath-throwing.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath-throwing.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-multipath-throwing.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-multipath.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-multipath.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-multipath.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-overlap.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-overlap.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-partial.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-partial.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-partial.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-partial.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-simple.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-simple.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-simple.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-simple.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-throwing.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-throwing.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-throwing.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-throwing.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll b/llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-unreachable.ll
rename to llvm/test/Transforms/DeadStoreElimination/multiblock-unreachable.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/no-targetdata.ll b/llvm/test/Transforms/DeadStoreElimination/no-targetdata.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/no-targetdata.ll
rename to llvm/test/Transforms/DeadStoreElimination/no-targetdata.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll b/llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/noop-stores.ll
rename to llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/operand-bundles.ll b/llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/operand-bundles.ll
rename to llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/out-of-bounds-stores.ll b/llvm/test/Transforms/DeadStoreElimination/out-of-bounds-stores.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/out-of-bounds-stores.ll
rename to llvm/test/Transforms/DeadStoreElimination/out-of-bounds-stores.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/overlap.ll b/llvm/test/Transforms/DeadStoreElimination/overlap.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/overlap.ll
rename to llvm/test/Transforms/DeadStoreElimination/overlap.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/pr11390.ll b/llvm/test/Transforms/DeadStoreElimination/pr11390.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/pr11390.ll
rename to llvm/test/Transforms/DeadStoreElimination/pr11390.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/pr47285-not-overwritten-on-all-exit-paths.ll b/llvm/test/Transforms/DeadStoreElimination/pr47285-not-overwritten-on-all-exit-paths.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/pr47285-not-overwritten-on-all-exit-paths.ll
rename to llvm/test/Transforms/DeadStoreElimination/pr47285-not-overwritten-on-all-exit-paths.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/read-clobber-after-overwrite.ll b/llvm/test/Transforms/DeadStoreElimination/read-clobber-after-overwrite.ll
similarity index 97%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/read-clobber-after-overwrite.ll
rename to llvm/test/Transforms/DeadStoreElimination/read-clobber-after-overwrite.ll
index 4f704c35a90b..43dcdaa7047b 100644
--- a/llvm/test/Transforms/DeadStoreElimination/MSSA/read-clobber-after-overwrite.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/read-clobber-after-overwrite.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -dse -enable-dse-memoryssa -S %s | FileCheck %s
+; RUN: opt -dse -S %s | FileCheck %s
declare i1 @cond() readnone
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/scoped-noalias.ll b/llvm/test/Transforms/DeadStoreElimination/scoped-noalias.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/scoped-noalias.ll
rename to llvm/test/Transforms/DeadStoreElimination/scoped-noalias.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/simple-preservation.ll b/llvm/test/Transforms/DeadStoreElimination/simple-preservation.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/simple-preservation.ll
rename to llvm/test/Transforms/DeadStoreElimination/simple-preservation.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/simple.ll b/llvm/test/Transforms/DeadStoreElimination/simple.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/simple.ll
rename to llvm/test/Transforms/DeadStoreElimination/simple.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/stats.ll b/llvm/test/Transforms/DeadStoreElimination/stats.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/stats.ll
rename to llvm/test/Transforms/DeadStoreElimination/stats.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/stores-of-existing-values.ll b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/stores-of-existing-values.ll
rename to llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/tail-byval.ll b/llvm/test/Transforms/DeadStoreElimination/tail-byval.ll
similarity index 100%
rename from llvm/test/Transforms/DeadStoreElimination/MSSA/tail-byval.ll
rename to llvm/test/Transforms/DeadStoreElimination/tail-byval.ll
More information about the llvm-commits
mailing list