[llvm] r358552 - Revert "Temporarily Revert "Add basic loop fusion pass.""

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 16 21:53:01 PDT 2019


Author: echristo
Date: Tue Apr 16 21:52:47 2019
New Revision: 358552

URL: http://llvm.org/viewvc/llvm-project?rev=358552&view=rev
Log:
Revert "Temporarily Revert "Add basic loop fusion pass.""

The reversion apparently deleted the test/Transforms directory.

Will be re-reverting again.

Added:
    llvm/trunk/include/llvm/Transforms/Scalar/LoopFuse.h
    llvm/trunk/lib/Transforms/Scalar/LoopFuse.cpp
    llvm/trunk/test/Transforms/
    llvm/trunk/test/Transforms/ADCE/
    llvm/trunk/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll
    llvm/trunk/test/Transforms/ADCE/2002-05-22-PHITest.ll
    llvm/trunk/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll
    llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll
    llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash.ll
    llvm/trunk/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll
    llvm/trunk/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll
    llvm/trunk/test/Transforms/ADCE/2002-07-29-Segfault.ll
    llvm/trunk/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll
    llvm/trunk/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll
    llvm/trunk/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll
    llvm/trunk/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll
    llvm/trunk/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll
    llvm/trunk/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll
    llvm/trunk/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll
    llvm/trunk/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll
    llvm/trunk/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll
    llvm/trunk/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
    llvm/trunk/test/Transforms/ADCE/2016-09-06.ll
    llvm/trunk/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll
    llvm/trunk/test/Transforms/ADCE/basictest.ll
    llvm/trunk/test/Transforms/ADCE/basictest1.ll
    llvm/trunk/test/Transforms/ADCE/basictest2.ll
    llvm/trunk/test/Transforms/ADCE/dce_pure_call.ll
    llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll
    llvm/trunk/test/Transforms/ADCE/debug-info-intrinsic.ll
    llvm/trunk/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll
    llvm/trunk/test/Transforms/ADCE/domtree-DoubleDeletion.ll
    llvm/trunk/test/Transforms/ADCE/unreachable-function.ll
    llvm/trunk/test/Transforms/ADCE/unreachable.ll
    llvm/trunk/test/Transforms/AddDiscriminators/
    llvm/trunk/test/Transforms/AddDiscriminators/basic.ll
    llvm/trunk/test/Transforms/AddDiscriminators/call-nested.ll
    llvm/trunk/test/Transforms/AddDiscriminators/call.ll
    llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll
    llvm/trunk/test/Transforms/AddDiscriminators/diamond.ll
    llvm/trunk/test/Transforms/AddDiscriminators/first-only.ll
    llvm/trunk/test/Transforms/AddDiscriminators/inlined.ll
    llvm/trunk/test/Transforms/AddDiscriminators/invoke.ll
    llvm/trunk/test/Transforms/AddDiscriminators/memcpy-discriminator.ll
    llvm/trunk/test/Transforms/AddDiscriminators/multiple.ll
    llvm/trunk/test/Transforms/AddDiscriminators/no-discriminators.ll
    llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll
    llvm/trunk/test/Transforms/AggressiveInstCombine/
    llvm/trunk/test/Transforms/AggressiveInstCombine/masked-cmp.ll
    llvm/trunk/test/Transforms/AggressiveInstCombine/rotate.ll
    llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_const_expr.ll
    llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_multi_uses.ll
    llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_unreachable_bb.ll
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll
    llvm/trunk/test/Transforms/AlignmentFromAssumptions/start-unk.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/
    llvm/trunk/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/X86/
    llvm/trunk/test/Transforms/ArgumentPromotion/X86/attributes.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/X86/lit.local.cfg
    llvm/trunk/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/aggregate-promote.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/attrs.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/basictest.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/byval-2.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/byval.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/chained.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/control-flow.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/control-flow2.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/dbg.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/fp80.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/inalloca.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/invalidation.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/musttail.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/naked_functions.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/pr27568.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/pr3085.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/pr32917.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/profile.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/reserve-tbaa.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/sret.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/tail.ll
    llvm/trunk/test/Transforms/ArgumentPromotion/variadic.ll
    llvm/trunk/test/Transforms/AtomicExpand/
    llvm/trunk/test/Transforms/AtomicExpand/AArch64/
    llvm/trunk/test/Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/
    llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fadd.ll
    llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fsub.ll
    llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-nand.ll
    llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/ARM/
    llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v7.ll
    llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v8.ll
    llvm/trunk/test/Transforms/AtomicExpand/ARM/atomicrmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/ARM/cmpxchg-weak.ll
    llvm/trunk/test/Transforms/AtomicExpand/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/Hexagon/
    llvm/trunk/test/Transforms/AtomicExpand/Hexagon/atomicrmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/Hexagon/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/Mips/
    llvm/trunk/test/Transforms/AtomicExpand/Mips/atomicrmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/Mips/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/RISCV/
    llvm/trunk/test/Transforms/AtomicExpand/RISCV/atomicrmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/RISCV/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/SPARC/
    llvm/trunk/test/Transforms/AtomicExpand/SPARC/libcalls.ll
    llvm/trunk/test/Transforms/AtomicExpand/SPARC/lit.local.cfg
    llvm/trunk/test/Transforms/AtomicExpand/SPARC/partword.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/
    llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-xchg-fp.ll
    llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg
    llvm/trunk/test/Transforms/BDCE/
    llvm/trunk/test/Transforms/BDCE/basic.ll
    llvm/trunk/test/Transforms/BDCE/dbg-multipleuses.ll
    llvm/trunk/test/Transforms/BDCE/dce-pure.ll
    llvm/trunk/test/Transforms/BDCE/dead-uses.ll
    llvm/trunk/test/Transforms/BDCE/dead-void-ro.ll
    llvm/trunk/test/Transforms/BDCE/invalidate-assumptions.ll
    llvm/trunk/test/Transforms/BDCE/order.ll
    llvm/trunk/test/Transforms/BDCE/pr26587.ll
    llvm/trunk/test/Transforms/BDCE/vectors.ll
    llvm/trunk/test/Transforms/BlockExtractor/
    llvm/trunk/test/Transforms/BlockExtractor/extract-blocks.ll
    llvm/trunk/test/Transforms/BlockExtractor/invalid-block.ll
    llvm/trunk/test/Transforms/BlockExtractor/invalid-function.ll
    llvm/trunk/test/Transforms/BranchFolding/
    llvm/trunk/test/Transforms/BranchFolding/2007-10-19-InlineAsmDirectives.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/lpad.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/musttail.ll
    llvm/trunk/test/Transforms/CallSiteSplitting/split-loop.ll
    llvm/trunk/test/Transforms/CalledValuePropagation/
    llvm/trunk/test/Transforms/CalledValuePropagation/simple-arguments.ll
    llvm/trunk/test/Transforms/CalledValuePropagation/simple-memory.ll
    llvm/trunk/test/Transforms/CalledValuePropagation/simple-select.ll
    llvm/trunk/test/Transforms/CanonicalizeAliases/
    llvm/trunk/test/Transforms/CanonicalizeAliases/canonicalize.ll
    llvm/trunk/test/Transforms/CodeExtractor/
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll
    llvm/trunk/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll
    llvm/trunk/test/Transforms/CodeExtractor/BlockAddressReference.ll
    llvm/trunk/test/Transforms/CodeExtractor/BlockAddressSelfReference.ll
    llvm/trunk/test/Transforms/CodeExtractor/ExtractedFnEntryCount.ll
    llvm/trunk/test/Transforms/CodeExtractor/MultipleExitBranchProb.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca2.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca4.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca5.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAnd.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAndOr.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAttributes.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineCallRef.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineDebug.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryPHICost.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryUpdate.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineHighCost.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineInvokeProducesOutVal.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineLiveAcross.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoInline.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoLiveOut.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNotViable.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineORECrash.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOptRemark.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOr.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOrAnd.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGOMultiRegion.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGORegion.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArg.ll
    llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArgsDebug.ll
    llvm/trunk/test/Transforms/CodeExtractor/SingleCondition.ll
    llvm/trunk/test/Transforms/CodeExtractor/X86/
    llvm/trunk/test/Transforms/CodeExtractor/X86/InheritTargetAttributes.ll
    llvm/trunk/test/Transforms/CodeExtractor/X86/lit.local.cfg
    llvm/trunk/test/Transforms/CodeExtractor/cost.ll
    llvm/trunk/test/Transforms/CodeExtractor/cost_meta.ll
    llvm/trunk/test/Transforms/CodeExtractor/extract-assume.ll
    llvm/trunk/test/Transforms/CodeExtractor/inline_eh.ll
    llvm/trunk/test/Transforms/CodeExtractor/inline_eh_1.ll
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink.ll
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink_gep.ll
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink_multiple.ll
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink_unsafe.ll
    llvm/trunk/test/Transforms/CodeExtractor/unreachable-block.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/
    llvm/trunk/test/Transforms/CodeGenPrepare/2008-11-24-RAUW-Self.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/free-zext.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/sink-free-instructions.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/trunc-weird-user.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AArch64/widen_switch.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AMDGPU/
    llvm/trunk/test/Transforms/CodeGenPrepare/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/AMDGPU/no-sink-addrspacecast.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/AMDGPU/sink-addrspacecast.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/bitreverse-recognize.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/large-offset-gep.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/memory-intrinsics.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/overflow-intrinsics.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/sink-addrmode.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/sink-free-instructions.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/splitgep.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/ARM/tailcall-dup.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/Mips/
    llvm/trunk/test/Transforms/CodeGenPrepare/Mips/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/Mips/pr35209.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/bypass-slow-div-constant-numerator.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/bypass-slow-div-not-exact.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/bypass-slow-div-special-cases.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/bypass-slow-div.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/dont-sink-nop-addrspacecast.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/catchpad-phi-cast.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/computedgoto.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/cttz-ctlz.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/ext-logicop.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/extend-sink-hoist.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/fcmp-sinking.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/lit.local.cfg
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/memset_chk-simplify-nobuiltin.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/multi-extension.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr27536.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/pr35658.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/select.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-base.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-select.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-two-phi.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrspacecast.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/widen_switch.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/X86/x86-shuffle-sink.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/basic.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/bitreverse-hang.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/builtin-condition.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/crash-on-large-allocas.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/dom-tree.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/gep-unmerging.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/invariant.group.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/nonintegral.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/section-samplepgo.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/section.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/sink-shift-and-trunc.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/skip-merging-case-block.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/split-indirect-loop.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/statepoint-relocate.ll
    llvm/trunk/test/Transforms/CodeGenPrepare/widenable-condition.ll
    llvm/trunk/test/Transforms/ConstProp/
    llvm/trunk/test/Transforms/ConstProp/2002-05-03-DivideByZeroException.ll
    llvm/trunk/test/Transforms/ConstProp/2002-05-03-NotOperator.ll
    llvm/trunk/test/Transforms/ConstProp/2002-09-03-SetCC-Bools.ll
    llvm/trunk/test/Transforms/ConstProp/2003-05-12-DivideError.ll
    llvm/trunk/test/Transforms/ConstProp/2005-01-28-SetCCGEP.ll
    llvm/trunk/test/Transforms/ConstProp/2006-11-30-vector-cast.ll
    llvm/trunk/test/Transforms/ConstProp/2006-12-01-TruncBoolBug.ll
    llvm/trunk/test/Transforms/ConstProp/2006-12-01-bool-casts.ll
    llvm/trunk/test/Transforms/ConstProp/2007-02-05-BitCast.ll
    llvm/trunk/test/Transforms/ConstProp/2007-02-23-sdiv.ll
    llvm/trunk/test/Transforms/ConstProp/2008-07-07-VectorCompare.ll
    llvm/trunk/test/Transforms/ConstProp/2009-06-20-constexpr-zero-lhs.ll
    llvm/trunk/test/Transforms/ConstProp/2009-09-01-GEP-Crash.ll
    llvm/trunk/test/Transforms/ConstProp/InsertElement.ll
    llvm/trunk/test/Transforms/ConstProp/avx512.ll
    llvm/trunk/test/Transforms/ConstProp/basictest.ll
    llvm/trunk/test/Transforms/ConstProp/bitcast.ll
    llvm/trunk/test/Transforms/ConstProp/bswap.ll
    llvm/trunk/test/Transforms/ConstProp/calls-math-finite.ll
    llvm/trunk/test/Transforms/ConstProp/calls.ll
    llvm/trunk/test/Transforms/ConstProp/cast.ll
    llvm/trunk/test/Transforms/ConstProp/constant-expr.ll
    llvm/trunk/test/Transforms/ConstProp/convert-from-fp16.ll
    llvm/trunk/test/Transforms/ConstProp/div-zero.ll
    llvm/trunk/test/Transforms/ConstProp/extractvalue.ll
    llvm/trunk/test/Transforms/ConstProp/float-to-ptr-cast.ll
    llvm/trunk/test/Transforms/ConstProp/insertvalue.ll
    llvm/trunk/test/Transforms/ConstProp/loads.ll
    llvm/trunk/test/Transforms/ConstProp/logicaltest.ll
    llvm/trunk/test/Transforms/ConstProp/overflow-ops.ll
    llvm/trunk/test/Transforms/ConstProp/phi.ll
    llvm/trunk/test/Transforms/ConstProp/remtest.ll
    llvm/trunk/test/Transforms/ConstProp/shift.ll
    llvm/trunk/test/Transforms/ConstProp/sse.ll
    llvm/trunk/test/Transforms/ConstProp/trunc_vec.ll
    llvm/trunk/test/Transforms/ConstantHoisting/
    llvm/trunk/test/Transforms/ConstantHoisting/AArch64/
    llvm/trunk/test/Transforms/ConstantHoisting/AArch64/const-addr.ll
    llvm/trunk/test/Transforms/ConstantHoisting/AArch64/const-hoist-gep.ll
    llvm/trunk/test/Transforms/ConstantHoisting/AArch64/large-immediate.ll
    llvm/trunk/test/Transforms/ConstantHoisting/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/bad-cases.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/const-addr-no-neg-offset.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/const-hoist-gep.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/gep-struct-index.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/insertvalue.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/is-legal-addressing-imm.ll
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/ConstantHoisting/ARM/same-offset-multi-types.ll
    llvm/trunk/test/Transforms/ConstantHoisting/PowerPC/
    llvm/trunk/test/Transforms/ConstantHoisting/PowerPC/const-base-addr.ll
    llvm/trunk/test/Transforms/ConstantHoisting/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/ConstantHoisting/PowerPC/masks.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/
    llvm/trunk/test/Transforms/ConstantHoisting/X86/bad-cases.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/cast-inst.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/const-base-addr.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/dbg-dominatingblock.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/dbg-samebasicblock.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/delete-dead-cast-inst.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/ehpad.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/large-immediate.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/lit.local.cfg
    llvm/trunk/test/Transforms/ConstantHoisting/X86/phi.ll
    llvm/trunk/test/Transforms/ConstantHoisting/X86/stackmap.ll
    llvm/trunk/test/Transforms/ConstantMerge/
    llvm/trunk/test/Transforms/ConstantMerge/2002-09-23-CPR-Update.ll
    llvm/trunk/test/Transforms/ConstantMerge/2003-10-28-MergeExternalConstants.ll
    llvm/trunk/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll
    llvm/trunk/test/Transforms/ConstantMerge/align.ll
    llvm/trunk/test/Transforms/ConstantMerge/dont-merge.ll
    llvm/trunk/test/Transforms/ConstantMerge/merge-both.ll
    llvm/trunk/test/Transforms/ConstantMerge/merge-dbg.ll
    llvm/trunk/test/Transforms/ConstantMerge/unnamed-addr.ll
    llvm/trunk/test/Transforms/Coroutines/
    llvm/trunk/test/Transforms/Coroutines/ArgAddr.ll
    llvm/trunk/test/Transforms/Coroutines/coro-catchswitch.ll
    llvm/trunk/test/Transforms/Coroutines/coro-cleanup.ll
    llvm/trunk/test/Transforms/Coroutines/coro-debug.ll
    llvm/trunk/test/Transforms/Coroutines/coro-early.ll
    llvm/trunk/test/Transforms/Coroutines/coro-eh-aware-edge-split.ll
    llvm/trunk/test/Transforms/Coroutines/coro-elide.ll
    llvm/trunk/test/Transforms/Coroutines/coro-frame-unreachable.ll
    llvm/trunk/test/Transforms/Coroutines/coro-frame.ll
    llvm/trunk/test/Transforms/Coroutines/coro-heap-elide.ll
    llvm/trunk/test/Transforms/Coroutines/coro-materialize.ll
    llvm/trunk/test/Transforms/Coroutines/coro-padding.ll
    llvm/trunk/test/Transforms/Coroutines/coro-spill-after-phi.ll
    llvm/trunk/test/Transforms/Coroutines/coro-spill-corobegin.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-00.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-01.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-02.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-alloc.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-dbg.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-eh.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-hidden.ll
    llvm/trunk/test/Transforms/Coroutines/coro-split-musttail.ll
    llvm/trunk/test/Transforms/Coroutines/ex0.ll
    llvm/trunk/test/Transforms/Coroutines/ex1.ll
    llvm/trunk/test/Transforms/Coroutines/ex2.ll
    llvm/trunk/test/Transforms/Coroutines/ex3.ll
    llvm/trunk/test/Transforms/Coroutines/ex4.ll
    llvm/trunk/test/Transforms/Coroutines/ex5.ll
    llvm/trunk/test/Transforms/Coroutines/no-suspend.ll
    llvm/trunk/test/Transforms/Coroutines/phi-coro-end.ll
    llvm/trunk/test/Transforms/Coroutines/restart-trigger.ll
    llvm/trunk/test/Transforms/Coroutines/smoketest.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/2010-09-02-Trunc.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/2010-09-26-MergeConstantRange.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/add.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/alloca.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/ashr.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/basic.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/conflict.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/crash.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/deopt.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/guards.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/icmp.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/non-null.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflow_predicate.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/overflows.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/pointer.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/pr35807.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/range.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/sdiv.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/select.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/srem.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/udiv.ll
    llvm/trunk/test/Transforms/CorrelatedValuePropagation/urem.ll
    llvm/trunk/test/Transforms/CrossDSOCFI/
    llvm/trunk/test/Transforms/CrossDSOCFI/basic.ll
    llvm/trunk/test/Transforms/CrossDSOCFI/cfi_functions.ll
    llvm/trunk/test/Transforms/CrossDSOCFI/thumb.ll
    llvm/trunk/test/Transforms/DCE/
    llvm/trunk/test/Transforms/DCE/basic.ll
    llvm/trunk/test/Transforms/DCE/calls-errno.ll
    llvm/trunk/test/Transforms/DCE/guards.ll
    llvm/trunk/test/Transforms/DCE/int_sideeffect.ll
    llvm/trunk/test/Transforms/DeadArgElim/
    llvm/trunk/test/Transforms/DeadArgElim/2006-06-27-struct-ret.ll
    llvm/trunk/test/Transforms/DeadArgElim/2007-02-07-FuncRename.ll
    llvm/trunk/test/Transforms/DeadArgElim/2007-10-18-VarargsReturn.ll
    llvm/trunk/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll
    llvm/trunk/test/Transforms/DeadArgElim/2008-01-16-VarargsParamAttrs.ll
    llvm/trunk/test/Transforms/DeadArgElim/2008-06-23-DeadAfterLive.ll
    llvm/trunk/test/Transforms/DeadArgElim/2009-03-17-MRE-Invoke.ll
    llvm/trunk/test/Transforms/DeadArgElim/2010-04-30-DbgInfo.ll
    llvm/trunk/test/Transforms/DeadArgElim/2013-05-17-VarargsAndBlockAddress.ll
    llvm/trunk/test/Transforms/DeadArgElim/aggregates.ll
    llvm/trunk/test/Transforms/DeadArgElim/allocsize.ll
    llvm/trunk/test/Transforms/DeadArgElim/basictest.ll
    llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll
    llvm/trunk/test/Transforms/DeadArgElim/canon.ll
    llvm/trunk/test/Transforms/DeadArgElim/comdat.ll
    llvm/trunk/test/Transforms/DeadArgElim/dbginfo-preserve-dbgloc.ll
    llvm/trunk/test/Transforms/DeadArgElim/dbginfo-update-dbgval-local.ll
    llvm/trunk/test/Transforms/DeadArgElim/dbginfo-update-dbgval.ll
    llvm/trunk/test/Transforms/DeadArgElim/dbginfo.ll
    llvm/trunk/test/Transforms/DeadArgElim/dead_vaargs.ll
    llvm/trunk/test/Transforms/DeadArgElim/deadexternal.ll
    llvm/trunk/test/Transforms/DeadArgElim/deadretval.ll
    llvm/trunk/test/Transforms/DeadArgElim/deadretval2.ll
    llvm/trunk/test/Transforms/DeadArgElim/func_metadata.ll
    llvm/trunk/test/Transforms/DeadArgElim/funclet.ll
    llvm/trunk/test/Transforms/DeadArgElim/keepalive.ll
    llvm/trunk/test/Transforms/DeadArgElim/linkage.ll
    llvm/trunk/test/Transforms/DeadArgElim/multdeadretval.ll
    llvm/trunk/test/Transforms/DeadArgElim/musttail-caller.ll
    llvm/trunk/test/Transforms/DeadArgElim/naked_functions.ll
    llvm/trunk/test/Transforms/DeadArgElim/nonzero-address-spaces.ll
    llvm/trunk/test/Transforms/DeadArgElim/operandbundle.ll
    llvm/trunk/test/Transforms/DeadArgElim/returned.ll
    llvm/trunk/test/Transforms/DeadArgElim/variadic_safety.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/
    llvm/trunk/test/Transforms/DeadStoreElimination/2011-03-25-DSEMiscompile.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/2011-09-06-EndOfFunction.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/2011-09-06-MemCpy.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/2016-07-17-UseAfterFree.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/OverwriteStoreBegin.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/OverwriteStoreEnd.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/X86/
    llvm/trunk/test/Transforms/DeadStoreElimination/X86/gather-null-pointer.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/atomic.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/calloc-store.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/combined-partial-overwrites.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/const-pointers.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/cs-cs-aliasing.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/debuginfo.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/dominate.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/fence.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/free.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/inst-limits.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/int_sideeffect.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/invariant.start.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/launder.invariant.group.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/libcalls.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/lifetime.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/mda-with-dbg-values.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/memintrinsics.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/memset-missing-debugloc.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/merge-stores-big-endian.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/merge-stores.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/no-targetdata.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/operand-bundles.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/pr11390.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll
    llvm/trunk/test/Transforms/DeadStoreElimination/tail-byval.ll
    llvm/trunk/test/Transforms/DivRemPairs/
    llvm/trunk/test/Transforms/DivRemPairs/PowerPC/
    llvm/trunk/test/Transforms/DivRemPairs/PowerPC/div-rem-pairs.ll
    llvm/trunk/test/Transforms/DivRemPairs/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/DivRemPairs/X86/
    llvm/trunk/test/Transforms/DivRemPairs/X86/div-rem-pairs.ll
    llvm/trunk/test/Transforms/DivRemPairs/X86/lit.local.cfg
    llvm/trunk/test/Transforms/EarlyCSE/
    llvm/trunk/test/Transforms/EarlyCSE/AArch64/
    llvm/trunk/test/Transforms/EarlyCSE/AArch64/intrinsics.ll
    llvm/trunk/test/Transforms/EarlyCSE/AArch64/ldstN.ll
    llvm/trunk/test/Transforms/EarlyCSE/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/EarlyCSE/AMDGPU/
    llvm/trunk/test/Transforms/EarlyCSE/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/EarlyCSE/AMDGPU/memrealtime.ll
    llvm/trunk/test/Transforms/EarlyCSE/and_or.ll
    llvm/trunk/test/Transforms/EarlyCSE/atomics.ll
    llvm/trunk/test/Transforms/EarlyCSE/basic.ll
    llvm/trunk/test/Transforms/EarlyCSE/commute.ll
    llvm/trunk/test/Transforms/EarlyCSE/conditional.ll
    llvm/trunk/test/Transforms/EarlyCSE/const-speculation.ll
    llvm/trunk/test/Transforms/EarlyCSE/debug-info-undef.ll
    llvm/trunk/test/Transforms/EarlyCSE/debuginfo-dce.ll
    llvm/trunk/test/Transforms/EarlyCSE/edge.ll
    llvm/trunk/test/Transforms/EarlyCSE/fence.ll
    llvm/trunk/test/Transforms/EarlyCSE/flags.ll
    llvm/trunk/test/Transforms/EarlyCSE/floatingpoint.ll
    llvm/trunk/test/Transforms/EarlyCSE/globalsaa-memoryssa.ll
    llvm/trunk/test/Transforms/EarlyCSE/guards.ll
    llvm/trunk/test/Transforms/EarlyCSE/instsimplify-dom.ll
    llvm/trunk/test/Transforms/EarlyCSE/int_sideeffect.ll
    llvm/trunk/test/Transforms/EarlyCSE/intrinsics.ll
    llvm/trunk/test/Transforms/EarlyCSE/invariant-loads.ll
    llvm/trunk/test/Transforms/EarlyCSE/invariant.start.ll
    llvm/trunk/test/Transforms/EarlyCSE/memoryssa.ll
    llvm/trunk/test/Transforms/EarlyCSE/pr33406.ll
    llvm/trunk/test/Transforms/EarlyCSE/preserve_memoryssa.ll
    llvm/trunk/test/Transforms/EarlyCSE/read-reg.ll
    llvm/trunk/test/Transforms/EarlyCSE/readnone-mayunwind.ll
    llvm/trunk/test/Transforms/EliminateAvailableExternally/
    llvm/trunk/test/Transforms/EliminateAvailableExternally/visibility.ll
    llvm/trunk/test/Transforms/EntryExitInstrumenter/
    llvm/trunk/test/Transforms/EntryExitInstrumenter/debug-info.ll
    llvm/trunk/test/Transforms/EntryExitInstrumenter/mcount.ll
    llvm/trunk/test/Transforms/ExpandMemCmp/
    llvm/trunk/test/Transforms/ExpandMemCmp/X86/
    llvm/trunk/test/Transforms/ExpandMemCmp/X86/lit.local.cfg
    llvm/trunk/test/Transforms/ExpandMemCmp/X86/memcmp.ll
    llvm/trunk/test/Transforms/Float2Int/
    llvm/trunk/test/Transforms/Float2Int/basic.ll
    llvm/trunk/test/Transforms/Float2Int/float2int-optnone.ll
    llvm/trunk/test/Transforms/Float2Int/toolarge.ll
    llvm/trunk/test/Transforms/ForcedFunctionAttrs/
    llvm/trunk/test/Transforms/ForcedFunctionAttrs/forced.ll
    llvm/trunk/test/Transforms/FunctionAttrs/
    llvm/trunk/test/Transforms/FunctionAttrs/2008-09-03-Mutual.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2008-09-03-ReadOnly.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2008-09-13-VolatileRead.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2008-12-29-Constant.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2009-01-02-LocalStores.ll
    llvm/trunk/test/Transforms/FunctionAttrs/2010-10-30-volatile.ll
    llvm/trunk/test/Transforms/FunctionAttrs/assume.ll
    llvm/trunk/test/Transforms/FunctionAttrs/atomic.ll
    llvm/trunk/test/Transforms/FunctionAttrs/comdat-ipo.ll
    llvm/trunk/test/Transforms/FunctionAttrs/convergent.ll
    llvm/trunk/test/Transforms/FunctionAttrs/incompatible_fn_attrs.ll
    llvm/trunk/test/Transforms/FunctionAttrs/int_sideeffect.ll
    llvm/trunk/test/Transforms/FunctionAttrs/naked_functions.ll
    llvm/trunk/test/Transforms/FunctionAttrs/nocapture.ll
    llvm/trunk/test/Transforms/FunctionAttrs/nonnull-global.ll
    llvm/trunk/test/Transforms/FunctionAttrs/nonnull.ll
    llvm/trunk/test/Transforms/FunctionAttrs/norecurse.ll
    llvm/trunk/test/Transforms/FunctionAttrs/operand-bundles-scc.ll
    llvm/trunk/test/Transforms/FunctionAttrs/optnone-simple.ll
    llvm/trunk/test/Transforms/FunctionAttrs/optnone.ll
    llvm/trunk/test/Transforms/FunctionAttrs/out-of-bounds-iterator-bug.ll
    llvm/trunk/test/Transforms/FunctionAttrs/readattrs.ll
    llvm/trunk/test/Transforms/FunctionAttrs/readnone.ll
    llvm/trunk/test/Transforms/FunctionAttrs/returned.ll
    llvm/trunk/test/Transforms/FunctionImport/
    llvm/trunk/test/Transforms/FunctionImport/Inputs/
    llvm/trunk/test/Transforms/FunctionImport/Inputs/adjustable_threshold.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/comdat.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_alias.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_cutoff.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_debug.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_forcecold.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_resolved1.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_resolved2.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/funcimport_var2.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/hotness_based_import.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/import_stats.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/inlineasm.ll
    llvm/trunk/test/Transforms/FunctionImport/Inputs/not-prevailing.ll
    llvm/trunk/test/Transforms/FunctionImport/adjustable_threshold.ll
    llvm/trunk/test/Transforms/FunctionImport/comdat.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_alias.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_cutoff.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_debug.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_forcecold.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_forcecold_samplepgo.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_resolved.ll
    llvm/trunk/test/Transforms/FunctionImport/funcimport_var.ll
    llvm/trunk/test/Transforms/FunctionImport/hotness_based_import.ll
    llvm/trunk/test/Transforms/FunctionImport/import_stats.ll
    llvm/trunk/test/Transforms/FunctionImport/inlineasm.ll
    llvm/trunk/test/Transforms/FunctionImport/not-prevailing.ll
    llvm/trunk/test/Transforms/GCOVProfiling/
    llvm/trunk/test/Transforms/GCOVProfiling/function-numbering.ll
    llvm/trunk/test/Transforms/GCOVProfiling/global-ctor.ll
    llvm/trunk/test/Transforms/GCOVProfiling/linezero.ll
    llvm/trunk/test/Transforms/GCOVProfiling/linkagename.ll
    llvm/trunk/test/Transforms/GCOVProfiling/modules.ll
    llvm/trunk/test/Transforms/GCOVProfiling/return-block.ll
    llvm/trunk/test/Transforms/GCOVProfiling/three-element-mdnode.ll
    llvm/trunk/test/Transforms/GCOVProfiling/version.ll
    llvm/trunk/test/Transforms/GVN/
    llvm/trunk/test/Transforms/GVN/2007-07-25-DominatedLoop.ll
    llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll
    llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.ll
    llvm/trunk/test/Transforms/GVN/2007-07-25-NestedLoop.ll
    llvm/trunk/test/Transforms/GVN/2007-07-25-SinglePredecessor.ll
    llvm/trunk/test/Transforms/GVN/2007-07-26-InterlockingLoops.ll
    llvm/trunk/test/Transforms/GVN/2007-07-26-NonRedundant.ll
    llvm/trunk/test/Transforms/GVN/2007-07-26-PhiErasure.ll
    llvm/trunk/test/Transforms/GVN/2007-07-30-PredIDom.ll
    llvm/trunk/test/Transforms/GVN/2007-07-31-NoDomInherit.ll
    llvm/trunk/test/Transforms/GVN/2007-07-31-RedundantPhi.ll
    llvm/trunk/test/Transforms/GVN/2008-02-12-UndefLoad.ll
    llvm/trunk/test/Transforms/GVN/2008-02-13-NewPHI.ll
    llvm/trunk/test/Transforms/GVN/2008-07-02-Unreachable.ll
    llvm/trunk/test/Transforms/GVN/2008-12-09-SelfRemove.ll
    llvm/trunk/test/Transforms/GVN/2008-12-12-RLE-Crash.ll
    llvm/trunk/test/Transforms/GVN/2008-12-14-rle-reanalyze.ll
    llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll
    llvm/trunk/test/Transforms/GVN/2009-01-21-SortInvalidation.ll
    llvm/trunk/test/Transforms/GVN/2009-01-22-SortInvalidation.ll
    llvm/trunk/test/Transforms/GVN/2009-03-10-PREOnVoid.ll
    llvm/trunk/test/Transforms/GVN/2009-07-13-MemDepSortFail.ll
    llvm/trunk/test/Transforms/GVN/2009-11-12-MemDepMallocBitCast.ll
    llvm/trunk/test/Transforms/GVN/2010-03-31-RedundantPHIs.ll
    llvm/trunk/test/Transforms/GVN/2010-05-08-OneBit.ll
    llvm/trunk/test/Transforms/GVN/2010-11-13-Simplify.ll
    llvm/trunk/test/Transforms/GVN/2011-04-27-phioperands.ll
    llvm/trunk/test/Transforms/GVN/2011-07-07-MatchIntrinsicExtract.ll
    llvm/trunk/test/Transforms/GVN/2011-09-07-TypeIdFor.ll
    llvm/trunk/test/Transforms/GVN/2012-05-22-PreCrash.ll
    llvm/trunk/test/Transforms/GVN/2016-08-30-MaskedScatterGather.ll
    llvm/trunk/test/Transforms/GVN/MemdepMiscompile.ll
    llvm/trunk/test/Transforms/GVN/PRE/
    llvm/trunk/test/Transforms/GVN/PRE/2009-02-17-LoadPRECrash.ll
    llvm/trunk/test/Transforms/GVN/PRE/2009-06-17-InvalidPRE.ll
    llvm/trunk/test/Transforms/GVN/PRE/2011-06-01-NonLocalMemdepMiscompile.ll
    llvm/trunk/test/Transforms/GVN/PRE/2017-06-28-pre-load-dbgloc.ll
    llvm/trunk/test/Transforms/GVN/PRE/2017-10-16-LoadPRECrash.ll
    llvm/trunk/test/Transforms/GVN/PRE/2018-06-08-pre-load-dbgloc-no-null-opt.ll
    llvm/trunk/test/Transforms/GVN/PRE/atomic.ll
    llvm/trunk/test/Transforms/GVN/PRE/invariant-load.ll
    llvm/trunk/test/Transforms/GVN/PRE/load-metadata.ll
    llvm/trunk/test/Transforms/GVN/PRE/load-pre-align.ll
    llvm/trunk/test/Transforms/GVN/PRE/load-pre-licm.ll
    llvm/trunk/test/Transforms/GVN/PRE/load-pre-nonlocal.ll
    llvm/trunk/test/Transforms/GVN/PRE/local-pre.ll
    llvm/trunk/test/Transforms/GVN/PRE/lpre-call-wrap-2.ll
    llvm/trunk/test/Transforms/GVN/PRE/lpre-call-wrap.ll
    llvm/trunk/test/Transforms/GVN/PRE/nonintegral.ll
    llvm/trunk/test/Transforms/GVN/PRE/phi-translate-2.ll
    llvm/trunk/test/Transforms/GVN/PRE/phi-translate.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-after-rle.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-basic-add.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-gep-load.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-jt-add.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-load-guards.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-load-implicit-cf-updates.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-load.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-no-cost-phi.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-poison-add.ll
    llvm/trunk/test/Transforms/GVN/PRE/pre-single-pred.ll
    llvm/trunk/test/Transforms/GVN/PRE/preserve-tbaa.ll
    llvm/trunk/test/Transforms/GVN/PRE/rle-addrspace-cast.ll
    llvm/trunk/test/Transforms/GVN/PRE/rle-phi-translate.ll
    llvm/trunk/test/Transforms/GVN/PRE/rle-semidominated.ll
    llvm/trunk/test/Transforms/GVN/PRE/rle.ll
    llvm/trunk/test/Transforms/GVN/PRE/volatile.ll
    llvm/trunk/test/Transforms/GVN/assume-equal.ll
    llvm/trunk/test/Transforms/GVN/basic-undef-test.ll
    llvm/trunk/test/Transforms/GVN/basic.ll
    llvm/trunk/test/Transforms/GVN/big-endian.ll
    llvm/trunk/test/Transforms/GVN/bitcast-of-call.ll
    llvm/trunk/test/Transforms/GVN/br-identical.ll
    llvm/trunk/test/Transforms/GVN/callbr-loadpre-critedge.ll
    llvm/trunk/test/Transforms/GVN/callbr-scalarpre-critedge.ll
    llvm/trunk/test/Transforms/GVN/calloc-load-removal.ll
    llvm/trunk/test/Transforms/GVN/calls-nonlocal.ll
    llvm/trunk/test/Transforms/GVN/calls-readonly.ll
    llvm/trunk/test/Transforms/GVN/commute.ll
    llvm/trunk/test/Transforms/GVN/cond_br.ll
    llvm/trunk/test/Transforms/GVN/cond_br2.ll
    llvm/trunk/test/Transforms/GVN/condprop.ll
    llvm/trunk/test/Transforms/GVN/crash-no-aa.ll
    llvm/trunk/test/Transforms/GVN/crash.ll
    llvm/trunk/test/Transforms/GVN/dbg-redundant-load.ll
    llvm/trunk/test/Transforms/GVN/debugloc.ll
    llvm/trunk/test/Transforms/GVN/edge.ll
    llvm/trunk/test/Transforms/GVN/fence.ll
    llvm/trunk/test/Transforms/GVN/flags.ll
    llvm/trunk/test/Transforms/GVN/fold-const-expr.ll
    llvm/trunk/test/Transforms/GVN/fpmath.ll
    llvm/trunk/test/Transforms/GVN/funclet.ll
    llvm/trunk/test/Transforms/GVN/int_sideeffect.ll
    llvm/trunk/test/Transforms/GVN/invariant.group.ll
    llvm/trunk/test/Transforms/GVN/invariant.start.ll
    llvm/trunk/test/Transforms/GVN/lifetime-simple.ll
    llvm/trunk/test/Transforms/GVN/load-constant-mem.ll
    llvm/trunk/test/Transforms/GVN/load-from-unreachable-predecessor.ll
    llvm/trunk/test/Transforms/GVN/malloc-load-removal.ll
    llvm/trunk/test/Transforms/GVN/no-mem-dep-info.ll
    llvm/trunk/test/Transforms/GVN/no_speculative_loads_with_asan.ll
    llvm/trunk/test/Transforms/GVN/noalias.ll
    llvm/trunk/test/Transforms/GVN/non-integral-pointers.ll
    llvm/trunk/test/Transforms/GVN/non-local-offset.ll
    llvm/trunk/test/Transforms/GVN/nonescaping-malloc.ll
    llvm/trunk/test/Transforms/GVN/null-aliases-nothing.ll
    llvm/trunk/test/Transforms/GVN/opt-remarks.ll
    llvm/trunk/test/Transforms/GVN/phi-translate-partial-alias.ll
    llvm/trunk/test/Transforms/GVN/pr10820.ll
    llvm/trunk/test/Transforms/GVN/pr12979.ll
    llvm/trunk/test/Transforms/GVN/pr14166.ll
    llvm/trunk/test/Transforms/GVN/pr17732.ll
    llvm/trunk/test/Transforms/GVN/pr17852.ll
    llvm/trunk/test/Transforms/GVN/pr24397.ll
    llvm/trunk/test/Transforms/GVN/pr24426.ll
    llvm/trunk/test/Transforms/GVN/pr25440.ll
    llvm/trunk/test/Transforms/GVN/pr28562.ll
    llvm/trunk/test/Transforms/GVN/pr28879.ll
    llvm/trunk/test/Transforms/GVN/pr32314.ll
    llvm/trunk/test/Transforms/GVN/pr34908.ll
    llvm/trunk/test/Transforms/GVN/pr36063.ll
    llvm/trunk/test/Transforms/GVN/pre-compare.ll
    llvm/trunk/test/Transforms/GVN/pre-new-inst.ll
    llvm/trunk/test/Transforms/GVN/propagate-ir-flags.ll
    llvm/trunk/test/Transforms/GVN/range.ll
    llvm/trunk/test/Transforms/GVN/readattrs.ll
    llvm/trunk/test/Transforms/GVN/rle-must-alias.ll
    llvm/trunk/test/Transforms/GVN/rle-no-phi-translate.ll
    llvm/trunk/test/Transforms/GVN/rle-nonlocal.ll
    llvm/trunk/test/Transforms/GVN/stale-loop-info.ll
    llvm/trunk/test/Transforms/GVN/tbaa.ll
    llvm/trunk/test/Transforms/GVN/unreachable-predecessor.ll
    llvm/trunk/test/Transforms/GVN/unreachable_block_infinite_loop.ll
    llvm/trunk/test/Transforms/GVN/volatile-nonvolatile.ll
    llvm/trunk/test/Transforms/GVNHoist/
    llvm/trunk/test/Transforms/GVNHoist/hoist-call.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-convergent.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-inline.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-md.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-more-than-two-branches.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-mssa.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-newgvn.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-pr20242.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-pr22005.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-pr28606.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-pr28933.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-pr31891.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-recursive-geps.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-simplify-phi.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-unsafe-pr31729.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist-very-busy.ll
    llvm/trunk/test/Transforms/GVNHoist/hoist.ll
    llvm/trunk/test/Transforms/GVNHoist/infinite-loop-direct.ll
    llvm/trunk/test/Transforms/GVNHoist/infinite-loop-indirect.ll
    llvm/trunk/test/Transforms/GVNHoist/int_sideeffect.ll
    llvm/trunk/test/Transforms/GVNHoist/ld_hoist1.ll
    llvm/trunk/test/Transforms/GVNHoist/ld_hoist_st_sink.ll
    llvm/trunk/test/Transforms/GVNHoist/non-trivial-phi.ll
    llvm/trunk/test/Transforms/GVNHoist/pr28626.ll
    llvm/trunk/test/Transforms/GVNHoist/pr29031.ll
    llvm/trunk/test/Transforms/GVNHoist/pr29034.ll
    llvm/trunk/test/Transforms/GVNHoist/pr30216.ll
    llvm/trunk/test/Transforms/GVNHoist/pr30499.ll
    llvm/trunk/test/Transforms/GVNHoist/pr35222-hoist-load.ll
    llvm/trunk/test/Transforms/GVNHoist/pr36787.ll
    llvm/trunk/test/Transforms/GVNHoist/pr37445.ll
    llvm/trunk/test/Transforms/GVNHoist/pr37808.ll
    llvm/trunk/test/Transforms/GVNHoist/pr38807.ll
    llvm/trunk/test/Transforms/GVNSink/
    llvm/trunk/test/Transforms/GVNSink/dither.ll
    llvm/trunk/test/Transforms/GVNSink/indirect-call.ll
    llvm/trunk/test/Transforms/GVNSink/int_sideeffect.ll
    llvm/trunk/test/Transforms/GVNSink/sink-combine-metadata.ll
    llvm/trunk/test/Transforms/GVNSink/sink-common-code.ll
    llvm/trunk/test/Transforms/GVNSink/struct.ll
    llvm/trunk/test/Transforms/GlobalDCE/
    llvm/trunk/test/Transforms/GlobalDCE/2002-07-17-CastRef.ll
    llvm/trunk/test/Transforms/GlobalDCE/2002-07-17-ConstantRef.ll
    llvm/trunk/test/Transforms/GlobalDCE/2002-08-17-FunctionDGE.ll
    llvm/trunk/test/Transforms/GlobalDCE/2002-08-17-WorkListTest.ll
    llvm/trunk/test/Transforms/GlobalDCE/2002-09-12-Redeletion.ll
    llvm/trunk/test/Transforms/GlobalDCE/2003-07-01-SelfReference.ll
    llvm/trunk/test/Transforms/GlobalDCE/2003-10-09-PreserveWeakGlobals.ll
    llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll
    llvm/trunk/test/Transforms/GlobalDCE/2009-02-17-AliasUsesAliasee.ll
    llvm/trunk/test/Transforms/GlobalDCE/basicvariabletest.ll
    llvm/trunk/test/Transforms/GlobalDCE/comdats.ll
    llvm/trunk/test/Transforms/GlobalDCE/complex-constantexpr.ll
    llvm/trunk/test/Transforms/GlobalDCE/crash-assertingvh.ll
    llvm/trunk/test/Transforms/GlobalDCE/deadblockaddr.ll
    llvm/trunk/test/Transforms/GlobalDCE/externally_available.ll
    llvm/trunk/test/Transforms/GlobalDCE/global-ifunc.ll
    llvm/trunk/test/Transforms/GlobalDCE/global_ctors.ll
    llvm/trunk/test/Transforms/GlobalDCE/global_ctors_integration.ll
    llvm/trunk/test/Transforms/GlobalDCE/indirectbr.ll
    llvm/trunk/test/Transforms/GlobalMerge/
    llvm/trunk/test/Transforms/GlobalMerge/alignment-2.ll
    llvm/trunk/test/Transforms/GlobalMerge/alignment.ll
    llvm/trunk/test/Transforms/GlobalMerge/basic.ll
    llvm/trunk/test/Transforms/GlobalMerge/debug-info.ll
    llvm/trunk/test/Transforms/GlobalMerge/used.ll
    llvm/trunk/test/Transforms/GlobalOpt/
    llvm/trunk/test/Transforms/GlobalOpt/2004-10-10-CastStoreOnce.ll
    llvm/trunk/test/Transforms/GlobalOpt/2005-06-15-LocalizeConstExprCrash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2005-09-27-Crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2006-07-07-InlineAsmCrash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2006-11-01-ShrinkGlobalPhiCrash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2007-04-05-Crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2007-05-13-Crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2007-06-04-PackedStruct.ll
    llvm/trunk/test/Transforms/GlobalOpt/2007-11-09-GEP-GEP-Crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-01-03-Crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-01-13-OutOfRangeSROA.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-04-26-SROA-Global-Align.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-07-17-addrspace.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash-2.ll
    llvm/trunk/test/Transforms/GlobalOpt/2008-12-16-HeapSRACrash.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-01-13-phi-user.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-02-15-BitcastAlias.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-03-05-dbg.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-03-06-Anonymous.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-03-07-PromotePtrToBool.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-06-01-RecursivePHI.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-11-16-BrokenPerformHeapAllocSRoA.ll
    llvm/trunk/test/Transforms/GlobalOpt/2009-11-16-MallocSingleStoreToGlobalVar.ll
    llvm/trunk/test/Transforms/GlobalOpt/2010-02-25-MallocPromote.ll
    llvm/trunk/test/Transforms/GlobalOpt/2010-02-26-MallocSROA.ll
    llvm/trunk/test/Transforms/GlobalOpt/2010-10-19-WeakOdr.ll
    llvm/trunk/test/Transforms/GlobalOpt/2011-04-09-EmptyGlobalCtors.ll
    llvm/trunk/test/Transforms/GlobalOpt/2012-05-11-blockaddress.ll
    llvm/trunk/test/Transforms/GlobalOpt/GSROA-section.ll
    llvm/trunk/test/Transforms/GlobalOpt/MallocSROA-section-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/MallocSROA-section.ll
    llvm/trunk/test/Transforms/GlobalOpt/PowerPC/
    llvm/trunk/test/Transforms/GlobalOpt/PowerPC/coldcc_coldsites.ll
    llvm/trunk/test/Transforms/GlobalOpt/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/GlobalOpt/SROA-section.ll
    llvm/trunk/test/Transforms/GlobalOpt/alias-resolve.ll
    llvm/trunk/test/Transforms/GlobalOpt/alias-used-address-space.ll
    llvm/trunk/test/Transforms/GlobalOpt/alias-used-section.ll
    llvm/trunk/test/Transforms/GlobalOpt/alias-used.ll
    llvm/trunk/test/Transforms/GlobalOpt/amdgcn-ctor-alloca.ll
    llvm/trunk/test/Transforms/GlobalOpt/array-elem-refs.ll
    llvm/trunk/test/Transforms/GlobalOpt/assume.ll
    llvm/trunk/test/Transforms/GlobalOpt/atexit.ll
    llvm/trunk/test/Transforms/GlobalOpt/atomic.ll
    llvm/trunk/test/Transforms/GlobalOpt/available_externally_global_ctors.ll
    llvm/trunk/test/Transforms/GlobalOpt/basictest.ll
    llvm/trunk/test/Transforms/GlobalOpt/blockaddress.ll
    llvm/trunk/test/Transforms/GlobalOpt/cleanup-pointer-root-users.ll
    llvm/trunk/test/Transforms/GlobalOpt/coldcc_stress_test.ll
    llvm/trunk/test/Transforms/GlobalOpt/compiler-used.ll
    llvm/trunk/test/Transforms/GlobalOpt/constantexpr-dangle.ll
    llvm/trunk/test/Transforms/GlobalOpt/constantfold-initializers.ll
    llvm/trunk/test/Transforms/GlobalOpt/crash-2.ll
    llvm/trunk/test/Transforms/GlobalOpt/crash.ll
    llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll
    llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt-inbounds.ll
    llvm/trunk/test/Transforms/GlobalOpt/ctor-list-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll
    llvm/trunk/test/Transforms/GlobalOpt/deaddeclaration.ll
    llvm/trunk/test/Transforms/GlobalOpt/deadfunction.ll
    llvm/trunk/test/Transforms/GlobalOpt/deadglobal-2.ll
    llvm/trunk/test/Transforms/GlobalOpt/deadglobal.ll
    llvm/trunk/test/Transforms/GlobalOpt/evaluate-bitcast.ll
    llvm/trunk/test/Transforms/GlobalOpt/evaluate-call-errors.ll
    llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll
    llvm/trunk/test/Transforms/GlobalOpt/evaluate-constfold-call.ll
    llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-aggregate.ll
    llvm/trunk/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll
    llvm/trunk/test/Transforms/GlobalOpt/externally-initialized.ll
    llvm/trunk/test/Transforms/GlobalOpt/fastcc.ll
    llvm/trunk/test/Transforms/GlobalOpt/global-demotion.ll
    llvm/trunk/test/Transforms/GlobalOpt/globalsra-multigep.ll
    llvm/trunk/test/Transforms/GlobalOpt/globalsra-partial.ll
    llvm/trunk/test/Transforms/GlobalOpt/globalsra-unknown-index.ll
    llvm/trunk/test/Transforms/GlobalOpt/globalsra.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-1-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-1.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-2-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-2.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-3-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-3.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-4-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-4.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-phi-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/heap-sra-phi.ll
    llvm/trunk/test/Transforms/GlobalOpt/int_sideeffect.ll
    llvm/trunk/test/Transforms/GlobalOpt/integer-bool-dwarf.ll
    llvm/trunk/test/Transforms/GlobalOpt/integer-bool.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant-nodatalayout.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant.group.ll
    llvm/trunk/test/Transforms/GlobalOpt/invariant.ll
    llvm/trunk/test/Transforms/GlobalOpt/invoke.ll
    llvm/trunk/test/Transforms/GlobalOpt/iterate.ll
    llvm/trunk/test/Transforms/GlobalOpt/load-store-global-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/load-store-global.ll
    llvm/trunk/test/Transforms/GlobalOpt/localize-constexpr-debuginfo.ll
    llvm/trunk/test/Transforms/GlobalOpt/localize-constexpr.ll
    llvm/trunk/test/Transforms/GlobalOpt/malloc-promote-1-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/malloc-promote-1.ll
    llvm/trunk/test/Transforms/GlobalOpt/malloc-promote-2-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/malloc-promote-2.ll
    llvm/trunk/test/Transforms/GlobalOpt/malloc-promote-3.ll
    llvm/trunk/test/Transforms/GlobalOpt/memcpy.ll
    llvm/trunk/test/Transforms/GlobalOpt/memset-null.ll
    llvm/trunk/test/Transforms/GlobalOpt/memset.ll
    llvm/trunk/test/Transforms/GlobalOpt/metadata.ll
    llvm/trunk/test/Transforms/GlobalOpt/musttail_cc.ll
    llvm/trunk/test/Transforms/GlobalOpt/naked_functions.ll
    llvm/trunk/test/Transforms/GlobalOpt/phi-select.ll
    llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll
    llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll
    llvm/trunk/test/Transforms/GlobalOpt/preserve-comdats.ll
    llvm/trunk/test/Transforms/GlobalOpt/shrink-address-to-bool.ll
    llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll
    llvm/trunk/test/Transforms/GlobalOpt/static-const-bitcast.ll
    llvm/trunk/test/Transforms/GlobalOpt/storepointer-compare-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/storepointer-compare.ll
    llvm/trunk/test/Transforms/GlobalOpt/storepointer-no-null-opt.ll
    llvm/trunk/test/Transforms/GlobalOpt/storepointer.ll
    llvm/trunk/test/Transforms/GlobalOpt/tls.ll
    llvm/trunk/test/Transforms/GlobalOpt/trivialstore.ll
    llvm/trunk/test/Transforms/GlobalOpt/undef-init.ll
    llvm/trunk/test/Transforms/GlobalOpt/unnamed-addr.ll
    llvm/trunk/test/Transforms/GlobalOpt/zeroinitializer-gep-load.ll
    llvm/trunk/test/Transforms/GlobalSplit/
    llvm/trunk/test/Transforms/GlobalSplit/basic.ll
    llvm/trunk/test/Transforms/GlobalSplit/non-beneficial.ll
    llvm/trunk/test/Transforms/GlobalSplit/nonlocal.ll
    llvm/trunk/test/Transforms/GuardWidening/
    llvm/trunk/test/Transforms/GuardWidening/basic.ll
    llvm/trunk/test/Transforms/GuardWidening/basic_widenable_condition_guards.ll
    llvm/trunk/test/Transforms/GuardWidening/loop-schedule.ll
    llvm/trunk/test/Transforms/GuardWidening/mixed_guards.ll
    llvm/trunk/test/Transforms/GuardWidening/range-check-merging.ll
    llvm/trunk/test/Transforms/GuardWidening/widen-frequent-branches.ll
    llvm/trunk/test/Transforms/HotColdSplit/
    llvm/trunk/test/Transforms/HotColdSplit/X86/
    llvm/trunk/test/Transforms/HotColdSplit/X86/do-not-split.ll
    llvm/trunk/test/Transforms/HotColdSplit/X86/lit.local.cfg
    llvm/trunk/test/Transforms/HotColdSplit/addr-taken.ll
    llvm/trunk/test/Transforms/HotColdSplit/apply-noreturn-bonus.ll
    llvm/trunk/test/Transforms/HotColdSplit/apply-penalty-for-inputs.ll
    llvm/trunk/test/Transforms/HotColdSplit/apply-penalty-for-outputs.ll
    llvm/trunk/test/Transforms/HotColdSplit/apply-successor-penalty.ll
    llvm/trunk/test/Transforms/HotColdSplit/coldentrycount.ll
    llvm/trunk/test/Transforms/HotColdSplit/delete-use-without-def-dbg-val.ll
    llvm/trunk/test/Transforms/HotColdSplit/duplicate-phi-preds-crash.ll
    llvm/trunk/test/Transforms/HotColdSplit/eh-pads.ll
    llvm/trunk/test/Transforms/HotColdSplit/eh-typeid-for.ll
    llvm/trunk/test/Transforms/HotColdSplit/forward-dfs-reaches-marked-block.ll
    llvm/trunk/test/Transforms/HotColdSplit/lifetime-markers-on-inputs-1.ll
    llvm/trunk/test/Transforms/HotColdSplit/lifetime-markers-on-inputs-2.ll
    llvm/trunk/test/Transforms/HotColdSplit/mark-the-whole-func-cold.ll
    llvm/trunk/test/Transforms/HotColdSplit/minsize.ll
    llvm/trunk/test/Transforms/HotColdSplit/multiple-exits.ll
    llvm/trunk/test/Transforms/HotColdSplit/noreturn.ll
    llvm/trunk/test/Transforms/HotColdSplit/outline-cold-asm.ll
    llvm/trunk/test/Transforms/HotColdSplit/outline-disjoint-diamonds.ll
    llvm/trunk/test/Transforms/HotColdSplit/outline-if-then-else.ll
    llvm/trunk/test/Transforms/HotColdSplit/outline-multiple-entry-region.ll
    llvm/trunk/test/Transforms/HotColdSplit/outline-while-loop.ll
    llvm/trunk/test/Transforms/HotColdSplit/phi-with-distinct-outlined-values.ll
    llvm/trunk/test/Transforms/HotColdSplit/region-overlap.ll
    llvm/trunk/test/Transforms/HotColdSplit/resume.ll
    llvm/trunk/test/Transforms/HotColdSplit/split-cold-2.ll
    llvm/trunk/test/Transforms/HotColdSplit/split-out-dbg-val-of-arg.ll
    llvm/trunk/test/Transforms/HotColdSplit/split-phis-in-exit-blocks.ll
    llvm/trunk/test/Transforms/HotColdSplit/succ-block-with-self-edge.ll
    llvm/trunk/test/Transforms/HotColdSplit/swifterror.ll
    llvm/trunk/test/Transforms/HotColdSplit/unwind.ll
    llvm/trunk/test/Transforms/IPConstantProp/
    llvm/trunk/test/Transforms/IPConstantProp/2008-06-09-WeakProp.ll
    llvm/trunk/test/Transforms/IPConstantProp/2009-09-24-byval-ptr.ll
    llvm/trunk/test/Transforms/IPConstantProp/PR16052.ll
    llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll
    llvm/trunk/test/Transforms/IPConstantProp/arg-count-mismatch.ll
    llvm/trunk/test/Transforms/IPConstantProp/arg-type-mismatch.ll
    llvm/trunk/test/Transforms/IPConstantProp/comdat-ipo.ll
    llvm/trunk/test/Transforms/IPConstantProp/dangling-block-address.ll
    llvm/trunk/test/Transforms/IPConstantProp/deadarg.ll
    llvm/trunk/test/Transforms/IPConstantProp/fp-bc-icmp-const-fold.ll
    llvm/trunk/test/Transforms/IPConstantProp/global.ll
    llvm/trunk/test/Transforms/IPConstantProp/multiple_callbacks.ll
    llvm/trunk/test/Transforms/IPConstantProp/musttail-call.ll
    llvm/trunk/test/Transforms/IPConstantProp/naked-return.ll
    llvm/trunk/test/Transforms/IPConstantProp/openmp_parallel_for.ll
    llvm/trunk/test/Transforms/IPConstantProp/pthreads.ll
    llvm/trunk/test/Transforms/IPConstantProp/recursion.ll
    llvm/trunk/test/Transforms/IPConstantProp/remove-call-inst.ll
    llvm/trunk/test/Transforms/IPConstantProp/return-argument.ll
    llvm/trunk/test/Transforms/IPConstantProp/return-constant.ll
    llvm/trunk/test/Transforms/IPConstantProp/return-constants.ll
    llvm/trunk/test/Transforms/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll
    llvm/trunk/test/Transforms/IPConstantProp/thread_local_acs.ll
    llvm/trunk/test/Transforms/IPConstantProp/user-with-multiple-uses.ll
    llvm/trunk/test/Transforms/IRCE/
    llvm/trunk/test/Transforms/IRCE/add-metadata-pre-post-loops.ll
    llvm/trunk/test/Transforms/IRCE/bad-loop-structure.ll
    llvm/trunk/test/Transforms/IRCE/bad_expander.ll
    llvm/trunk/test/Transforms/IRCE/bug-loop-varying-upper-limit.ll
    llvm/trunk/test/Transforms/IRCE/bug-mismatched-types.ll
    llvm/trunk/test/Transforms/IRCE/clamp.ll
    llvm/trunk/test/Transforms/IRCE/conjunctive-checks.ll
    llvm/trunk/test/Transforms/IRCE/correct-loop-info.ll
    llvm/trunk/test/Transforms/IRCE/decrementing-loop.ll
    llvm/trunk/test/Transforms/IRCE/empty_ranges.ll
    llvm/trunk/test/Transforms/IRCE/eq_ne.ll
    llvm/trunk/test/Transforms/IRCE/low-becount.ll
    llvm/trunk/test/Transforms/IRCE/multiple-access-no-preloop.ll
    llvm/trunk/test/Transforms/IRCE/non_known_positive_end.ll
    llvm/trunk/test/Transforms/IRCE/not-likely-taken.ll
    llvm/trunk/test/Transforms/IRCE/only-lower-check.ll
    llvm/trunk/test/Transforms/IRCE/only-upper-check.ll
    llvm/trunk/test/Transforms/IRCE/optimistic_scev.ll
    llvm/trunk/test/Transforms/IRCE/pre_post_loops.ll
    llvm/trunk/test/Transforms/IRCE/range_intersect_miscompile.ll
    llvm/trunk/test/Transforms/IRCE/ranges_of_different_types.ll
    llvm/trunk/test/Transforms/IRCE/rc-negative-bound.ll
    llvm/trunk/test/Transforms/IRCE/single-access-no-preloop.ll
    llvm/trunk/test/Transforms/IRCE/single-access-with-preloop.ll
    llvm/trunk/test/Transforms/IRCE/skip-profitability-checks.ll
    llvm/trunk/test/Transforms/IRCE/stride_more_than_1.ll
    llvm/trunk/test/Transforms/IRCE/unhandled.ll
    llvm/trunk/test/Transforms/IRCE/unsigned_comparisons_ugt.ll
    llvm/trunk/test/Transforms/IRCE/unsigned_comparisons_ult.ll
    llvm/trunk/test/Transforms/IRCE/variable-loop-bounds.ll
    llvm/trunk/test/Transforms/IRCE/wide_indvar.ll
    llvm/trunk/test/Transforms/IRCE/with-parent-loops.ll
    llvm/trunk/test/Transforms/IndVarSimplify/
    llvm/trunk/test/Transforms/IndVarSimplify/2002-09-09-PointerIndVar.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2003-04-16-ExprAnalysis.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2003-09-23-NotAtTop.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2003-12-10-RemoveInstrCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2003-12-15-Crash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2004-03-10-PHIInsertionBug.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2004-04-05-InvokeCastCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2004-04-07-ScalarEvolutionCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2005-02-11-InvokeCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2005-02-17-TruncateExprCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2005-02-26-ExitValueCompute.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2005-06-15-InstMoveCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2005-11-18-Crash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2006-03-31-NegativeStride.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2006-06-16-Indvar-LCSSA-Crash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2006-09-20-LFTR-Crash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2006-12-10-BitCast.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2007-01-06-TripCount.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2007-06-06-DeleteDanglesPtr.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2007-11-23-BitcastCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2008-06-15-SCEVExpanderBug.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2008-09-02-IVType.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2008-10-03-CouldNotCompute.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2008-11-25-APFloatAssert.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2009-04-14-shorten_iv_vars.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2009-04-15-shorten-iv-vars-2.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2009-04-22-IndvarCrash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2009-04-27-Floating.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2009-05-24-useafterfree.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-09-10-widen-nsw.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-09-19-vectoriv.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-09-27-hoistsext.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-10-27-lftrnull.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-11-01-lftrptr.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-11-15-multiexit.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2011-11-17-selfphi.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2012-07-17-lftr-undef.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2012-10-19-congruent-constant.ll
    llvm/trunk/test/Transforms/IndVarSimplify/2014-06-21-congruent-constant.ll
    llvm/trunk/test/Transforms/IndVarSimplify/AMDGPU/
    llvm/trunk/test/Transforms/IndVarSimplify/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/IndVarSimplify/AMDGPU/no-widen-to-i64.ll
    llvm/trunk/test/Transforms/IndVarSimplify/NVPTX/
    llvm/trunk/test/Transforms/IndVarSimplify/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/IndVarSimplify/NVPTX/no-widen-expensive.ll
    llvm/trunk/test/Transforms/IndVarSimplify/ada-loops.ll
    llvm/trunk/test/Transforms/IndVarSimplify/ashr-tripcount.ll
    llvm/trunk/test/Transforms/IndVarSimplify/avoid-i0.ll
    llvm/trunk/test/Transforms/IndVarSimplify/backedge-on-min-max.ll
    llvm/trunk/test/Transforms/IndVarSimplify/bec-cmp.ll
    llvm/trunk/test/Transforms/IndVarSimplify/canonicalize-cmp.ll
    llvm/trunk/test/Transforms/IndVarSimplify/casted-argument.ll
    llvm/trunk/test/Transforms/IndVarSimplify/const_phi.ll
    llvm/trunk/test/Transforms/IndVarSimplify/constant-fold.ll
    llvm/trunk/test/Transforms/IndVarSimplify/constant_result.ll
    llvm/trunk/test/Transforms/IndVarSimplify/crash.ll
    llvm/trunk/test/Transforms/IndVarSimplify/dangling-use.ll
    llvm/trunk/test/Transforms/IndVarSimplify/divide-pointer.ll
    llvm/trunk/test/Transforms/IndVarSimplify/dont-recompute.ll
    llvm/trunk/test/Transforms/IndVarSimplify/drop-exact.ll
    llvm/trunk/test/Transforms/IndVarSimplify/elim-extend.ll
    llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
    llvm/trunk/test/Transforms/IndVarSimplify/eliminate-max.ll
    llvm/trunk/test/Transforms/IndVarSimplify/eliminate-rem.ll
    llvm/trunk/test/Transforms/IndVarSimplify/eliminate-trunc.ll
    llvm/trunk/test/Transforms/IndVarSimplify/exit_value_test2.ll
    llvm/trunk/test/Transforms/IndVarSimplify/exit_value_test3.ll
    llvm/trunk/test/Transforms/IndVarSimplify/exit_value_tests.ll
    llvm/trunk/test/Transforms/IndVarSimplify/floating-point-iv.ll
    llvm/trunk/test/Transforms/IndVarSimplify/full_widening.ll
    llvm/trunk/test/Transforms/IndVarSimplify/huge_muls.ll
    llvm/trunk/test/Transforms/IndVarSimplify/indirectbr.ll
    llvm/trunk/test/Transforms/IndVarSimplify/inner-loop-by-latch-cond.ll
    llvm/trunk/test/Transforms/IndVarSimplify/inner-loop.ll
    llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iterationCount_zext_or_trunc.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iv-fold.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iv-sext.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iv-widen-elim-ext.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iv-widen.ll
    llvm/trunk/test/Transforms/IndVarSimplify/iv-zext.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lcssa-preservation.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-address-space-pointers.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-extend-const.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-other-uses.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-promote.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-reuse.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-udiv-tripcount.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-wide-trip-count.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr-zext.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr_disabled.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lftr_simple.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop-invariant-conditions.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate10.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate11.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate7.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate8.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate9.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_1.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_2.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_3.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_4.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_5.ll
    llvm/trunk/test/Transforms/IndVarSimplify/loop_evaluate_6.ll
    llvm/trunk/test/Transforms/IndVarSimplify/lrev-existing-umin.ll
    llvm/trunk/test/Transforms/IndVarSimplify/masked-iv.ll
    llvm/trunk/test/Transforms/IndVarSimplify/no-iv-rewrite.ll
    llvm/trunk/test/Transforms/IndVarSimplify/overflow-intrinsics.ll
    llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll
    llvm/trunk/test/Transforms/IndVarSimplify/polynomial-expand.ll
    llvm/trunk/test/Transforms/IndVarSimplify/post-inc-range.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr18223.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr20680.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr22222.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr24356.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr24783.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr24804.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr24952.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr24956.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25047.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25051.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25060.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25360.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25421.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25576.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr25578.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr26973.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr26974.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr27133.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr28935.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr32045.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr35406.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr38674.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr38855.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr39673.ll
    llvm/trunk/test/Transforms/IndVarSimplify/pr40454.ll
    llvm/trunk/test/Transforms/IndVarSimplify/preserve-signed-wrap.ll
    llvm/trunk/test/Transforms/IndVarSimplify/promote-iv-to-eliminate-casts.ll
    llvm/trunk/test/Transforms/IndVarSimplify/replace-iv-with-loop-invariant.ll
    llvm/trunk/test/Transforms/IndVarSimplify/replace-loop-exit-folds.ll
    llvm/trunk/test/Transforms/IndVarSimplify/replace-sdiv-by-udiv.ll
    llvm/trunk/test/Transforms/IndVarSimplify/replace-srem-by-urem.ll
    llvm/trunk/test/Transforms/IndVarSimplify/rewrite-loop-exit-value.ll
    llvm/trunk/test/Transforms/IndVarSimplify/scev-phi-debug-info.ll
    llvm/trunk/test/Transforms/IndVarSimplify/scevexpander-phi-base-case.ll
    llvm/trunk/test/Transforms/IndVarSimplify/sharpen-range.ll
    llvm/trunk/test/Transforms/IndVarSimplify/shrunk-constant.ll
    llvm/trunk/test/Transforms/IndVarSimplify/signed-trip-count.ll
    llvm/trunk/test/Transforms/IndVarSimplify/single-element-range.ll
    llvm/trunk/test/Transforms/IndVarSimplify/sink-alloca.ll
    llvm/trunk/test/Transforms/IndVarSimplify/sink-from-preheader.ll
    llvm/trunk/test/Transforms/IndVarSimplify/sink-trapping.ll
    llvm/trunk/test/Transforms/IndVarSimplify/strengthen-overflow.ll
    llvm/trunk/test/Transforms/IndVarSimplify/tripcount_compute.ll
    llvm/trunk/test/Transforms/IndVarSimplify/tripcount_infinite.ll
    llvm/trunk/test/Transforms/IndVarSimplify/udiv-invariant-but-traps.ll
    llvm/trunk/test/Transforms/IndVarSimplify/udiv.ll
    llvm/trunk/test/Transforms/IndVarSimplify/uglygep.ll
    llvm/trunk/test/Transforms/IndVarSimplify/ult-sub-to-eq.ll
    llvm/trunk/test/Transforms/IndVarSimplify/use-range-metadata.ll
    llvm/trunk/test/Transforms/IndVarSimplify/variable-stride-ivs-0.ll
    llvm/trunk/test/Transforms/IndVarSimplify/variable-stride-ivs-1.ll
    llvm/trunk/test/Transforms/IndVarSimplify/verify-scev.ll
    llvm/trunk/test/Transforms/IndVarSimplify/widen-loop-comp.ll
    llvm/trunk/test/Transforms/IndVarSimplify/widen-nsw.ll
    llvm/trunk/test/Transforms/IndVarSimplify/zext-nuw.ll
    llvm/trunk/test/Transforms/IndirectBrExpand/
    llvm/trunk/test/Transforms/IndirectBrExpand/basic.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/basic.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/icmp.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-address-space.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-addrspacecast.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/infer-getelementptr.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/intrinsics.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/mem-intrinsics.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/old-pass-regressions.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/select.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/AMDGPU/volatile.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/
    llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/bug31948.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/clone_constexpr.ll
    llvm/trunk/test/Transforms/InferAddressSpaces/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/InferFunctionAttrs/
    llvm/trunk/test/Transforms/InferFunctionAttrs/annotate.ll
    llvm/trunk/test/Transforms/InferFunctionAttrs/no-proto.ll
    llvm/trunk/test/Transforms/InferFunctionAttrs/norecurse_debug.ll
    llvm/trunk/test/Transforms/InferFunctionAttrs/pr30455.ll
    llvm/trunk/test/Transforms/Inline/
    llvm/trunk/test/Transforms/Inline/2003-09-14-InlineValue.ll
    llvm/trunk/test/Transforms/Inline/2003-09-22-PHINodeInlineFail.ll
    llvm/trunk/test/Transforms/Inline/2003-09-22-PHINodesInExceptionDest.ll
    llvm/trunk/test/Transforms/Inline/2003-09-22-PHINodesInNormalInvokeDest.ll
    llvm/trunk/test/Transforms/Inline/2003-10-13-AllocaDominanceProblem.ll
    llvm/trunk/test/Transforms/Inline/2004-04-15-InlineDeletesCall.ll
    llvm/trunk/test/Transforms/Inline/2004-04-20-InlineLinkOnce.ll
    llvm/trunk/test/Transforms/Inline/2004-10-17-InlineFunctionWithoutReturn.ll
    llvm/trunk/test/Transforms/Inline/2006-01-14-CallGraphUpdate.ll
    llvm/trunk/test/Transforms/Inline/2006-07-12-InlinePruneCGUpdate.ll
    llvm/trunk/test/Transforms/Inline/2006-11-09-InlineCGUpdate-2.ll
    llvm/trunk/test/Transforms/Inline/2006-11-09-InlineCGUpdate.ll
    llvm/trunk/test/Transforms/Inline/2007-04-15-InlineEH.ll
    llvm/trunk/test/Transforms/Inline/2007-06-25-WeakInline.ll
    llvm/trunk/test/Transforms/Inline/2007-12-19-InlineNoUnwind.ll
    llvm/trunk/test/Transforms/Inline/2008-09-02-NoInline.ll
    llvm/trunk/test/Transforms/Inline/2009-01-08-NoInlineDynamicAlloca.ll
    llvm/trunk/test/Transforms/Inline/2009-01-13-RecursiveInlineCrash.ll
    llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll
    llvm/trunk/test/Transforms/Inline/2010-05-12-ValueMap.ll
    llvm/trunk/test/Transforms/Inline/AArch64/
    llvm/trunk/test/Transforms/Inline/AArch64/binop.ll
    llvm/trunk/test/Transforms/Inline/AArch64/ext.ll
    llvm/trunk/test/Transforms/Inline/AArch64/gep-cost.ll
    llvm/trunk/test/Transforms/Inline/AArch64/inline-target-attr.ll
    llvm/trunk/test/Transforms/Inline/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/Inline/AArch64/logical-and-or.ll
    llvm/trunk/test/Transforms/Inline/AArch64/phi.ll
    llvm/trunk/test/Transforms/Inline/AArch64/select.ll
    llvm/trunk/test/Transforms/Inline/AArch64/switch.ll
    llvm/trunk/test/Transforms/Inline/AMDGPU/
    llvm/trunk/test/Transforms/Inline/AMDGPU/inline-amdgpu-dx10-clamp.ll
    llvm/trunk/test/Transforms/Inline/AMDGPU/inline-amdgpu-ieee.ll
    llvm/trunk/test/Transforms/Inline/AMDGPU/inline-target-cpu.ll
    llvm/trunk/test/Transforms/Inline/AMDGPU/inline-target-feature-sram-ecc.ll
    llvm/trunk/test/Transforms/Inline/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/Inline/ARM/
    llvm/trunk/test/Transforms/Inline/ARM/inline-fp.ll
    llvm/trunk/test/Transforms/Inline/ARM/inline-target-attr.ll
    llvm/trunk/test/Transforms/Inline/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/Inline/ARM/loop-add.ll
    llvm/trunk/test/Transforms/Inline/ARM/loop-memcpy.ll
    llvm/trunk/test/Transforms/Inline/ARM/loop-noinline.ll
    llvm/trunk/test/Transforms/Inline/PR4909.ll
    llvm/trunk/test/Transforms/Inline/PowerPC/
    llvm/trunk/test/Transforms/Inline/PowerPC/ext.ll
    llvm/trunk/test/Transforms/Inline/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/Inline/X86/
    llvm/trunk/test/Transforms/Inline/X86/ext.ll
    llvm/trunk/test/Transforms/Inline/X86/inline-target-attr.ll
    llvm/trunk/test/Transforms/Inline/X86/inline-target-cpu-i686.ll
    llvm/trunk/test/Transforms/Inline/X86/inline-target-cpu-x86_64.ll
    llvm/trunk/test/Transforms/Inline/X86/lit.local.cfg
    llvm/trunk/test/Transforms/Inline/align.ll
    llvm/trunk/test/Transforms/Inline/alloca-bonus.ll
    llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare-merge.ll
    llvm/trunk/test/Transforms/Inline/alloca-dbgdeclare.ll
    llvm/trunk/test/Transforms/Inline/alloca-in-scc.ll
    llvm/trunk/test/Transforms/Inline/alloca-merge-align.ll
    llvm/trunk/test/Transforms/Inline/alloca_test.ll
    llvm/trunk/test/Transforms/Inline/always-inline.ll
    llvm/trunk/test/Transforms/Inline/arg-attr-propagation.ll
    llvm/trunk/test/Transforms/Inline/array-alloca.ll
    llvm/trunk/test/Transforms/Inline/array_merge.ll
    llvm/trunk/test/Transforms/Inline/attributes.ll
    llvm/trunk/test/Transforms/Inline/basictest.ll
    llvm/trunk/test/Transforms/Inline/bfi-update.ll
    llvm/trunk/test/Transforms/Inline/blockaddress.ll
    llvm/trunk/test/Transforms/Inline/byval-tail-call.ll
    llvm/trunk/test/Transforms/Inline/byval.ll
    llvm/trunk/test/Transforms/Inline/byval_lifetime.ll
    llvm/trunk/test/Transforms/Inline/callgraph-update.ll
    llvm/trunk/test/Transforms/Inline/casts.ll
    llvm/trunk/test/Transforms/Inline/cfg_preserve_test.ll
    llvm/trunk/test/Transforms/Inline/cgscc-cycle.ll
    llvm/trunk/test/Transforms/Inline/cgscc-incremental-invalidate.ll
    llvm/trunk/test/Transforms/Inline/cgscc-invalidate.ll
    llvm/trunk/test/Transforms/Inline/cgscc-update.ll
    llvm/trunk/test/Transforms/Inline/clear-analyses.ll
    llvm/trunk/test/Transforms/Inline/comdat-ipo.ll
    llvm/trunk/test/Transforms/Inline/crash-lifetime-marker.ll
    llvm/trunk/test/Transforms/Inline/crash.ll
    llvm/trunk/test/Transforms/Inline/crash2.ll
    llvm/trunk/test/Transforms/Inline/debug-info-duplicate-calls.ll
    llvm/trunk/test/Transforms/Inline/debug-invoke.ll
    llvm/trunk/test/Transforms/Inline/delete-call.ll
    llvm/trunk/test/Transforms/Inline/deopt-bundles.ll
    llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic-cconv.ll
    llvm/trunk/test/Transforms/Inline/deoptimize-intrinsic.ll
    llvm/trunk/test/Transforms/Inline/devirtualize-2.ll
    llvm/trunk/test/Transforms/Inline/devirtualize-3.ll
    llvm/trunk/test/Transforms/Inline/devirtualize.ll
    llvm/trunk/test/Transforms/Inline/dynamic_alloca_test.ll
    llvm/trunk/test/Transforms/Inline/ephemeral.ll
    llvm/trunk/test/Transforms/Inline/externally_available.ll
    llvm/trunk/test/Transforms/Inline/frameescape.ll
    llvm/trunk/test/Transforms/Inline/function-count-update-2.ll
    llvm/trunk/test/Transforms/Inline/function-count-update-3.ll
    llvm/trunk/test/Transforms/Inline/function-count-update.ll
    llvm/trunk/test/Transforms/Inline/guard-intrinsic.ll
    llvm/trunk/test/Transforms/Inline/gvn-inline-iteration.ll
    llvm/trunk/test/Transforms/Inline/ignore-debug-info.ll
    llvm/trunk/test/Transforms/Inline/inalloca-not-static.ll
    llvm/trunk/test/Transforms/Inline/infinite-loop-two-predecessors.ll
    llvm/trunk/test/Transforms/Inline/inline-assume.ll
    llvm/trunk/test/Transforms/Inline/inline-brunch-funnel.ll
    llvm/trunk/test/Transforms/Inline/inline-byval-bonus.ll
    llvm/trunk/test/Transforms/Inline/inline-cold-callee.ll
    llvm/trunk/test/Transforms/Inline/inline-cold-callsite-pgo.ll
    llvm/trunk/test/Transforms/Inline/inline-cold-callsite.ll
    llvm/trunk/test/Transforms/Inline/inline-cold.ll
    llvm/trunk/test/Transforms/Inline/inline-constexpr-addrspacecast-argument.ll
    llvm/trunk/test/Transforms/Inline/inline-fast-math-flags.ll
    llvm/trunk/test/Transforms/Inline/inline-funclets.ll
    llvm/trunk/test/Transforms/Inline/inline-hot-callee.ll
    llvm/trunk/test/Transforms/Inline/inline-hot-callsite-2.ll
    llvm/trunk/test/Transforms/Inline/inline-hot-callsite.ll
    llvm/trunk/test/Transforms/Inline/inline-indirect.ll
    llvm/trunk/test/Transforms/Inline/inline-invoke-tail.ll
    llvm/trunk/test/Transforms/Inline/inline-invoke-with-asm-call.ll
    llvm/trunk/test/Transforms/Inline/inline-min-legal-vector-width.ll
    llvm/trunk/test/Transforms/Inline/inline-optnone.ll
    llvm/trunk/test/Transforms/Inline/inline-optsize.ll
    llvm/trunk/test/Transforms/Inline/inline-probe-stack.ll
    llvm/trunk/test/Transforms/Inline/inline-remark.ll
    llvm/trunk/test/Transforms/Inline/inline-stack-probe-size.ll
    llvm/trunk/test/Transforms/Inline/inline-tail.ll
    llvm/trunk/test/Transforms/Inline/inline-threshold.ll
    llvm/trunk/test/Transforms/Inline/inline-varargs.ll
    llvm/trunk/test/Transforms/Inline/inline-vla.ll
    llvm/trunk/test/Transforms/Inline/inline_cleanup.ll
    llvm/trunk/test/Transforms/Inline/inline_constprop.ll
    llvm/trunk/test/Transforms/Inline/inline_dbg_declare.ll
    llvm/trunk/test/Transforms/Inline/inline_dce.ll
    llvm/trunk/test/Transforms/Inline/inline_inv_group.ll
    llvm/trunk/test/Transforms/Inline/inline_invoke.ll
    llvm/trunk/test/Transforms/Inline/inline_minisize.ll
    llvm/trunk/test/Transforms/Inline/inline_prune.ll
    llvm/trunk/test/Transforms/Inline/inline_returns_twice.ll
    llvm/trunk/test/Transforms/Inline/inline_ssp.ll
    llvm/trunk/test/Transforms/Inline/inline_stats.ll
    llvm/trunk/test/Transforms/Inline/inline_unreachable-2.ll
    llvm/trunk/test/Transforms/Inline/inline_unreachable.ll
    llvm/trunk/test/Transforms/Inline/internal-scc-members.ll
    llvm/trunk/test/Transforms/Inline/invoke-cleanup.ll
    llvm/trunk/test/Transforms/Inline/invoke-combine-clauses.ll
    llvm/trunk/test/Transforms/Inline/invoke-cost.ll
    llvm/trunk/test/Transforms/Inline/invoke_test-1.ll
    llvm/trunk/test/Transforms/Inline/invoke_test-2.ll
    llvm/trunk/test/Transforms/Inline/invoke_test-3.ll
    llvm/trunk/test/Transforms/Inline/label-annotation.ll
    llvm/trunk/test/Transforms/Inline/last-call-bonus.ll
    llvm/trunk/test/Transforms/Inline/last-call-no-bonus.ll
    llvm/trunk/test/Transforms/Inline/last-callsite.ll
    llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll
    llvm/trunk/test/Transforms/Inline/lifetime-no-datalayout.ll
    llvm/trunk/test/Transforms/Inline/lifetime.ll
    llvm/trunk/test/Transforms/Inline/local-as-metadata-undominated-use.ll
    llvm/trunk/test/Transforms/Inline/monster_scc.ll
    llvm/trunk/test/Transforms/Inline/nested-inline.ll
    llvm/trunk/test/Transforms/Inline/noalias-calls.ll
    llvm/trunk/test/Transforms/Inline/noalias-cs.ll
    llvm/trunk/test/Transforms/Inline/noalias.ll
    llvm/trunk/test/Transforms/Inline/noalias2.ll
    llvm/trunk/test/Transforms/Inline/noinline-recursive-fn.ll
    llvm/trunk/test/Transforms/Inline/noinline.ll
    llvm/trunk/test/Transforms/Inline/nonnull.ll
    llvm/trunk/test/Transforms/Inline/null-function.ll
    llvm/trunk/test/Transforms/Inline/optimization-remarks-hotness-threshold.ll
    llvm/trunk/test/Transforms/Inline/optimization-remarks-passed-yaml.ll
    llvm/trunk/test/Transforms/Inline/optimization-remarks-with-hotness.ll
    llvm/trunk/test/Transforms/Inline/optimization-remarks-yaml.ll
    llvm/trunk/test/Transforms/Inline/optimization-remarks.ll
    llvm/trunk/test/Transforms/Inline/parallel-loop-md-callee.ll
    llvm/trunk/test/Transforms/Inline/parallel-loop-md-merge.ll
    llvm/trunk/test/Transforms/Inline/parallel-loop-md.ll
    llvm/trunk/test/Transforms/Inline/partial-inline-act.ll
    llvm/trunk/test/Transforms/Inline/pr21206.ll
    llvm/trunk/test/Transforms/Inline/pr22285.ll
    llvm/trunk/test/Transforms/Inline/pr26698.ll
    llvm/trunk/test/Transforms/Inline/pr28298.ll
    llvm/trunk/test/Transforms/Inline/pr33637.ll
    llvm/trunk/test/Transforms/Inline/prof-update-instr.ll
    llvm/trunk/test/Transforms/Inline/prof-update-sample.ll
    llvm/trunk/test/Transforms/Inline/profile-meta.ll
    llvm/trunk/test/Transforms/Inline/ptr-diff.ll
    llvm/trunk/test/Transforms/Inline/recursive.ll
    llvm/trunk/test/Transforms/Inline/redundant-loads.ll
    llvm/trunk/test/Transforms/Inline/store-sroa.ll
    llvm/trunk/test/Transforms/Inline/switch.ll
    llvm/trunk/test/Transforms/Inline/vector-bonus.ll
    llvm/trunk/test/Transforms/Inline/vector-no-bonus.ll
    llvm/trunk/test/Transforms/Inline/zero-cost.ll
    llvm/trunk/test/Transforms/InstCombine/
    llvm/trunk/test/Transforms/InstCombine/2003-05-26-CastMiscompile.ll
    llvm/trunk/test/Transforms/InstCombine/2003-05-27-ConstExprCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2003-06-05-BranchInvertInfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2003-07-21-ExternalConstant.ll
    llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll
    llvm/trunk/test/Transforms/InstCombine/2003-09-09-VolatileLoadElim.ll
    llvm/trunk/test/Transforms/InstCombine/2003-10-29-CallSiteResolve.ll
    llvm/trunk/test/Transforms/InstCombine/2003-11-03-VarargsCallBug.ll
    llvm/trunk/test/Transforms/InstCombine/2004-01-13-InstCombineInvokePHI.ll
    llvm/trunk/test/Transforms/InstCombine/2004-02-23-ShiftShiftOverflow.ll
    llvm/trunk/test/Transforms/InstCombine/2004-03-13-InstCombineInfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2004-04-04-InstCombineReplaceAllUsesWith.ll
    llvm/trunk/test/Transforms/InstCombine/2004-05-07-UnsizedCastLoad.ll
    llvm/trunk/test/Transforms/InstCombine/2004-07-27-ConstantExprMul.ll
    llvm/trunk/test/Transforms/InstCombine/2004-08-09-RemInfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2004-08-10-BoolSetCC.ll
    llvm/trunk/test/Transforms/InstCombine/2004-09-20-BadLoadCombine.ll
    llvm/trunk/test/Transforms/InstCombine/2004-09-20-BadLoadCombine2.ll
    llvm/trunk/test/Transforms/InstCombine/2004-09-28-BadShiftAndSetCC.ll
    llvm/trunk/test/Transforms/InstCombine/2004-11-22-Missed-and-fold.ll
    llvm/trunk/test/Transforms/InstCombine/2004-11-27-SetCCForCastLargerAndConstant.ll
    llvm/trunk/test/Transforms/InstCombine/2004-12-08-RemInfiniteLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2005-03-04-ShiftOverflow.ll
    llvm/trunk/test/Transforms/InstCombine/2005-04-07-UDivSelectCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2005-06-15-DivSelectCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2005-06-15-ShiftSetCCCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2005-06-16-RangeCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2005-07-07-DeadPHILoop.ll
    llvm/trunk/test/Transforms/InstCombine/2006-02-13-DemandedMiscompile.ll
    llvm/trunk/test/Transforms/InstCombine/2006-02-28-Crash.ll
    llvm/trunk/test/Transforms/InstCombine/2006-03-30-ExtractElement.ll
    llvm/trunk/test/Transforms/InstCombine/2006-04-28-ShiftShiftLongLong.ll
    llvm/trunk/test/Transforms/InstCombine/2006-05-04-DemandedBitCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2006-09-15-CastToBool.ll
    llvm/trunk/test/Transforms/InstCombine/2006-10-19-SignedToUnsignedCastAndConst-2.ll
    llvm/trunk/test/Transforms/InstCombine/2006-10-20-mask.ll
    llvm/trunk/test/Transforms/InstCombine/2006-10-26-VectorReassoc.ll
    llvm/trunk/test/Transforms/InstCombine/2006-11-10-ashr-miscompile.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-01-BadFPVectorXform.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-05-fp-to-int-ext.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-08-Phi-ICmp-Op-Fold.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-08-Select-ICmp.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-15-Range-Test.ll
    llvm/trunk/test/Transforms/InstCombine/2006-12-23-Select-Cmp-Cmp.ll
    llvm/trunk/test/Transforms/InstCombine/2007-01-13-ExtCompareMiscompile.ll
    llvm/trunk/test/Transforms/InstCombine/2007-01-18-VectorInfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2007-02-01-LoadSinkAlloca.ll
    llvm/trunk/test/Transforms/InstCombine/2007-02-07-PointerCast.ll
    llvm/trunk/test/Transforms/InstCombine/2007-02-23-PhiFoldInfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-13-CompareMerge.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-19-BadTruncChangePR1261.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-21-SignedRangeTest.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-25-BadShiftMask.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-25-DoubleShift.ll
    llvm/trunk/test/Transforms/InstCombine/2007-03-26-BadShiftMask.ll
    llvm/trunk/test/Transforms/InstCombine/2007-04-08-SingleEltVectorCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-05-10-icmp-or.ll
    llvm/trunk/test/Transforms/InstCombine/2007-05-14-Crash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-05-18-CastFoldBug.ll
    llvm/trunk/test/Transforms/InstCombine/2007-06-06-AshrSignBit.ll
    llvm/trunk/test/Transforms/InstCombine/2007-06-21-DivCompareMiscomp.ll
    llvm/trunk/test/Transforms/InstCombine/2007-08-02-InfiniteLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2007-09-10-AliasConstFold.ll
    llvm/trunk/test/Transforms/InstCombine/2007-09-17-AliasConstFold2.ll
    llvm/trunk/test/Transforms/InstCombine/2007-10-10-EliminateMemCpy.ll
    llvm/trunk/test/Transforms/InstCombine/2007-10-12-Crash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-10-28-stacksave.ll
    llvm/trunk/test/Transforms/InstCombine/2007-10-31-RangeCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-10-31-StringCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-11-07-OpaqueAlignCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2007-11-15-CompareMiscomp.ll
    llvm/trunk/test/Transforms/InstCombine/2007-11-25-CompatibleAttributes.ll
    llvm/trunk/test/Transforms/InstCombine/2007-12-10-ConstFoldCompare.ll
    llvm/trunk/test/Transforms/InstCombine/2007-12-12-GEPScale.ll
    llvm/trunk/test/Transforms/InstCombine/2007-12-16-AsmNoUnwind.ll
    llvm/trunk/test/Transforms/InstCombine/2007-12-18-AddSelCmpSub.ll
    llvm/trunk/test/Transforms/InstCombine/2007-12-28-IcmpSub2.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-06-CastCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-06-VoidCast.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-14-VarArgTrampoline.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-21-MismatchedCastAndCompare.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-21-MulTrunc.ll
    llvm/trunk/test/Transforms/InstCombine/2008-01-27-FloatSelect.ll
    llvm/trunk/test/Transforms/InstCombine/2008-02-13-MulURem.ll
    llvm/trunk/test/Transforms/InstCombine/2008-02-16-SDivOverflow2.ll
    llvm/trunk/test/Transforms/InstCombine/2008-02-23-MulSub.ll
    llvm/trunk/test/Transforms/InstCombine/2008-02-28-OrFCmpCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2008-03-13-IntToPtr.ll
    llvm/trunk/test/Transforms/InstCombine/2008-04-22-ByValBitcast.ll
    llvm/trunk/test/Transforms/InstCombine/2008-04-28-VolatileStore.ll
    llvm/trunk/test/Transforms/InstCombine/2008-04-29-VolatileLoadDontMerge.ll
    llvm/trunk/test/Transforms/InstCombine/2008-04-29-VolatileLoadMerge.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-08-LiveStoreDelete.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-08-StrLenSink.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-09-SinkOfInvoke.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-17-InfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-18-FoldIntToPtr.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-22-IDivVector.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-23-CompareFold.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-31-AddBool.ll
    llvm/trunk/test/Transforms/InstCombine/2008-05-31-Bools.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-05-ashr-crash.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-08-ICmpPHI.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-13-InfiniteLoopStore.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-13-ReadOnlyCallStore.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-19-UncondLoad.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-21-CompareMiscomp.ll
    llvm/trunk/test/Transforms/InstCombine/2008-06-24-StackRestore.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-08-ShiftOneAndOne.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-08-SubAnd.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-08-VolatileLoadMerge.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-09-SubAndError.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-10-CastSextBool.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-11-RemAnd.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-13-DivZero.ll
    llvm/trunk/test/Transforms/InstCombine/2008-07-16-fsub.ll
    llvm/trunk/test/Transforms/InstCombine/2008-08-05-And.ll
    llvm/trunk/test/Transforms/InstCombine/2008-09-02-VectorCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2008-10-11-DivCompareFold.ll
    llvm/trunk/test/Transforms/InstCombine/2008-10-23-ConstFoldWithoutMask.ll
    llvm/trunk/test/Transforms/InstCombine/2008-11-01-SRemDemandedBits.ll
    llvm/trunk/test/Transforms/InstCombine/2008-11-08-FCmp.ll
    llvm/trunk/test/Transforms/InstCombine/2008-11-27-IDivVector.ll
    llvm/trunk/test/Transforms/InstCombine/2008-11-27-MultiplyIntVec.ll
    llvm/trunk/test/Transforms/InstCombine/2008-12-17-SRemNegConstVec.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-05-i128-crash.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-08-AlignAlloca.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-16-PointerAddrSpace.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-19-fmod-constant-float-specials.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-19-fmod-constant-float.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-24-EmptyStruct.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-31-InfIterate.ll
    llvm/trunk/test/Transforms/InstCombine/2009-01-31-Pressure.ll
    llvm/trunk/test/Transforms/InstCombine/2009-02-04-FPBitcast.ll
    llvm/trunk/test/Transforms/InstCombine/2009-02-11-NotInitialized.ll
    llvm/trunk/test/Transforms/InstCombine/2009-02-20-InstCombine-SROA.ll
    llvm/trunk/test/Transforms/InstCombine/2009-02-21-LoadCST.ll
    llvm/trunk/test/Transforms/InstCombine/2009-02-25-CrashZeroSizeArray.ll
    llvm/trunk/test/Transforms/InstCombine/2009-03-18-vector-ashr-crash.ll
    llvm/trunk/test/Transforms/InstCombine/2009-03-24-InfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2009-04-07-MulPromoteToI96.ll
    llvm/trunk/test/Transforms/InstCombine/2009-05-23-FCmpToICmp.ll
    llvm/trunk/test/Transforms/InstCombine/2009-06-11-StoreAddrSpace.ll
    llvm/trunk/test/Transforms/InstCombine/2009-06-16-SRemDemandedBits.ll
    llvm/trunk/test/Transforms/InstCombine/2009-07-02-MaskedIntVector.ll
    llvm/trunk/test/Transforms/InstCombine/2009-12-17-CmpSelectNull.ll
    llvm/trunk/test/Transforms/InstCombine/2010-01-28-NegativeSRem.ll
    llvm/trunk/test/Transforms/InstCombine/2010-03-03-ExtElim.ll
    llvm/trunk/test/Transforms/InstCombine/2010-05-30-memcpy-Struct.ll
    llvm/trunk/test/Transforms/InstCombine/2010-11-01-lshr-mask.ll
    llvm/trunk/test/Transforms/InstCombine/2010-11-21-SizeZeroTypeGEP.ll
    llvm/trunk/test/Transforms/InstCombine/2010-11-23-Distributed.ll
    llvm/trunk/test/Transforms/InstCombine/2011-02-14-InfLoop.ll
    llvm/trunk/test/Transforms/InstCombine/2011-03-08-SRemMinusOneBadOpt.ll
    llvm/trunk/test/Transforms/InstCombine/2011-05-02-VectorBoolean.ll
    llvm/trunk/test/Transforms/InstCombine/2011-05-13-InBoundsGEP.ll
    llvm/trunk/test/Transforms/InstCombine/2011-05-28-swapmulsub.ll
    llvm/trunk/test/Transforms/InstCombine/2011-06-13-nsw-alloca.ll
    llvm/trunk/test/Transforms/InstCombine/2011-09-03-Trampoline.ll
    llvm/trunk/test/Transforms/InstCombine/2011-10-07-AlignPromotion.ll
    llvm/trunk/test/Transforms/InstCombine/2012-01-11-OpaqueBitcastCrash.ll
    llvm/trunk/test/Transforms/InstCombine/2012-02-13-FCmp.ll
    llvm/trunk/test/Transforms/InstCombine/2012-02-28-ICmp.ll
    llvm/trunk/test/Transforms/InstCombine/2012-03-10-InstCombine.ll
    llvm/trunk/test/Transforms/InstCombine/2012-04-24-vselect.ll
    llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll
    llvm/trunk/test/Transforms/InstCombine/2012-05-28-select-hang.ll
    llvm/trunk/test/Transforms/InstCombine/2012-06-06-LoadOfPHIs.ll
    llvm/trunk/test/Transforms/InstCombine/2012-07-25-LoadPart.ll
    llvm/trunk/test/Transforms/InstCombine/2012-07-30-addrsp-bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/2012-08-28-udiv_ashl.ll
    llvm/trunk/test/Transforms/InstCombine/2012-09-17-ZeroSizedAlloca.ll
    llvm/trunk/test/Transforms/InstCombine/2012-10-25-vector-of-pointers.ll
    llvm/trunk/test/Transforms/InstCombine/2012-12-14-simp-vgep.ll
    llvm/trunk/test/Transforms/InstCombine/2012-3-15-or-xor-constant.ll
    llvm/trunk/test/Transforms/InstCombine/2012-6-7-vselect-bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/2013-03-05-Combine-BitcastTy-Into-Alloca.ll
    llvm/trunk/test/Transforms/InstCombine/AArch64/
    llvm/trunk/test/Transforms/InstCombine/AArch64/2012-04-23-Neon-Intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/AArch64/aes-intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/AArch64/tbl1.ll
    llvm/trunk/test/Transforms/InstCombine/AMDGPU/
    llvm/trunk/test/Transforms/InstCombine/AMDGPU/amdgcn-demanded-vector-elts.ll
    llvm/trunk/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/ARM/
    llvm/trunk/test/Transforms/InstCombine/ARM/2012-04-23-Neon-Intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/aes-intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/constant-fold-hang.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/ARM/neon-intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/strcmp.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/strcpy.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/tbl1.ll
    llvm/trunk/test/Transforms/InstCombine/ARM/vld1.ll
    llvm/trunk/test/Transforms/InstCombine/AddOverFlow.ll
    llvm/trunk/test/Transforms/InstCombine/CPP_min_max.ll
    llvm/trunk/test/Transforms/InstCombine/ExtractCast.ll
    llvm/trunk/test/Transforms/InstCombine/IntPtrCast.ll
    llvm/trunk/test/Transforms/InstCombine/JavaCompare.ll
    llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll
    llvm/trunk/test/Transforms/InstCombine/NVPTX/
    llvm/trunk/test/Transforms/InstCombine/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/NVPTX/nvvm-intrins.ll
    llvm/trunk/test/Transforms/InstCombine/OverlappingInsertvalues.ll
    llvm/trunk/test/Transforms/InstCombine/PR30597.ll
    llvm/trunk/test/Transforms/InstCombine/PR37526.ll
    llvm/trunk/test/Transforms/InstCombine/PowerPC/
    llvm/trunk/test/Transforms/InstCombine/PowerPC/aligned-altivec.ll
    llvm/trunk/test/Transforms/InstCombine/PowerPC/aligned-qpx.ll
    llvm/trunk/test/Transforms/InstCombine/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/PowerPC/vsx-unaligned.ll
    llvm/trunk/test/Transforms/InstCombine/README.txt
    llvm/trunk/test/Transforms/InstCombine/X86/
    llvm/trunk/test/Transforms/InstCombine/X86/X86FsubCmpCombine.ll
    llvm/trunk/test/Transforms/InstCombine/X86/addcarry.ll
    llvm/trunk/test/Transforms/InstCombine/X86/blend_x86.ll
    llvm/trunk/test/Transforms/InstCombine/X86/clmulqdq.ll
    llvm/trunk/test/Transforms/InstCombine/X86/lit.local.cfg
    llvm/trunk/test/Transforms/InstCombine/X86/pr2645-1.ll
    llvm/trunk/test/Transforms/InstCombine/X86/shufflemask-undef.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-avx.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-avx2.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-avx512.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-bmi-tbm.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-crc32-demanded.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-f16c.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-fma.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-insertps.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-masked-memops.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-movmsk.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-muldq.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-pack.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-pshufb.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-sse.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-sse2.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-sse41.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-sse4a.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-vec_demanded_elts.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-vector-shifts.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-vpermil.ll
    llvm/trunk/test/Transforms/InstCombine/X86/x86-xop.ll
    llvm/trunk/test/Transforms/InstCombine/abs-1.ll
    llvm/trunk/test/Transforms/InstCombine/abs_abs.ll
    llvm/trunk/test/Transforms/InstCombine/add-sitofp.ll
    llvm/trunk/test/Transforms/InstCombine/add.ll
    llvm/trunk/test/Transforms/InstCombine/add2.ll
    llvm/trunk/test/Transforms/InstCombine/add3.ll
    llvm/trunk/test/Transforms/InstCombine/add4.ll
    llvm/trunk/test/Transforms/InstCombine/addnegneg.ll
    llvm/trunk/test/Transforms/InstCombine/addrspacecast.ll
    llvm/trunk/test/Transforms/InstCombine/adjust-for-minmax.ll
    llvm/trunk/test/Transforms/InstCombine/alias-recursion.ll
    llvm/trunk/test/Transforms/InstCombine/align-2d-gep.ll
    llvm/trunk/test/Transforms/InstCombine/align-addr.ll
    llvm/trunk/test/Transforms/InstCombine/align-attr.ll
    llvm/trunk/test/Transforms/InstCombine/align-external.ll
    llvm/trunk/test/Transforms/InstCombine/all-bits-shift.ll
    llvm/trunk/test/Transforms/InstCombine/alloca-big.ll
    llvm/trunk/test/Transforms/InstCombine/alloca-cast-debuginfo.ll
    llvm/trunk/test/Transforms/InstCombine/alloca.ll
    llvm/trunk/test/Transforms/InstCombine/allocsize-32.ll
    llvm/trunk/test/Transforms/InstCombine/allocsize.ll
    llvm/trunk/test/Transforms/InstCombine/and-compare.ll
    llvm/trunk/test/Transforms/InstCombine/and-fcmp.ll
    llvm/trunk/test/Transforms/InstCombine/and-narrow.ll
    llvm/trunk/test/Transforms/InstCombine/and-or-and.ll
    llvm/trunk/test/Transforms/InstCombine/and-or-icmps.ll
    llvm/trunk/test/Transforms/InstCombine/and-or-not.ll
    llvm/trunk/test/Transforms/InstCombine/and-or.ll
    llvm/trunk/test/Transforms/InstCombine/and-xor-merge.ll
    llvm/trunk/test/Transforms/InstCombine/and-xor-or.ll
    llvm/trunk/test/Transforms/InstCombine/and.ll
    llvm/trunk/test/Transforms/InstCombine/and2.ll
    llvm/trunk/test/Transforms/InstCombine/apint-add.ll
    llvm/trunk/test/Transforms/InstCombine/apint-and-compare.ll
    llvm/trunk/test/Transforms/InstCombine/apint-and-or-and.ll
    llvm/trunk/test/Transforms/InstCombine/apint-and-xor-merge.ll
    llvm/trunk/test/Transforms/InstCombine/apint-and.ll
    llvm/trunk/test/Transforms/InstCombine/apint-call-cast-target.ll
    llvm/trunk/test/Transforms/InstCombine/apint-cast-and-cast.ll
    llvm/trunk/test/Transforms/InstCombine/apint-cast-cast-to-and.ll
    llvm/trunk/test/Transforms/InstCombine/apint-cast.ll
    llvm/trunk/test/Transforms/InstCombine/apint-div1.ll
    llvm/trunk/test/Transforms/InstCombine/apint-div2.ll
    llvm/trunk/test/Transforms/InstCombine/apint-mul1.ll
    llvm/trunk/test/Transforms/InstCombine/apint-mul2.ll
    llvm/trunk/test/Transforms/InstCombine/apint-not.ll
    llvm/trunk/test/Transforms/InstCombine/apint-or.ll
    llvm/trunk/test/Transforms/InstCombine/apint-rem1.ll
    llvm/trunk/test/Transforms/InstCombine/apint-rem2.ll
    llvm/trunk/test/Transforms/InstCombine/apint-select.ll
    llvm/trunk/test/Transforms/InstCombine/apint-shift-simplify.ll
    llvm/trunk/test/Transforms/InstCombine/apint-shift.ll
    llvm/trunk/test/Transforms/InstCombine/apint-shl-trunc.ll
    llvm/trunk/test/Transforms/InstCombine/apint-sub.ll
    llvm/trunk/test/Transforms/InstCombine/apint-xor1.ll
    llvm/trunk/test/Transforms/InstCombine/apint-xor2.ll
    llvm/trunk/test/Transforms/InstCombine/assoc-cast-assoc.ll
    llvm/trunk/test/Transforms/InstCombine/assume-loop-align.ll
    llvm/trunk/test/Transforms/InstCombine/assume-redundant.ll
    llvm/trunk/test/Transforms/InstCombine/assume.ll
    llvm/trunk/test/Transforms/InstCombine/assume2.ll
    llvm/trunk/test/Transforms/InstCombine/atomic.ll
    llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll
    llvm/trunk/test/Transforms/InstCombine/badmalloc.ll
    llvm/trunk/test/Transforms/InstCombine/binop-cast.ll
    llvm/trunk/test/Transforms/InstCombine/bit-checks.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-alias-function.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-bigendian.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-sext-vector.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-store.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast-vec-canon.ll
    llvm/trunk/test/Transforms/InstCombine/bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/bitreverse-hang.ll
    llvm/trunk/test/Transforms/InstCombine/bitreverse-known-bits.ll
    llvm/trunk/test/Transforms/InstCombine/bittest.ll
    llvm/trunk/test/Transforms/InstCombine/branch.ll
    llvm/trunk/test/Transforms/InstCombine/broadcast.ll
    llvm/trunk/test/Transforms/InstCombine/bswap-fold.ll
    llvm/trunk/test/Transforms/InstCombine/bswap-known-bits.ll
    llvm/trunk/test/Transforms/InstCombine/bswap.ll
    llvm/trunk/test/Transforms/InstCombine/builtin-dynamic-object-size.ll
    llvm/trunk/test/Transforms/InstCombine/builtin-object-size-offset.ll
    llvm/trunk/test/Transforms/InstCombine/builtin-object-size-ptr.ll
    llvm/trunk/test/Transforms/InstCombine/cabs-array.ll
    llvm/trunk/test/Transforms/InstCombine/cabs-discrete.ll
    llvm/trunk/test/Transforms/InstCombine/call-callconv.ll
    llvm/trunk/test/Transforms/InstCombine/call-cast-attrs.ll
    llvm/trunk/test/Transforms/InstCombine/call-cast-target-inalloca.ll
    llvm/trunk/test/Transforms/InstCombine/call-cast-target.ll
    llvm/trunk/test/Transforms/InstCombine/call-guard.ll
    llvm/trunk/test/Transforms/InstCombine/call-intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/call.ll
    llvm/trunk/test/Transforms/InstCombine/call2.ll
    llvm/trunk/test/Transforms/InstCombine/call_nonnull_arg.ll
    llvm/trunk/test/Transforms/InstCombine/callsite_nonnull_args_through_casts.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-ashr-shl-to-masking.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-eq-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-ne-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-sge-to-icmp-sle.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-sgt-to-icmp-sgt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-sle-to-icmp-sle.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-slt-to-icmp-sgt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-uge-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-ugt-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-ule-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-constant-low-bit-mask-and-icmp-ult-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-lack-of-signed-truncation-check.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-and-icmp-eq-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-and-icmp-ne-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v2-and-icmp-eq-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v2-and-icmp-ne-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v3-and-icmp-eq-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v3-and-icmp-ne-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v4-and-icmp-eq-to-icmp-ule.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-low-bit-mask-v4-and-icmp-ne-to-icmp-ugt.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-lshr-shl-to-masking.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-shl-lshr-to-masking.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize-signed-truncation-check.ll
    llvm/trunk/test/Transforms/InstCombine/canonicalize_branch.ll
    llvm/trunk/test/Transforms/InstCombine/cast-call-combine-prof.ll
    llvm/trunk/test/Transforms/InstCombine/cast-call-combine.ll
    llvm/trunk/test/Transforms/InstCombine/cast-callee-deopt-bundles.ll
    llvm/trunk/test/Transforms/InstCombine/cast-int-fcmp-eq-0.ll
    llvm/trunk/test/Transforms/InstCombine/cast-int-icmp-eq-0.ll
    llvm/trunk/test/Transforms/InstCombine/cast-mul-select.ll
    llvm/trunk/test/Transforms/InstCombine/cast-select.ll
    llvm/trunk/test/Transforms/InstCombine/cast-set-preserve-signed-dbg-val.ll
    llvm/trunk/test/Transforms/InstCombine/cast-set.ll
    llvm/trunk/test/Transforms/InstCombine/cast-unsigned-icmp-eqcmp-0.ll
    llvm/trunk/test/Transforms/InstCombine/cast.ll
    llvm/trunk/test/Transforms/InstCombine/cast_phi.ll
    llvm/trunk/test/Transforms/InstCombine/cast_ptr.ll
    llvm/trunk/test/Transforms/InstCombine/ceil.ll
    llvm/trunk/test/Transforms/InstCombine/clamp-to-minmax.ll
    llvm/trunk/test/Transforms/InstCombine/cmp-intrinsic.ll
    llvm/trunk/test/Transforms/InstCombine/compare-3way.ll
    llvm/trunk/test/Transforms/InstCombine/compare-alloca.ll
    llvm/trunk/test/Transforms/InstCombine/compare-signs.ll
    llvm/trunk/test/Transforms/InstCombine/compare-udiv.ll
    llvm/trunk/test/Transforms/InstCombine/compare-unescaped.ll
    llvm/trunk/test/Transforms/InstCombine/consecutive-fences.ll
    llvm/trunk/test/Transforms/InstCombine/constant-expr-datalayout.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-address-space-pointer.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-alias.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-compare.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-gep.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-iteration.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-libfunc.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-math.ll
    llvm/trunk/test/Transforms/InstCombine/constant-fold-shifts.ll
    llvm/trunk/test/Transforms/InstCombine/convergent.ll
    llvm/trunk/test/Transforms/InstCombine/copysign.ll
    llvm/trunk/test/Transforms/InstCombine/cos-1.ll
    llvm/trunk/test/Transforms/InstCombine/cos-2.ll
    llvm/trunk/test/Transforms/InstCombine/cos-sin-intrinsic.ll
    llvm/trunk/test/Transforms/InstCombine/crash.ll
    llvm/trunk/test/Transforms/InstCombine/ctlz-cttz-bitreverse.ll
    llvm/trunk/test/Transforms/InstCombine/ctpop-bswap-bitreverse.ll
    llvm/trunk/test/Transforms/InstCombine/ctpop.ll
    llvm/trunk/test/Transforms/InstCombine/dce-iterate.ll
    llvm/trunk/test/Transforms/InstCombine/deadcode.ll
    llvm/trunk/test/Transforms/InstCombine/debug-line.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo-dce.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo-dce2.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo-sink.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo-skip.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo-variables.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo.ll
    llvm/trunk/test/Transforms/InstCombine/debuginfo_add.ll
    llvm/trunk/test/Transforms/InstCombine/default-alignment.ll
    llvm/trunk/test/Transforms/InstCombine/demand_shrink_nsw.ll
    llvm/trunk/test/Transforms/InstCombine/demorgan-sink-not-into-xor.ll
    llvm/trunk/test/Transforms/InstCombine/demorgan.ll
    llvm/trunk/test/Transforms/InstCombine/disable-simplify-libcalls.ll
    llvm/trunk/test/Transforms/InstCombine/distribute.ll
    llvm/trunk/test/Transforms/InstCombine/div-shift-crash.ll
    llvm/trunk/test/Transforms/InstCombine/div-shift.ll
    llvm/trunk/test/Transforms/InstCombine/div.ll
    llvm/trunk/test/Transforms/InstCombine/double-float-shrink-1.ll
    llvm/trunk/test/Transforms/InstCombine/double-float-shrink-2.ll
    llvm/trunk/test/Transforms/InstCombine/early_constfold_changes_IR.ll
    llvm/trunk/test/Transforms/InstCombine/early_dce_clobbers_callgraph.ll
    llvm/trunk/test/Transforms/InstCombine/element-atomic-memintrins.ll
    llvm/trunk/test/Transforms/InstCombine/enforce-known-alignment.ll
    llvm/trunk/test/Transforms/InstCombine/err-rep-cold.ll
    llvm/trunk/test/Transforms/InstCombine/exact.ll
    llvm/trunk/test/Transforms/InstCombine/exp2-1.ll
    llvm/trunk/test/Transforms/InstCombine/exp2-2.ll
    llvm/trunk/test/Transforms/InstCombine/extractelement.ll
    llvm/trunk/test/Transforms/InstCombine/extractinsert-tbaa.ll
    llvm/trunk/test/Transforms/InstCombine/extractvalue.ll
    llvm/trunk/test/Transforms/InstCombine/fabs-libcall.ll
    llvm/trunk/test/Transforms/InstCombine/fabs.ll
    llvm/trunk/test/Transforms/InstCombine/fadd-fsub-factor.ll
    llvm/trunk/test/Transforms/InstCombine/fadd.ll
    llvm/trunk/test/Transforms/InstCombine/fast-math.ll
    llvm/trunk/test/Transforms/InstCombine/fcmp-select.ll
    llvm/trunk/test/Transforms/InstCombine/fcmp-special.ll
    llvm/trunk/test/Transforms/InstCombine/fcmp.ll
    llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll
    llvm/trunk/test/Transforms/InstCombine/fdiv-sin-cos.ll
    llvm/trunk/test/Transforms/InstCombine/fdiv.ll
    llvm/trunk/test/Transforms/InstCombine/ffs-1.ll
    llvm/trunk/test/Transforms/InstCombine/float-shrink-compare.ll
    llvm/trunk/test/Transforms/InstCombine/fls.ll
    llvm/trunk/test/Transforms/InstCombine/fma.ll
    llvm/trunk/test/Transforms/InstCombine/fmul-exp.ll
    llvm/trunk/test/Transforms/InstCombine/fmul-exp2.ll
    llvm/trunk/test/Transforms/InstCombine/fmul-pow.ll
    llvm/trunk/test/Transforms/InstCombine/fmul-sqrt.ll
    llvm/trunk/test/Transforms/InstCombine/fmul.ll
    llvm/trunk/test/Transforms/InstCombine/fneg.ll
    llvm/trunk/test/Transforms/InstCombine/fold-bin-operand.ll
    llvm/trunk/test/Transforms/InstCombine/fold-calls.ll
    llvm/trunk/test/Transforms/InstCombine/fold-fops-into-selects.ll
    llvm/trunk/test/Transforms/InstCombine/fold-phi-load-metadata.ll
    llvm/trunk/test/Transforms/InstCombine/fold-phi.ll
    llvm/trunk/test/Transforms/InstCombine/fold-sqrt-sqrtf.ll
    llvm/trunk/test/Transforms/InstCombine/fold-vector-select.ll
    llvm/trunk/test/Transforms/InstCombine/fold-vector-zero.ll
    llvm/trunk/test/Transforms/InstCombine/fp-ret-bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/fpcast.ll
    llvm/trunk/test/Transforms/InstCombine/fpextend.ll
    llvm/trunk/test/Transforms/InstCombine/fpextend_x86.ll
    llvm/trunk/test/Transforms/InstCombine/fprintf-1.ll
    llvm/trunk/test/Transforms/InstCombine/fputs-1.ll
    llvm/trunk/test/Transforms/InstCombine/fputs-opt-size.ll
    llvm/trunk/test/Transforms/InstCombine/fsh.ll
    llvm/trunk/test/Transforms/InstCombine/fsub.ll
    llvm/trunk/test/Transforms/InstCombine/fwrite-1.ll
    llvm/trunk/test/Transforms/InstCombine/gc.relocate.ll
    llvm/trunk/test/Transforms/InstCombine/gep-addrspace.ll
    llvm/trunk/test/Transforms/InstCombine/gep-combine-loop-invariant.ll
    llvm/trunk/test/Transforms/InstCombine/gep-custom-dl.ll
    llvm/trunk/test/Transforms/InstCombine/gep-sext.ll
    llvm/trunk/test/Transforms/InstCombine/gep-vector.ll
    llvm/trunk/test/Transforms/InstCombine/gepgep.ll
    llvm/trunk/test/Transforms/InstCombine/gepphigep.ll
    llvm/trunk/test/Transforms/InstCombine/getelementptr-folding.ll
    llvm/trunk/test/Transforms/InstCombine/getelementptr.ll
    llvm/trunk/test/Transforms/InstCombine/hoist_instr.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-add.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-bc-vec.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-custom-dl.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-div-constant.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-dom.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-logical.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-mul-zext.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-mul.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-range.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-shl-nsw.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-shl-nuw.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-shr-lt-gt.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-shr.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-sub.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-uge-of-add-of-shl-one-by-bits-to-allones-and-val-to-icmp-eq-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-uge-of-not-of-shl-allones-by-bits-and-val-to-icmp-eq-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-ugt-of-shl-1-by-bits-and-val-to-icmp-eq-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-ule-of-shl-1-by-bits-and-val-to-icmp-ne-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-ult-of-add-of-shl-one-by-bits-to-allones-and-val-to-icmp-ne-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-ult-of-not-of-shl-allones-by-bits-and-val-to-icmp-ne-of-lshr-val-by-bits-and-0.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-vec.ll
    llvm/trunk/test/Transforms/InstCombine/icmp-xor-signbit.ll
    llvm/trunk/test/Transforms/InstCombine/icmp.ll
    llvm/trunk/test/Transforms/InstCombine/icmp_sdiv_with_and_without_range.ll
    llvm/trunk/test/Transforms/InstCombine/idioms.ll
    llvm/trunk/test/Transforms/InstCombine/indexed-gep-compares.ll
    llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll
    llvm/trunk/test/Transforms/InstCombine/inselt-binop.ll
    llvm/trunk/test/Transforms/InstCombine/insert-const-shuf.ll
    llvm/trunk/test/Transforms/InstCombine/insert-extract-shuffle.ll
    llvm/trunk/test/Transforms/InstCombine/insert-val-extract-elem.ll
    llvm/trunk/test/Transforms/InstCombine/int_sideeffect.ll
    llvm/trunk/test/Transforms/InstCombine/intersect-accessgroup.ll
    llvm/trunk/test/Transforms/InstCombine/intptr1.ll
    llvm/trunk/test/Transforms/InstCombine/intptr2.ll
    llvm/trunk/test/Transforms/InstCombine/intptr3.ll
    llvm/trunk/test/Transforms/InstCombine/intptr4.ll
    llvm/trunk/test/Transforms/InstCombine/intptr5.ll
    llvm/trunk/test/Transforms/InstCombine/intptr6.ll
    llvm/trunk/test/Transforms/InstCombine/intptr7.ll
    llvm/trunk/test/Transforms/InstCombine/intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/invariant.group.ll
    llvm/trunk/test/Transforms/InstCombine/invariant.ll
    llvm/trunk/test/Transforms/InstCombine/invert-variable-mask-in-masked-merge-scalar.ll
    llvm/trunk/test/Transforms/InstCombine/invert-variable-mask-in-masked-merge-vector.ll
    llvm/trunk/test/Transforms/InstCombine/invoke.ll
    llvm/trunk/test/Transforms/InstCombine/isascii-1.ll
    llvm/trunk/test/Transforms/InstCombine/isdigit-1.ll
    llvm/trunk/test/Transforms/InstCombine/known-never-nan.ll
    llvm/trunk/test/Transforms/InstCombine/known_align.ll
    llvm/trunk/test/Transforms/InstCombine/lifetime-asan.ll
    llvm/trunk/test/Transforms/InstCombine/lifetime-no-null-opt.ll
    llvm/trunk/test/Transforms/InstCombine/lifetime.ll
    llvm/trunk/test/Transforms/InstCombine/load-bitcast-select.ll
    llvm/trunk/test/Transforms/InstCombine/load-bitcast32.ll
    llvm/trunk/test/Transforms/InstCombine/load-bitcast64.ll
    llvm/trunk/test/Transforms/InstCombine/load-cmp.ll
    llvm/trunk/test/Transforms/InstCombine/load-combine-metadata-2.ll
    llvm/trunk/test/Transforms/InstCombine/load-combine-metadata-3.ll
    llvm/trunk/test/Transforms/InstCombine/load-combine-metadata-4.ll
    llvm/trunk/test/Transforms/InstCombine/load-combine-metadata-dominance.ll
    llvm/trunk/test/Transforms/InstCombine/load-combine-metadata.ll
    llvm/trunk/test/Transforms/InstCombine/load-select.ll
    llvm/trunk/test/Transforms/InstCombine/load.ll
    llvm/trunk/test/Transforms/InstCombine/load3.ll
    llvm/trunk/test/Transforms/InstCombine/load_combine_aa.ll
    llvm/trunk/test/Transforms/InstCombine/loadstore-alignment.ll
    llvm/trunk/test/Transforms/InstCombine/loadstore-metadata.ll
    llvm/trunk/test/Transforms/InstCombine/log-pow-nofastmath.ll
    llvm/trunk/test/Transforms/InstCombine/log-pow.ll
    llvm/trunk/test/Transforms/InstCombine/logical-select.ll
    llvm/trunk/test/Transforms/InstCombine/lower-dbg-declare.ll
    llvm/trunk/test/Transforms/InstCombine/lshr-phi.ll
    llvm/trunk/test/Transforms/InstCombine/lshr.ll
    llvm/trunk/test/Transforms/InstCombine/malloc-free-delete.ll
    llvm/trunk/test/Transforms/InstCombine/masked-merge-add.ll
    llvm/trunk/test/Transforms/InstCombine/masked-merge-and-of-ors.ll
    llvm/trunk/test/Transforms/InstCombine/masked-merge-or.ll
    llvm/trunk/test/Transforms/InstCombine/masked-merge-xor.ll
    llvm/trunk/test/Transforms/InstCombine/masked_intrinsics.ll
    llvm/trunk/test/Transforms/InstCombine/max-of-nots.ll
    llvm/trunk/test/Transforms/InstCombine/max_known_bits.ll
    llvm/trunk/test/Transforms/InstCombine/maximum.ll
    llvm/trunk/test/Transforms/InstCombine/maxnum.ll
    llvm/trunk/test/Transforms/InstCombine/mem-gep-zidx.ll
    llvm/trunk/test/Transforms/InstCombine/mem-par-metadata-memcpy.ll
    llvm/trunk/test/Transforms/InstCombine/memchr.ll
    llvm/trunk/test/Transforms/InstCombine/memcmp-1.ll
    llvm/trunk/test/Transforms/InstCombine/memcmp-2.ll
    llvm/trunk/test/Transforms/InstCombine/memcmp-constant-fold.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy-1.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy-2.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy-addrspace.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy-from-global.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy-to-load.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/memcpy_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/memmove-1.ll
    llvm/trunk/test/Transforms/InstCombine/memmove-2.ll
    llvm/trunk/test/Transforms/InstCombine/memmove.ll
    llvm/trunk/test/Transforms/InstCombine/memmove_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/memmove_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/memset-1.ll
    llvm/trunk/test/Transforms/InstCombine/memset-2.ll
    llvm/trunk/test/Transforms/InstCombine/memset.ll
    llvm/trunk/test/Transforms/InstCombine/memset2.ll
    llvm/trunk/test/Transforms/InstCombine/memset_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/memset_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/merge-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/min-positive.ll
    llvm/trunk/test/Transforms/InstCombine/minimum.ll
    llvm/trunk/test/Transforms/InstCombine/minmax-demandbits.ll
    llvm/trunk/test/Transforms/InstCombine/minmax-fold.ll
    llvm/trunk/test/Transforms/InstCombine/minmax-fp.ll
    llvm/trunk/test/Transforms/InstCombine/minnum.ll
    llvm/trunk/test/Transforms/InstCombine/misc-2002.ll
    llvm/trunk/test/Transforms/InstCombine/mul-masked-bits.ll
    llvm/trunk/test/Transforms/InstCombine/mul.ll
    llvm/trunk/test/Transforms/InstCombine/multi-size-address-space-pointer.ll
    llvm/trunk/test/Transforms/InstCombine/multi-use-or.ll
    llvm/trunk/test/Transforms/InstCombine/multiple-uses-load-bitcast-select.ll
    llvm/trunk/test/Transforms/InstCombine/musttail-thunk.ll
    llvm/trunk/test/Transforms/InstCombine/narrow-math.ll
    llvm/trunk/test/Transforms/InstCombine/narrow-switch.ll
    llvm/trunk/test/Transforms/InstCombine/narrow.ll
    llvm/trunk/test/Transforms/InstCombine/no-negzero.ll
    llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll
    llvm/trunk/test/Transforms/InstCombine/no_sink_instruction.ll
    llvm/trunk/test/Transforms/InstCombine/non-integral-pointers.ll
    llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll
    llvm/trunk/test/Transforms/InstCombine/not.ll
    llvm/trunk/test/Transforms/InstCombine/nothrow.ll
    llvm/trunk/test/Transforms/InstCombine/nsw.ll
    llvm/trunk/test/Transforms/InstCombine/obfuscated_splat.ll
    llvm/trunk/test/Transforms/InstCombine/objsize-64.ll
    llvm/trunk/test/Transforms/InstCombine/objsize-address-space.ll
    llvm/trunk/test/Transforms/InstCombine/objsize-noverify.ll
    llvm/trunk/test/Transforms/InstCombine/objsize.ll
    llvm/trunk/test/Transforms/InstCombine/odr-linkage.ll
    llvm/trunk/test/Transforms/InstCombine/onehot_merge.ll
    llvm/trunk/test/Transforms/InstCombine/opaque.ll
    llvm/trunk/test/Transforms/InstCombine/operand-complexity.ll
    llvm/trunk/test/Transforms/InstCombine/or-fcmp.ll
    llvm/trunk/test/Transforms/InstCombine/or-shifted-masks.ll
    llvm/trunk/test/Transforms/InstCombine/or-xor.ll
    llvm/trunk/test/Transforms/InstCombine/or.ll
    llvm/trunk/test/Transforms/InstCombine/osx-names.ll
    llvm/trunk/test/Transforms/InstCombine/out-of-bounds-indexes.ll
    llvm/trunk/test/Transforms/InstCombine/overflow-mul.ll
    llvm/trunk/test/Transforms/InstCombine/overflow.ll
    llvm/trunk/test/Transforms/InstCombine/phi-load-metadata-2.ll
    llvm/trunk/test/Transforms/InstCombine/phi-load-metadata-3.ll
    llvm/trunk/test/Transforms/InstCombine/phi-load-metadata-dominance.ll
    llvm/trunk/test/Transforms/InstCombine/phi-load-metadata.ll
    llvm/trunk/test/Transforms/InstCombine/phi-merge-gep.ll
    llvm/trunk/test/Transforms/InstCombine/phi-preserve-ir-flags.ll
    llvm/trunk/test/Transforms/InstCombine/phi-select-constant.ll
    llvm/trunk/test/Transforms/InstCombine/phi-timeout.ll
    llvm/trunk/test/Transforms/InstCombine/phi.ll
    llvm/trunk/test/Transforms/InstCombine/pow-1.ll
    llvm/trunk/test/Transforms/InstCombine/pow-2.ll
    llvm/trunk/test/Transforms/InstCombine/pow-3.ll
    llvm/trunk/test/Transforms/InstCombine/pow-4.ll
    llvm/trunk/test/Transforms/InstCombine/pow-cbrt.ll
    llvm/trunk/test/Transforms/InstCombine/pow-exp-nofastmath.ll
    llvm/trunk/test/Transforms/InstCombine/pow-exp.ll
    llvm/trunk/test/Transforms/InstCombine/pow-sqrt.ll
    llvm/trunk/test/Transforms/InstCombine/pr12251.ll
    llvm/trunk/test/Transforms/InstCombine/pr12338.ll
    llvm/trunk/test/Transforms/InstCombine/pr17827.ll
    llvm/trunk/test/Transforms/InstCombine/pr19420.ll
    llvm/trunk/test/Transforms/InstCombine/pr20079.ll
    llvm/trunk/test/Transforms/InstCombine/pr20678.ll
    llvm/trunk/test/Transforms/InstCombine/pr21199.ll
    llvm/trunk/test/Transforms/InstCombine/pr21210.ll
    llvm/trunk/test/Transforms/InstCombine/pr21651.ll
    llvm/trunk/test/Transforms/InstCombine/pr21891.ll
    llvm/trunk/test/Transforms/InstCombine/pr23751.ll
    llvm/trunk/test/Transforms/InstCombine/pr23809.ll
    llvm/trunk/test/Transforms/InstCombine/pr24354.ll
    llvm/trunk/test/Transforms/InstCombine/pr24605.ll
    llvm/trunk/test/Transforms/InstCombine/pr25342.ll
    llvm/trunk/test/Transforms/InstCombine/pr25745.ll
    llvm/trunk/test/Transforms/InstCombine/pr2645-0.ll
    llvm/trunk/test/Transforms/InstCombine/pr26992.ll
    llvm/trunk/test/Transforms/InstCombine/pr26993.ll
    llvm/trunk/test/Transforms/InstCombine/pr27236.ll
    llvm/trunk/test/Transforms/InstCombine/pr27332.ll
    llvm/trunk/test/Transforms/InstCombine/pr27343.ll
    llvm/trunk/test/Transforms/InstCombine/pr27703.ll
    llvm/trunk/test/Transforms/InstCombine/pr27996.ll
    llvm/trunk/test/Transforms/InstCombine/pr28143.ll
    llvm/trunk/test/Transforms/InstCombine/pr28725.ll
    llvm/trunk/test/Transforms/InstCombine/pr2996.ll
    llvm/trunk/test/Transforms/InstCombine/pr30929.ll
    llvm/trunk/test/Transforms/InstCombine/pr31990_wrong_memcpy.ll
    llvm/trunk/test/Transforms/InstCombine/pr32686.ll
    llvm/trunk/test/Transforms/InstCombine/pr33453.ll
    llvm/trunk/test/Transforms/InstCombine/pr33689_same_bitwidth.ll
    llvm/trunk/test/Transforms/InstCombine/pr34349.ll
    llvm/trunk/test/Transforms/InstCombine/pr34627.ll
    llvm/trunk/test/Transforms/InstCombine/pr35515.ll
    llvm/trunk/test/Transforms/InstCombine/pr36362.ll
    llvm/trunk/test/Transforms/InstCombine/pr38677.ll
    llvm/trunk/test/Transforms/InstCombine/pr38897.ll
    llvm/trunk/test/Transforms/InstCombine/pr38915.ll
    llvm/trunk/test/Transforms/InstCombine/pr38984.ll
    llvm/trunk/test/Transforms/InstCombine/pr39177.ll
    llvm/trunk/test/Transforms/InstCombine/pr39908.ll
    llvm/trunk/test/Transforms/InstCombine/pr41164.ll
    llvm/trunk/test/Transforms/InstCombine/prefetch-load.ll
    llvm/trunk/test/Transforms/InstCombine/preserve-sminmax.ll
    llvm/trunk/test/Transforms/InstCombine/preserved-analyses.ll
    llvm/trunk/test/Transforms/InstCombine/prevent-cmp-merge.ll
    llvm/trunk/test/Transforms/InstCombine/printf-1.ll
    llvm/trunk/test/Transforms/InstCombine/printf-2.ll
    llvm/trunk/test/Transforms/InstCombine/printf-3.ll
    llvm/trunk/test/Transforms/InstCombine/ptr-int-cast.ll
    llvm/trunk/test/Transforms/InstCombine/puts-1.ll
    llvm/trunk/test/Transforms/InstCombine/range-check.ll
    llvm/trunk/test/Transforms/InstCombine/readnone-maythrow.ll
    llvm/trunk/test/Transforms/InstCombine/realloc.ll
    llvm/trunk/test/Transforms/InstCombine/rem.ll
    llvm/trunk/test/Transforms/InstCombine/rotate.ll
    llvm/trunk/test/Transforms/InstCombine/round.ll
    llvm/trunk/test/Transforms/InstCombine/sadd-with-overflow.ll
    llvm/trunk/test/Transforms/InstCombine/salvage-dbg-declare.ll
    llvm/trunk/test/Transforms/InstCombine/saturating-add-sub.ll
    llvm/trunk/test/Transforms/InstCombine/scalarization.ll
    llvm/trunk/test/Transforms/InstCombine/sdiv-1.ll
    llvm/trunk/test/Transforms/InstCombine/sdiv-2.ll
    llvm/trunk/test/Transforms/InstCombine/sdiv-canonicalize.ll
    llvm/trunk/test/Transforms/InstCombine/sdiv-guard.ll
    llvm/trunk/test/Transforms/InstCombine/select-2.ll
    llvm/trunk/test/Transforms/InstCombine/select-binop-cmp.ll
    llvm/trunk/test/Transforms/InstCombine/select-bitext-bitwise-ops.ll
    llvm/trunk/test/Transforms/InstCombine/select-bitext.ll
    llvm/trunk/test/Transforms/InstCombine/select-cmp-br.ll
    llvm/trunk/test/Transforms/InstCombine/select-cmp-cttz-ctlz.ll
    llvm/trunk/test/Transforms/InstCombine/select-cmpxchg.ll
    llvm/trunk/test/Transforms/InstCombine/select-crash-noverify.ll
    llvm/trunk/test/Transforms/InstCombine/select-crash.ll
    llvm/trunk/test/Transforms/InstCombine/select-extractelement.ll
    llvm/trunk/test/Transforms/InstCombine/select-gep.ll
    llvm/trunk/test/Transforms/InstCombine/select-icmp-and.ll
    llvm/trunk/test/Transforms/InstCombine/select-load-call.ll
    llvm/trunk/test/Transforms/InstCombine/select-obo-peo-ops.ll
    llvm/trunk/test/Transforms/InstCombine/select-of-bittest.ll
    llvm/trunk/test/Transforms/InstCombine/select-pr39595.ll
    llvm/trunk/test/Transforms/InstCombine/select-select.ll
    llvm/trunk/test/Transforms/InstCombine/select-with-bitwise-ops.ll
    llvm/trunk/test/Transforms/InstCombine/select.ll
    llvm/trunk/test/Transforms/InstCombine/select_arithmetic.ll
    llvm/trunk/test/Transforms/InstCombine/select_meta.ll
    llvm/trunk/test/Transforms/InstCombine/set-lowbits-mask-canonicalize.ll
    llvm/trunk/test/Transforms/InstCombine/set.ll
    llvm/trunk/test/Transforms/InstCombine/setcc-strength-reduce.ll
    llvm/trunk/test/Transforms/InstCombine/sext.ll
    llvm/trunk/test/Transforms/InstCombine/shift-add.ll
    llvm/trunk/test/Transforms/InstCombine/shift-shift.ll
    llvm/trunk/test/Transforms/InstCombine/shift-sra.ll
    llvm/trunk/test/Transforms/InstCombine/shift.ll
    llvm/trunk/test/Transforms/InstCombine/should-change-type.ll
    llvm/trunk/test/Transforms/InstCombine/shuffle-select-narrow.ll
    llvm/trunk/test/Transforms/InstCombine/shuffle_select.ll
    llvm/trunk/test/Transforms/InstCombine/shufflevec-bitcast.ll
    llvm/trunk/test/Transforms/InstCombine/shufflevec-constant.ll
    llvm/trunk/test/Transforms/InstCombine/sign-test-and-or.ll
    llvm/trunk/test/Transforms/InstCombine/signed-comparison.ll
    llvm/trunk/test/Transforms/InstCombine/signed-truncation-check.ll
    llvm/trunk/test/Transforms/InstCombine/signext.ll
    llvm/trunk/test/Transforms/InstCombine/simplify-demanded-bits-pointer.ll
    llvm/trunk/test/Transforms/InstCombine/simplify-libcalls-erased.ll
    llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll
    llvm/trunk/test/Transforms/InstCombine/sincospi.ll
    llvm/trunk/test/Transforms/InstCombine/sink-alloca.ll
    llvm/trunk/test/Transforms/InstCombine/sink-into-catchswitch.ll
    llvm/trunk/test/Transforms/InstCombine/sink_instruction.ll
    llvm/trunk/test/Transforms/InstCombine/sitofp.ll
    llvm/trunk/test/Transforms/InstCombine/smax-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/smin-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/snprintf.ll
    llvm/trunk/test/Transforms/InstCombine/sprintf-1.ll
    llvm/trunk/test/Transforms/InstCombine/sprintf-void.ll
    llvm/trunk/test/Transforms/InstCombine/sqrt-nofast.ll
    llvm/trunk/test/Transforms/InstCombine/sqrt.ll
    llvm/trunk/test/Transforms/InstCombine/srem-canonicalize.ll
    llvm/trunk/test/Transforms/InstCombine/srem-simplify-bug.ll
    llvm/trunk/test/Transforms/InstCombine/srem1.ll
    llvm/trunk/test/Transforms/InstCombine/ssub-with-overflow.ll
    llvm/trunk/test/Transforms/InstCombine/stack-overalign.ll
    llvm/trunk/test/Transforms/InstCombine/stacksave-debuginfo.ll
    llvm/trunk/test/Transforms/InstCombine/stacksaverestore.ll
    llvm/trunk/test/Transforms/InstCombine/statepoint.ll
    llvm/trunk/test/Transforms/InstCombine/store-load-unaliased-gep.ll
    llvm/trunk/test/Transforms/InstCombine/store.ll
    llvm/trunk/test/Transforms/InstCombine/storemerge-dbg.ll
    llvm/trunk/test/Transforms/InstCombine/stpcpy-1.ll
    llvm/trunk/test/Transforms/InstCombine/stpcpy-2.ll
    llvm/trunk/test/Transforms/InstCombine/stpcpy_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/stpcpy_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/str-int-2.ll
    llvm/trunk/test/Transforms/InstCombine/str-int.ll
    llvm/trunk/test/Transforms/InstCombine/strcat-1.ll
    llvm/trunk/test/Transforms/InstCombine/strcat-2.ll
    llvm/trunk/test/Transforms/InstCombine/strcat-3.ll
    llvm/trunk/test/Transforms/InstCombine/strchr-1.ll
    llvm/trunk/test/Transforms/InstCombine/strchr-2.ll
    llvm/trunk/test/Transforms/InstCombine/strcmp-1.ll
    llvm/trunk/test/Transforms/InstCombine/strcmp-2.ll
    llvm/trunk/test/Transforms/InstCombine/strcmp-memcmp.ll
    llvm/trunk/test/Transforms/InstCombine/strcpy-1.ll
    llvm/trunk/test/Transforms/InstCombine/strcpy-2.ll
    llvm/trunk/test/Transforms/InstCombine/strcpy_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/strcpy_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/strcpy_chk-64.ll
    llvm/trunk/test/Transforms/InstCombine/strcspn-1.ll
    llvm/trunk/test/Transforms/InstCombine/strcspn-2.ll
    llvm/trunk/test/Transforms/InstCombine/strlen-1.ll
    llvm/trunk/test/Transforms/InstCombine/strlen-2.ll
    llvm/trunk/test/Transforms/InstCombine/strncat-1.ll
    llvm/trunk/test/Transforms/InstCombine/strncat-2.ll
    llvm/trunk/test/Transforms/InstCombine/strncat-3.ll
    llvm/trunk/test/Transforms/InstCombine/strncmp-1.ll
    llvm/trunk/test/Transforms/InstCombine/strncmp-2.ll
    llvm/trunk/test/Transforms/InstCombine/strncmp-wrong-datalayout.ll
    llvm/trunk/test/Transforms/InstCombine/strncpy-1.ll
    llvm/trunk/test/Transforms/InstCombine/strncpy-2.ll
    llvm/trunk/test/Transforms/InstCombine/strncpy_chk-1.ll
    llvm/trunk/test/Transforms/InstCombine/strncpy_chk-2.ll
    llvm/trunk/test/Transforms/InstCombine/strpbrk-1.ll
    llvm/trunk/test/Transforms/InstCombine/strpbrk-2.ll
    llvm/trunk/test/Transforms/InstCombine/strrchr-1.ll
    llvm/trunk/test/Transforms/InstCombine/strrchr-2.ll
    llvm/trunk/test/Transforms/InstCombine/strspn-1.ll
    llvm/trunk/test/Transforms/InstCombine/strstr-1.ll
    llvm/trunk/test/Transforms/InstCombine/strstr-2.ll
    llvm/trunk/test/Transforms/InstCombine/strto-1.ll
    llvm/trunk/test/Transforms/InstCombine/struct-assign-tbaa-new.ll
    llvm/trunk/test/Transforms/InstCombine/struct-assign-tbaa.ll
    llvm/trunk/test/Transforms/InstCombine/sub-minmax.ll
    llvm/trunk/test/Transforms/InstCombine/sub-not.ll
    llvm/trunk/test/Transforms/InstCombine/sub-xor.ll
    llvm/trunk/test/Transforms/InstCombine/sub.ll
    llvm/trunk/test/Transforms/InstCombine/switch-constant-expr.ll
    llvm/trunk/test/Transforms/InstCombine/switch-truncate-crash.ll
    llvm/trunk/test/Transforms/InstCombine/tan-nofastmath.ll
    llvm/trunk/test/Transforms/InstCombine/tan.ll
    llvm/trunk/test/Transforms/InstCombine/tbaa-store-to-load.ll
    llvm/trunk/test/Transforms/InstCombine/toascii-1.ll
    llvm/trunk/test/Transforms/InstCombine/token.ll
    llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll
    llvm/trunk/test/Transforms/InstCombine/trunc.ll
    llvm/trunk/test/Transforms/InstCombine/type_pun.ll
    llvm/trunk/test/Transforms/InstCombine/uadd-with-overflow.ll
    llvm/trunk/test/Transforms/InstCombine/uaddo.ll
    llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll
    llvm/trunk/test/Transforms/InstCombine/udiv_select_to_select_shift.ll
    llvm/trunk/test/Transforms/InstCombine/udivrem-change-width.ll
    llvm/trunk/test/Transforms/InstCombine/umax-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/umin-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/unavailable-debug.ll
    llvm/trunk/test/Transforms/InstCombine/unfold-masked-merge-with-const-mask-scalar.ll
    llvm/trunk/test/Transforms/InstCombine/unfold-masked-merge-with-const-mask-vector.ll
    llvm/trunk/test/Transforms/InstCombine/unlocked-stdio-mingw.ll
    llvm/trunk/test/Transforms/InstCombine/unlocked-stdio.ll
    llvm/trunk/test/Transforms/InstCombine/unordered-fcmp-select.ll
    llvm/trunk/test/Transforms/InstCombine/unpack-fca.ll
    llvm/trunk/test/Transforms/InstCombine/unrecognized_three-way-comparison.ll
    llvm/trunk/test/Transforms/InstCombine/unsigned_saturated_sub.ll
    llvm/trunk/test/Transforms/InstCombine/urem-simplify-bug.ll
    llvm/trunk/test/Transforms/InstCombine/vararg.ll
    llvm/trunk/test/Transforms/InstCombine/vec-binop-select.ll
    llvm/trunk/test/Transforms/InstCombine/vec_demanded_elts.ll
    llvm/trunk/test/Transforms/InstCombine/vec_extract_2elts.ll
    llvm/trunk/test/Transforms/InstCombine/vec_extract_var_elt.ll
    llvm/trunk/test/Transforms/InstCombine/vec_gep_scalar_arg.ll
    llvm/trunk/test/Transforms/InstCombine/vec_insertelt.ll
    llvm/trunk/test/Transforms/InstCombine/vec_phi_extract.ll
    llvm/trunk/test/Transforms/InstCombine/vec_sext.ll
    llvm/trunk/test/Transforms/InstCombine/vec_shuffle.ll
    llvm/trunk/test/Transforms/InstCombine/vector-casts.ll
    llvm/trunk/test/Transforms/InstCombine/vector-concat-binop.ll
    llvm/trunk/test/Transforms/InstCombine/vector-mul.ll
    llvm/trunk/test/Transforms/InstCombine/vector-type.ll
    llvm/trunk/test/Transforms/InstCombine/vector-udiv.ll
    llvm/trunk/test/Transforms/InstCombine/vector-urem.ll
    llvm/trunk/test/Transforms/InstCombine/vector-xor.ll
    llvm/trunk/test/Transforms/InstCombine/vector_gep1.ll
    llvm/trunk/test/Transforms/InstCombine/vector_gep2.ll
    llvm/trunk/test/Transforms/InstCombine/vector_insertelt_shuffle.ll
    llvm/trunk/test/Transforms/InstCombine/volatile_store.ll
    llvm/trunk/test/Transforms/InstCombine/wcslen-1.ll
    llvm/trunk/test/Transforms/InstCombine/wcslen-2.ll
    llvm/trunk/test/Transforms/InstCombine/wcslen-3.ll
    llvm/trunk/test/Transforms/InstCombine/wcslen-4.ll
    llvm/trunk/test/Transforms/InstCombine/weak-symbols.ll
    llvm/trunk/test/Transforms/InstCombine/win-math.ll
    llvm/trunk/test/Transforms/InstCombine/with_overflow.ll
    llvm/trunk/test/Transforms/InstCombine/xor-icmps.ll
    llvm/trunk/test/Transforms/InstCombine/xor-undef.ll
    llvm/trunk/test/Transforms/InstCombine/xor.ll
    llvm/trunk/test/Transforms/InstCombine/xor2.ll
    llvm/trunk/test/Transforms/InstCombine/zero-point-zero-add.ll
    llvm/trunk/test/Transforms/InstCombine/zeroext-and-reduce.ll
    llvm/trunk/test/Transforms/InstCombine/zext-bool-add-sub.ll
    llvm/trunk/test/Transforms/InstCombine/zext-fold.ll
    llvm/trunk/test/Transforms/InstCombine/zext-or-icmp.ll
    llvm/trunk/test/Transforms/InstCombine/zext-phi.ll
    llvm/trunk/test/Transforms/InstCombine/zext.ll
    llvm/trunk/test/Transforms/InstMerge/
    llvm/trunk/test/Transforms/InstMerge/exceptions.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_barrier_call.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_bugfix_22613.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_check_debug.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_debuginvariant.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_no_barrier_call.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_no_barrier_load.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_no_barrier_store.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_two_stores.ll
    llvm/trunk/test/Transforms/InstMerge/st_sink_with_barrier.ll
    llvm/trunk/test/Transforms/InstNamer/
    llvm/trunk/test/Transforms/InstNamer/basic.ll
    llvm/trunk/test/Transforms/InstSimplify/
    llvm/trunk/test/Transforms/InstSimplify/2010-12-20-Boolean.ll
    llvm/trunk/test/Transforms/InstSimplify/2011-01-14-Thread.ll
    llvm/trunk/test/Transforms/InstSimplify/2011-02-01-Vector.ll
    llvm/trunk/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll
    llvm/trunk/test/Transforms/InstSimplify/2011-10-27-BinOpCrash.ll
    llvm/trunk/test/Transforms/InstSimplify/2011-11-23-MaskedBitsCrash.ll
    llvm/trunk/test/Transforms/InstSimplify/2013-04-19-ConstantFoldingCrash.ll
    llvm/trunk/test/Transforms/InstSimplify/AndOrXor.ll
    llvm/trunk/test/Transforms/InstSimplify/add-mask.ll
    llvm/trunk/test/Transforms/InstSimplify/add.ll
    llvm/trunk/test/Transforms/InstSimplify/addsub.ll
    llvm/trunk/test/Transforms/InstSimplify/and-icmps-same-ops.ll
    llvm/trunk/test/Transforms/InstSimplify/and-or-icmp-zero.ll
    llvm/trunk/test/Transforms/InstSimplify/assume.ll
    llvm/trunk/test/Transforms/InstSimplify/bitcast-vector-fold.ll
    llvm/trunk/test/Transforms/InstSimplify/bitreverse-fold.ll
    llvm/trunk/test/Transforms/InstSimplify/bitreverse.ll
    llvm/trunk/test/Transforms/InstSimplify/bswap.ll
    llvm/trunk/test/Transforms/InstSimplify/call.ll
    llvm/trunk/test/Transforms/InstSimplify/cast-unsigned-icmp-cmp-0.ll
    llvm/trunk/test/Transforms/InstSimplify/cast.ll
    llvm/trunk/test/Transforms/InstSimplify/cmp_of_min_max.ll
    llvm/trunk/test/Transforms/InstSimplify/compare.ll
    llvm/trunk/test/Transforms/InstSimplify/constantfold-add-nuw-allones-to-allones.ll
    llvm/trunk/test/Transforms/InstSimplify/constantfold-shl-nuw-C-to-C.ll
    llvm/trunk/test/Transforms/InstSimplify/dead-code-removal.ll
    llvm/trunk/test/Transforms/InstSimplify/div.ll
    llvm/trunk/test/Transforms/InstSimplify/exact-nsw-nuw.ll
    llvm/trunk/test/Transforms/InstSimplify/extract-element.ll
    llvm/trunk/test/Transforms/InstSimplify/fast-math.ll
    llvm/trunk/test/Transforms/InstSimplify/fcmp-select.ll
    llvm/trunk/test/Transforms/InstSimplify/fdiv.ll
    llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll
    llvm/trunk/test/Transforms/InstSimplify/floating-point-compare.ll
    llvm/trunk/test/Transforms/InstSimplify/fold-builtin-fma.ll
    llvm/trunk/test/Transforms/InstSimplify/fold-intrinsics.ll
    llvm/trunk/test/Transforms/InstSimplify/fp-nan.ll
    llvm/trunk/test/Transforms/InstSimplify/fp-undef.ll
    llvm/trunk/test/Transforms/InstSimplify/gep.ll
    llvm/trunk/test/Transforms/InstSimplify/icmp-abs-nabs.ll
    llvm/trunk/test/Transforms/InstSimplify/icmp-bool-constant.ll
    llvm/trunk/test/Transforms/InstSimplify/icmp-constant.ll
    llvm/trunk/test/Transforms/InstSimplify/icmp-ranges.ll
    llvm/trunk/test/Transforms/InstSimplify/implies.ll
    llvm/trunk/test/Transforms/InstSimplify/insertelement.ll
    llvm/trunk/test/Transforms/InstSimplify/known-never-nan.ll
    llvm/trunk/test/Transforms/InstSimplify/load-relative-32.ll
    llvm/trunk/test/Transforms/InstSimplify/load-relative.ll
    llvm/trunk/test/Transforms/InstSimplify/load.ll
    llvm/trunk/test/Transforms/InstSimplify/log-exp-intrinsic.ll
    llvm/trunk/test/Transforms/InstSimplify/log10-pow10-intrinsic.ll
    llvm/trunk/test/Transforms/InstSimplify/log2-pow2-intrinsic.ll
    llvm/trunk/test/Transforms/InstSimplify/logic-of-fcmps.ll
    llvm/trunk/test/Transforms/InstSimplify/maxmin.ll
    llvm/trunk/test/Transforms/InstSimplify/mul.ll
    llvm/trunk/test/Transforms/InstSimplify/negate.ll
    llvm/trunk/test/Transforms/InstSimplify/noalias-ptr.ll
    llvm/trunk/test/Transforms/InstSimplify/or-icmps-same-ops.ll
    llvm/trunk/test/Transforms/InstSimplify/or.ll
    llvm/trunk/test/Transforms/InstSimplify/past-the-end.ll
    llvm/trunk/test/Transforms/InstSimplify/phi.ll
    llvm/trunk/test/Transforms/InstSimplify/pr28725.ll
    llvm/trunk/test/Transforms/InstSimplify/pr33957.ll
    llvm/trunk/test/Transforms/InstSimplify/ptr_diff.ll
    llvm/trunk/test/Transforms/InstSimplify/reassociate.ll
    llvm/trunk/test/Transforms/InstSimplify/rem.ll
    llvm/trunk/test/Transforms/InstSimplify/require-dominator.ll
    llvm/trunk/test/Transforms/InstSimplify/returned.ll
    llvm/trunk/test/Transforms/InstSimplify/round-intrinsics.ll
    llvm/trunk/test/Transforms/InstSimplify/saturating-add-sub.ll
    llvm/trunk/test/Transforms/InstSimplify/sdiv.ll
    llvm/trunk/test/Transforms/InstSimplify/select-and-cmp.ll
    llvm/trunk/test/Transforms/InstSimplify/select-implied.ll
    llvm/trunk/test/Transforms/InstSimplify/select-or-cmp.ll
    llvm/trunk/test/Transforms/InstSimplify/select.ll
    llvm/trunk/test/Transforms/InstSimplify/shift-128-kb.ll
    llvm/trunk/test/Transforms/InstSimplify/shift-knownbits.ll
    llvm/trunk/test/Transforms/InstSimplify/shift.ll
    llvm/trunk/test/Transforms/InstSimplify/shr-nop.ll
    llvm/trunk/test/Transforms/InstSimplify/shr-scalar-vector-consistency.ll
    llvm/trunk/test/Transforms/InstSimplify/shufflevector.ll
    llvm/trunk/test/Transforms/InstSimplify/signed-div-rem.ll
    llvm/trunk/test/Transforms/InstSimplify/simplify-nested-bitcast.ll
    llvm/trunk/test/Transforms/InstSimplify/srem.ll
    llvm/trunk/test/Transforms/InstSimplify/sub.ll
    llvm/trunk/test/Transforms/InstSimplify/undef.ll
    llvm/trunk/test/Transforms/InstSimplify/vec-cmp.ll
    llvm/trunk/test/Transforms/InstSimplify/vector_gep.ll
    llvm/trunk/test/Transforms/InstSimplify/vector_ptr_bitcast.ll
    llvm/trunk/test/Transforms/InterleavedAccess/
    llvm/trunk/test/Transforms/InterleavedAccess/AArch64/
    llvm/trunk/test/Transforms/InterleavedAccess/AArch64/interleaved-accesses-extract-user.ll
    llvm/trunk/test/Transforms/InterleavedAccess/AArch64/interleaved-accesses.ll
    llvm/trunk/test/Transforms/InterleavedAccess/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/InterleavedAccess/ARM/
    llvm/trunk/test/Transforms/InterleavedAccess/ARM/interleaved-accesses-extract-user.ll
    llvm/trunk/test/Transforms/InterleavedAccess/ARM/interleaved-accesses.ll
    llvm/trunk/test/Transforms/InterleavedAccess/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/InterleavedAccess/X86/
    llvm/trunk/test/Transforms/InterleavedAccess/X86/interleaved-accesses-64bits-avx.ll
    llvm/trunk/test/Transforms/InterleavedAccess/X86/interleavedLoad.ll
    llvm/trunk/test/Transforms/InterleavedAccess/X86/interleavedStore.ll
    llvm/trunk/test/Transforms/InterleavedAccess/X86/lit.local.cfg
    llvm/trunk/test/Transforms/Internalize/
    llvm/trunk/test/Transforms/Internalize/2009-01-05-InternalizeAliases.ll
    llvm/trunk/test/Transforms/Internalize/apifile
    llvm/trunk/test/Transforms/Internalize/comdat.ll
    llvm/trunk/test/Transforms/Internalize/lists.ll
    llvm/trunk/test/Transforms/Internalize/local-visibility.ll
    llvm/trunk/test/Transforms/Internalize/stackguard.ll
    llvm/trunk/test/Transforms/Internalize/used.ll
    llvm/trunk/test/Transforms/JumpThreading/
    llvm/trunk/test/Transforms/JumpThreading/2008-11-27-EntryMunge.ll
    llvm/trunk/test/Transforms/JumpThreading/2010-08-26-and.ll
    llvm/trunk/test/Transforms/JumpThreading/2011-04-02-SimplifyDeadBlock.ll
    llvm/trunk/test/Transforms/JumpThreading/2011-04-14-InfLoop.ll
    llvm/trunk/test/Transforms/JumpThreading/2012-07-19-NoSuccessorIndirectBr.ll
    llvm/trunk/test/Transforms/JumpThreading/PR33357-lvi-recursion.ll
    llvm/trunk/test/Transforms/JumpThreading/PR37745.ll
    llvm/trunk/test/Transforms/JumpThreading/and-and-cond.ll
    llvm/trunk/test/Transforms/JumpThreading/and-cond.ll
    llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll
    llvm/trunk/test/Transforms/JumpThreading/assume.ll
    llvm/trunk/test/Transforms/JumpThreading/basic.ll
    llvm/trunk/test/Transforms/JumpThreading/bb-unreachable-from-entry.ll
    llvm/trunk/test/Transforms/JumpThreading/branch-debug-info.ll
    llvm/trunk/test/Transforms/JumpThreading/branch-no-const.ll
    llvm/trunk/test/Transforms/JumpThreading/callbr-edge-split.ll
    llvm/trunk/test/Transforms/JumpThreading/combine-metadata.ll
    llvm/trunk/test/Transforms/JumpThreading/compare.ll
    llvm/trunk/test/Transforms/JumpThreading/conservative-lvi.ll
    llvm/trunk/test/Transforms/JumpThreading/crash.ll
    llvm/trunk/test/Transforms/JumpThreading/ddt-crash.ll
    llvm/trunk/test/Transforms/JumpThreading/ddt-crash2.ll
    llvm/trunk/test/Transforms/JumpThreading/ddt-crash3.ll
    llvm/trunk/test/Transforms/JumpThreading/ddt-crash4.ll
    llvm/trunk/test/Transforms/JumpThreading/degenerate-phi.ll
    llvm/trunk/test/Transforms/JumpThreading/fold-not-thread.ll
    llvm/trunk/test/Transforms/JumpThreading/guards.ll
    llvm/trunk/test/Transforms/JumpThreading/header-succ.ll
    llvm/trunk/test/Transforms/JumpThreading/implied-cond.ll
    llvm/trunk/test/Transforms/JumpThreading/indirectbr.ll
    llvm/trunk/test/Transforms/JumpThreading/induction.ll
    llvm/trunk/test/Transforms/JumpThreading/landing-pad.ll
    llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll
    llvm/trunk/test/Transforms/JumpThreading/lvi-tristate.ll
    llvm/trunk/test/Transforms/JumpThreading/no-irreducible-loops.ll
    llvm/trunk/test/Transforms/JumpThreading/or-undef.ll
    llvm/trunk/test/Transforms/JumpThreading/phi-eq.ll
    llvm/trunk/test/Transforms/JumpThreading/phi-known.ll
    llvm/trunk/test/Transforms/JumpThreading/pr15851_hang.ll
    llvm/trunk/test/Transforms/JumpThreading/pr22086.ll
    llvm/trunk/test/Transforms/JumpThreading/pr26096.ll
    llvm/trunk/test/Transforms/JumpThreading/pr27840.ll
    llvm/trunk/test/Transforms/JumpThreading/pr33605.ll
    llvm/trunk/test/Transforms/JumpThreading/pr33917.ll
    llvm/trunk/test/Transforms/JumpThreading/pr36133.ll
    llvm/trunk/test/Transforms/JumpThreading/pr40992-indirectbr-folding.ll
    llvm/trunk/test/Transforms/JumpThreading/pr9331.ll
    llvm/trunk/test/Transforms/JumpThreading/range-compare.ll
    llvm/trunk/test/Transforms/JumpThreading/removed-use.ll
    llvm/trunk/test/Transforms/JumpThreading/select.ll
    llvm/trunk/test/Transforms/JumpThreading/static-profile.ll
    llvm/trunk/test/Transforms/JumpThreading/thread-cmp.ll
    llvm/trunk/test/Transforms/JumpThreading/thread-loads.ll
    llvm/trunk/test/Transforms/JumpThreading/threading_prof1.ll
    llvm/trunk/test/Transforms/JumpThreading/threading_prof2.ll
    llvm/trunk/test/Transforms/JumpThreading/update-edge-weight.ll
    llvm/trunk/test/Transforms/LCSSA/
    llvm/trunk/test/Transforms/LCSSA/2006-06-03-IncorrectIDFPhis.ll
    llvm/trunk/test/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll
    llvm/trunk/test/Transforms/LCSSA/2006-07-09-NoDominator.ll
    llvm/trunk/test/Transforms/LCSSA/2006-10-31-UnreachableBlock-2.ll
    llvm/trunk/test/Transforms/LCSSA/2006-10-31-UnreachableBlock.ll
    llvm/trunk/test/Transforms/LCSSA/2007-07-12-LICM-2.ll
    llvm/trunk/test/Transforms/LCSSA/2007-07-12-LICM-3.ll
    llvm/trunk/test/Transforms/LCSSA/2007-07-12-LICM.ll
    llvm/trunk/test/Transforms/LCSSA/avoid-intrinsics-in-catchswitch.ll
    llvm/trunk/test/Transforms/LCSSA/basictest.ll
    llvm/trunk/test/Transforms/LCSSA/indirectbr.ll
    llvm/trunk/test/Transforms/LCSSA/invoke-dest.ll
    llvm/trunk/test/Transforms/LCSSA/mixed-catch.ll
    llvm/trunk/test/Transforms/LCSSA/pr28424.ll
    llvm/trunk/test/Transforms/LCSSA/pr28608.ll
    llvm/trunk/test/Transforms/LCSSA/remove-phis.ll
    llvm/trunk/test/Transforms/LCSSA/rewrite-existing-dbg-values.ll
    llvm/trunk/test/Transforms/LCSSA/unreachable-use.ll
    llvm/trunk/test/Transforms/LCSSA/unused-phis.ll
    llvm/trunk/test/Transforms/LICM/
    llvm/trunk/test/Transforms/LICM/2003-02-26-LoopExitNotDominated.ll
    llvm/trunk/test/Transforms/LICM/2003-02-27-NestedLoopExitBlocks.ll
    llvm/trunk/test/Transforms/LICM/2003-02-27-PreheaderExitNodeUpdate.ll
    llvm/trunk/test/Transforms/LICM/2003-02-27-PreheaderProblem.ll
    llvm/trunk/test/Transforms/LICM/2003-02-27-StoreSinkPHIs.ll
    llvm/trunk/test/Transforms/LICM/2003-02-28-PromoteDifferentType.ll
    llvm/trunk/test/Transforms/LICM/2003-05-02-LoadHoist.ll
    llvm/trunk/test/Transforms/LICM/2003-12-11-SinkingToPHI.ll
    llvm/trunk/test/Transforms/LICM/2004-09-14-AliasAnalysisInvalidate.ll
    llvm/trunk/test/Transforms/LICM/2004-11-17-UndefIndexCrash.ll
    llvm/trunk/test/Transforms/LICM/2006-09-12-DeadUserOfSunkInstr.ll
    llvm/trunk/test/Transforms/LICM/2007-05-22-VolatileSink.ll
    llvm/trunk/test/Transforms/LICM/2007-07-30-AliasSet.ll
    llvm/trunk/test/Transforms/LICM/2007-09-17-PromoteValue.ll
    llvm/trunk/test/Transforms/LICM/2007-09-24-PromoteNullValue.ll
    llvm/trunk/test/Transforms/LICM/2007-10-01-PromoteSafeValue.ll
    llvm/trunk/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
    llvm/trunk/test/Transforms/LICM/2008-07-22-LoadGlobalConstant.ll
    llvm/trunk/test/Transforms/LICM/2009-12-10-LICM-Indbr-Crash.ll
    llvm/trunk/test/Transforms/LICM/2011-04-06-HoistMissedASTUpdate.ll
    llvm/trunk/test/Transforms/LICM/2011-04-06-PromoteResultOfPromotion.ll
    llvm/trunk/test/Transforms/LICM/2011-04-09-RAUW-AST.ll
    llvm/trunk/test/Transforms/LICM/2011-07-06-Alignment.ll
    llvm/trunk/test/Transforms/LICM/2014-09-10-doFinalizationAssert.ll
    llvm/trunk/test/Transforms/LICM/AliasSetMemSet.ll
    llvm/trunk/test/Transforms/LICM/PR19798.ll
    llvm/trunk/test/Transforms/LICM/PR21582.ll
    llvm/trunk/test/Transforms/LICM/PR24013.ll
    llvm/trunk/test/Transforms/LICM/Preserve-LCSSA.ll
    llvm/trunk/test/Transforms/LICM/alias-set-tracker-loss.ll
    llvm/trunk/test/Transforms/LICM/argmemonly-call.ll
    llvm/trunk/test/Transforms/LICM/assume.ll
    llvm/trunk/test/Transforms/LICM/atomics.ll
    llvm/trunk/test/Transforms/LICM/basictest.ll
    llvm/trunk/test/Transforms/LICM/bisect-state.ll
    llvm/trunk/test/Transforms/LICM/call-hoisting.ll
    llvm/trunk/test/Transforms/LICM/constexpr.ll
    llvm/trunk/test/Transforms/LICM/crash.ll
    llvm/trunk/test/Transforms/LICM/debug-value.ll
    llvm/trunk/test/Transforms/LICM/dropped-tbaa.ll
    llvm/trunk/test/Transforms/LICM/explicit_guards.ll
    llvm/trunk/test/Transforms/LICM/extra-copies.ll
    llvm/trunk/test/Transforms/LICM/fence.ll
    llvm/trunk/test/Transforms/LICM/funclet.ll
    llvm/trunk/test/Transforms/LICM/guards.ll
    llvm/trunk/test/Transforms/LICM/hoist-bitcast-load.ll
    llvm/trunk/test/Transforms/LICM/hoist-debuginvariant.ll
    llvm/trunk/test/Transforms/LICM/hoist-deref-load.ll
    llvm/trunk/test/Transforms/LICM/hoist-fast-fdiv.ll
    llvm/trunk/test/Transforms/LICM/hoist-invariant-load.ll
    llvm/trunk/test/Transforms/LICM/hoist-mustexec.ll
    llvm/trunk/test/Transforms/LICM/hoist-nounwind.ll
    llvm/trunk/test/Transforms/LICM/hoist-phi.ll
    llvm/trunk/test/Transforms/LICM/hoist-round.ll
    llvm/trunk/test/Transforms/LICM/hoisting.ll
    llvm/trunk/test/Transforms/LICM/infinite_loops.ll
    llvm/trunk/test/Transforms/LICM/int_sideeffect.ll
    llvm/trunk/test/Transforms/LICM/invariant.start.ll
    llvm/trunk/test/Transforms/LICM/lcssa-ssa-promoter.ll
    llvm/trunk/test/Transforms/LICM/loopsink-pr38462.ll
    llvm/trunk/test/Transforms/LICM/loopsink-pr39570.ll
    llvm/trunk/test/Transforms/LICM/loopsink-pr39695.ll
    llvm/trunk/test/Transforms/LICM/loopsink.ll
    llvm/trunk/test/Transforms/LICM/no-preheader-test.ll
    llvm/trunk/test/Transforms/LICM/opt-remarks-conditional-load.ll
    llvm/trunk/test/Transforms/LICM/opt-remarks-intervening-store.ll
    llvm/trunk/test/Transforms/LICM/opt-remarks.ll
    llvm/trunk/test/Transforms/LICM/pr23608.ll
    llvm/trunk/test/Transforms/LICM/pr26843.ll
    llvm/trunk/test/Transforms/LICM/pr27262.ll
    llvm/trunk/test/Transforms/LICM/pr32129.ll
    llvm/trunk/test/Transforms/LICM/pr35342.ll
    llvm/trunk/test/Transforms/LICM/pr36228.ll
    llvm/trunk/test/Transforms/LICM/pr37323.ll
    llvm/trunk/test/Transforms/LICM/pr40317.ll
    llvm/trunk/test/Transforms/LICM/preheader-safe.ll
    llvm/trunk/test/Transforms/LICM/promote-order.ll
    llvm/trunk/test/Transforms/LICM/promote-tls.ll
    llvm/trunk/test/Transforms/LICM/read-only-calls.ll
    llvm/trunk/test/Transforms/LICM/scalar-promote-memmodel.ll
    llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll
    llvm/trunk/test/Transforms/LICM/scalar-promote.ll
    llvm/trunk/test/Transforms/LICM/sink-foldable.ll
    llvm/trunk/test/Transforms/LICM/sink-promote.ll
    llvm/trunk/test/Transforms/LICM/sink.ll
    llvm/trunk/test/Transforms/LICM/sinking.ll
    llvm/trunk/test/Transforms/LICM/speculate.ll
    llvm/trunk/test/Transforms/LICM/store-hoisting.ll
    llvm/trunk/test/Transforms/LICM/strlen.ll
    llvm/trunk/test/Transforms/LICM/unrolled-deeply-nested.ll
    llvm/trunk/test/Transforms/LICM/update-scev.ll
    llvm/trunk/test/Transforms/LICM/volatile-alias.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/aa-metadata.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/adjust-alloca-alignment.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/complex-index.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/extended-index.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/gep-bitcast.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/insertion-point.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/interleaved-mayalias-store.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/invariant-load.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/merge-stores-private.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/merge-stores.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/merge-vectors.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/missing-alignment.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/multiple_tails.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/no-implicit-float.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/optnone.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/pointer-elements.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/selects.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/store_with_aliasing_load.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/AMDGPU/weird-type-accesses.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/NVPTX/
    llvm/trunk/test/Transforms/LoadStoreVectorizer/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/LoadStoreVectorizer/NVPTX/merge-across-side-effects.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/NVPTX/non-instr-bitcast.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/NVPTX/propagate-invariance-metadata.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/codegenprepare-produced-address-math.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/compare-scev-by-complexity.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/correct-order.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/lit.local.cfg
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/load-width.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/merge-tbaa.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/non-byte-size.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/preserve-order32.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/preserve-order64.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/subchain-interleaved.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/X86/vector-scalar.ll
    llvm/trunk/test/Transforms/LoadStoreVectorizer/int_sideeffect.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/kryo-large-stride.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/large-stride.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/opt-remark-with-hotness.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/AArch64/opt-remark.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/PowerPC/
    llvm/trunk/test/Transforms/LoopDataPrefetch/PowerPC/basic.ll
    llvm/trunk/test/Transforms/LoopDataPrefetch/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/LoopDeletion/
    llvm/trunk/test/Transforms/LoopDeletion/2007-07-23-InfiniteLoop.ll
    llvm/trunk/test/Transforms/LoopDeletion/2008-05-06-Phi.ll
    llvm/trunk/test/Transforms/LoopDeletion/2011-06-21-phioperands.ll
    llvm/trunk/test/Transforms/LoopDeletion/2017-07-11-incremental-dt.ll
    llvm/trunk/test/Transforms/LoopDeletion/crashbc.ll
    llvm/trunk/test/Transforms/LoopDeletion/dcetest.ll
    llvm/trunk/test/Transforms/LoopDeletion/diundef.ll
    llvm/trunk/test/Transforms/LoopDeletion/invalidation.ll
    llvm/trunk/test/Transforms/LoopDeletion/multiple-exit-conditions.ll
    llvm/trunk/test/Transforms/LoopDeletion/multiple-exits.ll
    llvm/trunk/test/Transforms/LoopDeletion/simplify-then-delete.ll
    llvm/trunk/test/Transforms/LoopDeletion/unreachable-loops.ll
    llvm/trunk/test/Transforms/LoopDeletion/update-scev.ll
    llvm/trunk/test/Transforms/LoopDeletion/use-in-unreachable.ll
    llvm/trunk/test/Transforms/LoopDistribute/
    llvm/trunk/test/Transforms/LoopDistribute/basic-with-memchecks.ll
    llvm/trunk/test/Transforms/LoopDistribute/basic.ll
    llvm/trunk/test/Transforms/LoopDistribute/bounds-expansion-bug.ll
    llvm/trunk/test/Transforms/LoopDistribute/crash-in-memcheck-generation.ll
    llvm/trunk/test/Transforms/LoopDistribute/diagnostics-with-hotness.ll
    llvm/trunk/test/Transforms/LoopDistribute/diagnostics.ll
    llvm/trunk/test/Transforms/LoopDistribute/disable_nonforced.ll
    llvm/trunk/test/Transforms/LoopDistribute/disable_nonforced_enable.ll
    llvm/trunk/test/Transforms/LoopDistribute/followup.ll
    llvm/trunk/test/Transforms/LoopDistribute/metadata.ll
    llvm/trunk/test/Transforms/LoopDistribute/no-if-convert.ll
    llvm/trunk/test/Transforms/LoopDistribute/outside-use.ll
    llvm/trunk/test/Transforms/LoopDistribute/pr28443.ll
    llvm/trunk/test/Transforms/LoopDistribute/program-order.ll
    llvm/trunk/test/Transforms/LoopDistribute/symbolic-stride.ll
    llvm/trunk/test/Transforms/LoopDistribute/unknown-bounds-for-memchecks.ll
    llvm/trunk/test/Transforms/LoopFusion/
    llvm/trunk/test/Transforms/LoopFusion/cannot_fuse.ll
    llvm/trunk/test/Transforms/LoopFusion/four_loops.ll
    llvm/trunk/test/Transforms/LoopFusion/inner_loops.ll
    llvm/trunk/test/Transforms/LoopFusion/loop_nest.ll
    llvm/trunk/test/Transforms/LoopFusion/simple.ll
    llvm/trunk/test/Transforms/LoopIdiom/
    llvm/trunk/test/Transforms/LoopIdiom/AMDGPU/
    llvm/trunk/test/Transforms/LoopIdiom/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoopIdiom/AMDGPU/popcnt.ll
    llvm/trunk/test/Transforms/LoopIdiom/ARM/
    llvm/trunk/test/Transforms/LoopIdiom/ARM/ctlz.ll
    llvm/trunk/test/Transforms/LoopIdiom/X86/
    llvm/trunk/test/Transforms/LoopIdiom/X86/ctlz.ll
    llvm/trunk/test/Transforms/LoopIdiom/X86/cttz.ll
    llvm/trunk/test/Transforms/LoopIdiom/X86/lit.local.cfg
    llvm/trunk/test/Transforms/LoopIdiom/X86/popcnt.ll
    llvm/trunk/test/Transforms/LoopIdiom/X86/unordered-atomic-memcpy.ll
    llvm/trunk/test/Transforms/LoopIdiom/basic-address-space.ll
    llvm/trunk/test/Transforms/LoopIdiom/basic.ll
    llvm/trunk/test/Transforms/LoopIdiom/crash.ll
    llvm/trunk/test/Transforms/LoopIdiom/ctpop-multiple-users-crash.ll
    llvm/trunk/test/Transforms/LoopIdiom/dbginfo-cost.ll
    llvm/trunk/test/Transforms/LoopIdiom/debug-line.ll
    llvm/trunk/test/Transforms/LoopIdiom/int_sideeffect.ll
    llvm/trunk/test/Transforms/LoopIdiom/lir-heurs-multi-block-loop.ll
    llvm/trunk/test/Transforms/LoopIdiom/memset_noidiom.ll
    llvm/trunk/test/Transforms/LoopIdiom/non-canonical-loop.ll
    llvm/trunk/test/Transforms/LoopIdiom/non-integral-pointers.ll
    llvm/trunk/test/Transforms/LoopIdiom/nontemporal_store.ll
    llvm/trunk/test/Transforms/LoopIdiom/pr28196.ll
    llvm/trunk/test/Transforms/LoopIdiom/pr33114.ll
    llvm/trunk/test/Transforms/LoopIdiom/scev-invalidation.ll
    llvm/trunk/test/Transforms/LoopIdiom/scev-invalidation_topmostloop.ll
    llvm/trunk/test/Transforms/LoopIdiom/struct-custom-dl.ll
    llvm/trunk/test/Transforms/LoopIdiom/struct.ll
    llvm/trunk/test/Transforms/LoopIdiom/struct_pattern.ll
    llvm/trunk/test/Transforms/LoopIdiom/unordered-atomic-memcpy-noarch.ll
    llvm/trunk/test/Transforms/LoopIdiom/unroll-custom-dl.ll
    llvm/trunk/test/Transforms/LoopIdiom/unroll.ll
    llvm/trunk/test/Transforms/LoopIdiom/unsafe.ll
    llvm/trunk/test/Transforms/LoopIdiom/unwind.ll
    llvm/trunk/test/Transforms/LoopInstSimplify/
    llvm/trunk/test/Transforms/LoopInstSimplify/basic.ll
    llvm/trunk/test/Transforms/LoopInterchange/
    llvm/trunk/test/Transforms/LoopInterchange/call-instructions.ll
    llvm/trunk/test/Transforms/LoopInterchange/currentLimitation.ll
    llvm/trunk/test/Transforms/LoopInterchange/debuginfo.ll
    llvm/trunk/test/Transforms/LoopInterchange/inner-only-reductions.ll
    llvm/trunk/test/Transforms/LoopInterchange/interchange-flow-dep-outer.ll
    llvm/trunk/test/Transforms/LoopInterchange/interchange-insts-between-indvar.ll
    llvm/trunk/test/Transforms/LoopInterchange/interchange-no-deps.ll
    llvm/trunk/test/Transforms/LoopInterchange/interchangeable.ll
    llvm/trunk/test/Transforms/LoopInterchange/lcssa.ll
    llvm/trunk/test/Transforms/LoopInterchange/loop-interchange-optimization-remarks.ll
    llvm/trunk/test/Transforms/LoopInterchange/not-interchanged-dependencies-1.ll
    llvm/trunk/test/Transforms/LoopInterchange/not-interchanged-loop-nest-3.ll
    llvm/trunk/test/Transforms/LoopInterchange/not-interchanged-tightly-nested.ll
    llvm/trunk/test/Transforms/LoopInterchange/outer-only-reductions.ll
    llvm/trunk/test/Transforms/LoopInterchange/phi-ordering.ll
    llvm/trunk/test/Transforms/LoopInterchange/profitability.ll
    llvm/trunk/test/Transforms/LoopInterchange/reductions-across-inner-and-outer-loop.ll
    llvm/trunk/test/Transforms/LoopLoadElim/
    llvm/trunk/test/Transforms/LoopLoadElim/backward.ll
    llvm/trunk/test/Transforms/LoopLoadElim/cond-load.ll
    llvm/trunk/test/Transforms/LoopLoadElim/def-store-before-load.ll
    llvm/trunk/test/Transforms/LoopLoadElim/forward.ll
    llvm/trunk/test/Transforms/LoopLoadElim/loop-simplify-dep.ll
    llvm/trunk/test/Transforms/LoopLoadElim/memcheck.ll
    llvm/trunk/test/Transforms/LoopLoadElim/multiple-stores-same-block.ll
    llvm/trunk/test/Transforms/LoopLoadElim/non-consecutive.ll
    llvm/trunk/test/Transforms/LoopLoadElim/opt-size.ll
    llvm/trunk/test/Transforms/LoopLoadElim/symbolic-stride.ll
    llvm/trunk/test/Transforms/LoopLoadElim/type-mismatch.ll
    llvm/trunk/test/Transforms/LoopLoadElim/unknown-dep.ll
    llvm/trunk/test/Transforms/LoopPredication/
    llvm/trunk/test/Transforms/LoopPredication/basic.ll
    llvm/trunk/test/Transforms/LoopPredication/basic_widenable_branch_guards.ll
    llvm/trunk/test/Transforms/LoopPredication/invariant_load.ll
    llvm/trunk/test/Transforms/LoopPredication/nested.ll
    llvm/trunk/test/Transforms/LoopPredication/profitability.ll
    llvm/trunk/test/Transforms/LoopPredication/reverse.ll
    llvm/trunk/test/Transforms/LoopPredication/visited.ll
    llvm/trunk/test/Transforms/LoopPredication/widened.ll
    llvm/trunk/test/Transforms/LoopReroll/
    llvm/trunk/test/Transforms/LoopReroll/basic.ll
    llvm/trunk/test/Transforms/LoopReroll/basic32iters.ll
    llvm/trunk/test/Transforms/LoopReroll/complex_reroll.ll
    llvm/trunk/test/Transforms/LoopReroll/indvar_with_ext.ll
    llvm/trunk/test/Transforms/LoopReroll/negative.ll
    llvm/trunk/test/Transforms/LoopReroll/nonconst_lb.ll
    llvm/trunk/test/Transforms/LoopReroll/ptrindvar.ll
    llvm/trunk/test/Transforms/LoopReroll/reduction.ll
    llvm/trunk/test/Transforms/LoopReroll/reroll_with_dbg.ll
    llvm/trunk/test/Transforms/LoopRotate/
    llvm/trunk/test/Transforms/LoopRotate/2009-01-25-SingleEntryPhi.ll
    llvm/trunk/test/Transforms/LoopRotate/PhiRename-1.ll
    llvm/trunk/test/Transforms/LoopRotate/PhiSelfReference-1.ll
    llvm/trunk/test/Transforms/LoopRotate/alloca.ll
    llvm/trunk/test/Transforms/LoopRotate/basic.ll
    llvm/trunk/test/Transforms/LoopRotate/callbr.ll
    llvm/trunk/test/Transforms/LoopRotate/catchret.ll   (with props)
    llvm/trunk/test/Transforms/LoopRotate/convergent.ll
    llvm/trunk/test/Transforms/LoopRotate/crash.ll
    llvm/trunk/test/Transforms/LoopRotate/dbg-value-duplicates.ll
    llvm/trunk/test/Transforms/LoopRotate/dbgvalue.ll
    llvm/trunk/test/Transforms/LoopRotate/indirectbr.ll
    llvm/trunk/test/Transforms/LoopRotate/loopexitinglatch.ll
    llvm/trunk/test/Transforms/LoopRotate/multiple-exits.ll
    llvm/trunk/test/Transforms/LoopRotate/nosimplifylatch.ll
    llvm/trunk/test/Transforms/LoopRotate/oz-disable.ll
    llvm/trunk/test/Transforms/LoopRotate/phi-dbgvalue.ll
    llvm/trunk/test/Transforms/LoopRotate/phi-duplicate.ll
    llvm/trunk/test/Transforms/LoopRotate/pr22337.ll
    llvm/trunk/test/Transforms/LoopRotate/pr2639.ll
    llvm/trunk/test/Transforms/LoopRotate/pr33701.ll
    llvm/trunk/test/Transforms/LoopRotate/pr35210.ll
    llvm/trunk/test/Transforms/LoopRotate/pr37205.ll
    llvm/trunk/test/Transforms/LoopRotate/preserve-loop-simplify.ll
    llvm/trunk/test/Transforms/LoopRotate/preserve-mssa.ll
    llvm/trunk/test/Transforms/LoopRotate/preserve-scev.ll
    llvm/trunk/test/Transforms/LoopRotate/simplifylatch.ll
    llvm/trunk/test/Transforms/LoopRotate/vect.omp.persistence.ll
    llvm/trunk/test/Transforms/LoopSimplify/
    llvm/trunk/test/Transforms/LoopSimplify/2003-04-25-AssertFail.ll
    llvm/trunk/test/Transforms/LoopSimplify/2003-05-12-PreheaderExitOfChild.ll
    llvm/trunk/test/Transforms/LoopSimplify/2003-08-15-PreheadersFail.ll
    llvm/trunk/test/Transforms/LoopSimplify/2003-12-10-ExitBlocksProblem.ll
    llvm/trunk/test/Transforms/LoopSimplify/2004-02-05-DominatorInfoCorruption.ll
    llvm/trunk/test/Transforms/LoopSimplify/2004-03-15-IncorrectDomUpdate.ll
    llvm/trunk/test/Transforms/LoopSimplify/2004-04-01-IncorrectDomUpdate.ll
    llvm/trunk/test/Transforms/LoopSimplify/2004-04-12-LoopSimplify-SwitchBackedges.ll
    llvm/trunk/test/Transforms/LoopSimplify/2004-04-13-LoopSimplifyUpdateDomFrontier.ll
    llvm/trunk/test/Transforms/LoopSimplify/2007-10-28-InvokeCrash.ll
    llvm/trunk/test/Transforms/LoopSimplify/2010-07-15-IncorrectDomFrontierUpdate.ll
    llvm/trunk/test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll
    llvm/trunk/test/Transforms/LoopSimplify/2011-12-14-LandingpadHeader.ll
    llvm/trunk/test/Transforms/LoopSimplify/2012-03-20-indirectbr.ll
    llvm/trunk/test/Transforms/LoopSimplify/ashr-crash.ll
    llvm/trunk/test/Transforms/LoopSimplify/basictest.ll
    llvm/trunk/test/Transforms/LoopSimplify/dbg-loc.ll
    llvm/trunk/test/Transforms/LoopSimplify/dup-preds.ll
    llvm/trunk/test/Transforms/LoopSimplify/hardertest.ll
    llvm/trunk/test/Transforms/LoopSimplify/indirectbr-backedge.ll
    llvm/trunk/test/Transforms/LoopSimplify/indirectbr.ll
    llvm/trunk/test/Transforms/LoopSimplify/merge-exits.ll
    llvm/trunk/test/Transforms/LoopSimplify/notify-scev.ll
    llvm/trunk/test/Transforms/LoopSimplify/phi-node-simplify.ll
    llvm/trunk/test/Transforms/LoopSimplify/pr26682.ll
    llvm/trunk/test/Transforms/LoopSimplify/pr28272.ll
    llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll
    llvm/trunk/test/Transforms/LoopSimplify/pr33494.ll
    llvm/trunk/test/Transforms/LoopSimplify/preserve-llvm-loop-metadata.ll
    llvm/trunk/test/Transforms/LoopSimplify/preserve-scev.ll
    llvm/trunk/test/Transforms/LoopSimplify/single-backedge.ll
    llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/
    llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/irreducible_cfg.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/lcssa.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/live_block_marking.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/merge-header.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/mssa_update.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/phi_with_duplicating_inputs.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/pr39783.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll
    llvm/trunk/test/Transforms/LoopSimplifyCFG/update_parents.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/
    llvm/trunk/test/Transforms/LoopStrengthReduce/2005-08-15-AddRecIV.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2005-08-17-OutOfLoopVariant.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2007-04-23-UseIterator.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2008-08-13-CmpStride.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2008-09-09-Overflow.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2009-01-13-nonconstant-stride-outside-loop.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2009-04-28-no-reduce-mul.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-07-19-CritEdgeBreakCrash.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-10-03-CritEdgeMerge.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-10-06-ReusePhi.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-10-13-SCEVChain.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-10-14-IntPtr.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2011-12-19-PostincQuadratic.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-01-02-nopreheader.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-01-16-nopreheader.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-03-15-nopreheader.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-03-26-constexpr.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-07-13-ExpandUDiv.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2012-07-18-LimitReassociate.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2013-01-05-IndBr.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/2013-01-14-ReuseCast.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/lsr-memcpy.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/lsr-memset.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/lsr-reuse.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/req-regs.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AArch64/small-constant.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/atomics.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/different-addrspace-addressing-mode-loops.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/different-addrspace-crash.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/lsr-postinc-pos-addrspace.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/lsr-void.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/AMDGPU/preserve-addrspace-assert.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/2012-06-15-lsr-noaddrmode.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/addrec-is-loop-invariant.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/complexity.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/ivchain-ARM.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/LoopStrengthReduce/NVPTX/
    llvm/trunk/test/Transforms/LoopStrengthReduce/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/LoopStrengthReduce/NVPTX/trunc.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2008-08-14-ShadowIV.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2009-11-10-LSRCrash.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2011-07-20-DoubleIV.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2011-11-29-postincphi.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2011-12-04-loserreg.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/bin_power.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical-2.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/canonical.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/incorrect-offset-scaling.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-X86.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/ivchain-stress-X86.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lit.local.cfg
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lsr-expand-quadratic.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lsr-filtering-scaledreg.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lsr-insns-1.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lsr-insns-2.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/lsr-overflow.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/macro-fuse-cmp.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/nested-loop.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/no_superflous_induction_vars.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr17473.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr28719.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/pr40514.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/X86/sibling-loops.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/addrec-gep-address-space.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/addrec-gep.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/address-space-loop.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/count-to-zero.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dead-phi.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/different-type-ivs.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dominate-assert.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dont-hoist-simple-loop-constants.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dont_insert_redundant_ops.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dont_reduce_bytes.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/dont_reverse.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ephemeral.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/exit_compare_live_range.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/funclet.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/hoist-parent-preheader.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/illegal-addr-modes.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/invariant_value_first.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/invariant_value_first_arg.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ivchain.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/lsr-comp-time.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/lsr-overflow.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/missing-phi-operand-update.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/negative-scale.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/nested-reduce.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/nonintegral.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/nonlinear-postinc.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/ops_after_indvar.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/post-inc-icmpzero.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/post-inc-optsize.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr12018.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr12048.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr12691.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr18165.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr2537.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr25541.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr2570.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr27056.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr3086.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr31627.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr3399.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/pr3571.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/preserve-gep-loop-variant.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/related_indvars.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/remove_indvar.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/scaling_factor_cost_crash.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/scev-after-loopinstsimplify.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/scev-insertpt-bug.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/sext-ind-var.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/share_code_in_preheader.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/share_ivs.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/shl.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/two-combinations-bug.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/uglygep-address-space.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/uglygep.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/use_postinc_value_outside_loop.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/var_stride_used_by_compare.ll
    llvm/trunk/test/Transforms/LoopStrengthReduce/variable_stride.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/
    llvm/trunk/test/Transforms/LoopTransformWarning/distribution-remarks-missed.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/enable_and_isvectorized.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/optnone.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/unrollandjam-remarks-missed.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/unrolling-remarks-missed.ll
    llvm/trunk/test/Transforms/LoopTransformWarning/vectorization-remarks-missed.ll
    llvm/trunk/test/Transforms/LoopUnroll/
    llvm/trunk/test/Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll
    llvm/trunk/test/Transforms/LoopUnroll/2005-03-06-BadLoopInfoUpdate.ll
    llvm/trunk/test/Transforms/LoopUnroll/2006-08-24-MultiBlockLoop.ll
    llvm/trunk/test/Transforms/LoopUnroll/2007-04-16-PhiUpdate.ll
    llvm/trunk/test/Transforms/LoopUnroll/2007-05-05-UnrollMiscomp.ll
    llvm/trunk/test/Transforms/LoopUnroll/2007-05-09-UnknownTripCount.ll
    llvm/trunk/test/Transforms/LoopUnroll/2007-11-05-Crash.ll
    llvm/trunk/test/Transforms/LoopUnroll/2011-08-08-PhiUpdate.ll
    llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-IVSimplify.ll
    llvm/trunk/test/Transforms/LoopUnroll/2011-08-09-PhiUpdate.ll
    llvm/trunk/test/Transforms/LoopUnroll/2011-10-01-NoopTrunc.ll
    llvm/trunk/test/Transforms/LoopUnroll/2012-04-09-unroll-indirectbr.ll
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/falkor-prefetch.ll
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/full-unroll-trip-count-upper-bound.ll
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/partial.ll
    llvm/trunk/test/Transforms/LoopUnroll/AArch64/runtime-loop.ll
    llvm/trunk/test/Transforms/LoopUnroll/AMDGPU/
    llvm/trunk/test/Transforms/LoopUnroll/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/AMDGPU/unroll-barrier.ll
    llvm/trunk/test/Transforms/LoopUnroll/AMDGPU/unroll-cost-call.ll
    llvm/trunk/test/Transforms/LoopUnroll/AMDGPU/unroll-for-private.ll
    llvm/trunk/test/Transforms/LoopUnroll/ARM/
    llvm/trunk/test/Transforms/LoopUnroll/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/ARM/loop-unrolling.ll
    llvm/trunk/test/Transforms/LoopUnroll/ARM/multi-blocks.ll
    llvm/trunk/test/Transforms/LoopUnroll/Hexagon/
    llvm/trunk/test/Transforms/LoopUnroll/Hexagon/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/Hexagon/peel-small-loop.ll
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/a2-high-cost-trip-count-computation.ll
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/a2-unrolling.ll
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/p7-unrolling.ll
    llvm/trunk/test/Transforms/LoopUnroll/PowerPC/p8-unrolling-legalize-vectors.ll
    llvm/trunk/test/Transforms/LoopUnroll/X86/
    llvm/trunk/test/Transforms/LoopUnroll/X86/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnroll/X86/mmx.ll
    llvm/trunk/test/Transforms/LoopUnroll/X86/partial.ll
    llvm/trunk/test/Transforms/LoopUnroll/X86/store_cost.ll
    llvm/trunk/test/Transforms/LoopUnroll/basic.ll
    llvm/trunk/test/Transforms/LoopUnroll/complete_unroll_profitability_with_assume.ll
    llvm/trunk/test/Transforms/LoopUnroll/convergent.ll
    llvm/trunk/test/Transforms/LoopUnroll/debug-info.ll
    llvm/trunk/test/Transforms/LoopUnroll/disable-loop-unrolling_forced.ll
    llvm/trunk/test/Transforms/LoopUnroll/disable_nonforced.ll
    llvm/trunk/test/Transforms/LoopUnroll/disable_nonforced_count.ll
    llvm/trunk/test/Transforms/LoopUnroll/disable_nonforced_enable.ll
    llvm/trunk/test/Transforms/LoopUnroll/disable_nonforced_full.ll
    llvm/trunk/test/Transforms/LoopUnroll/ephemeral.ll
    llvm/trunk/test/Transforms/LoopUnroll/epilog_const_phi.ll
    llvm/trunk/test/Transforms/LoopUnroll/followup.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-bad-cost.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-crashers.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics-2.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics-cmp.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics-dce.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics-geps.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics-phi-prop.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-heuristics.ll
    llvm/trunk/test/Transforms/LoopUnroll/full-unroll-keep-first-exit.ll
    llvm/trunk/test/Transforms/LoopUnroll/high-cost-trip-count-computation.ll
    llvm/trunk/test/Transforms/LoopUnroll/ignore-annotation-intrinsic-cost.ll
    llvm/trunk/test/Transforms/LoopUnroll/invalidate_right_loop.ll
    llvm/trunk/test/Transforms/LoopUnroll/loop-remarks-with-hotness.ll
    llvm/trunk/test/Transforms/LoopUnroll/loop-remarks.ll
    llvm/trunk/test/Transforms/LoopUnroll/not-rotated.ll
    llvm/trunk/test/Transforms/LoopUnroll/partial-unroll-const-bounds.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-conditions.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-irreducible.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-negative.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-forced.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-pgo.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop-scev-invalidate.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop.ll
    llvm/trunk/test/Transforms/LoopUnroll/peel-loop2.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr10813.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr11361.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr14167.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr18861.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr27157.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr28132.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr31718.ll
    llvm/trunk/test/Transforms/LoopUnroll/pr33437.ll
    llvm/trunk/test/Transforms/LoopUnroll/rebuild_lcssa.ll
    llvm/trunk/test/Transforms/LoopUnroll/revisit.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-epilog-debuginfo.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-li.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop-non-exiting-latch.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop1.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop2.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop3.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop4.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-loop5.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll
    llvm/trunk/test/Transforms/LoopUnroll/runtime-unroll-remainder.ll
    llvm/trunk/test/Transforms/LoopUnroll/scevunroll.ll
    llvm/trunk/test/Transforms/LoopUnroll/shifted-tripcount.ll
    llvm/trunk/test/Transforms/LoopUnroll/tripcount-overflow.ll
    llvm/trunk/test/Transforms/LoopUnroll/unloop.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-cleanup.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-cleanuppad.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-count.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-heuristics-pgo.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-loop-invalidation.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-maxcount.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-opt-attribute.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas-disabled.ll
    llvm/trunk/test/Transforms/LoopUnroll/unroll-pragmas.ll
    llvm/trunk/test/Transforms/LoopUnroll/update-loop-info-in-subloops.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/
    llvm/trunk/test/Transforms/LoopUnrollAndJam/dependencies.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/disable.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/disable_nonforced.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/disable_nonforced_count.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/disable_nonforced_enable.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/followup.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/pragma-explicit.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/pragma.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/unprofitable.ll
    llvm/trunk/test/Transforms/LoopUnrollAndJam/unroll-and-jam.ll
    llvm/trunk/test/Transforms/LoopUnswitch/
    llvm/trunk/test/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2006-06-27-DeadSwitchCase.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-05-09-Unreachable.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-05-09-tl.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-07-12-ExitDomInfo.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-07-13-DomInfo.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-07-18-DomInfo.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-08-01-Dom.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-08-01-LCSSA.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2007-10-04-DomFrontier.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2008-06-02-DomInfo.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2008-06-17-DomFrontier.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2008-11-03-Invariant.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2010-11-18-LCSSA.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2011-06-02-CritSwitch.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2011-09-26-EHCrash.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2011-11-18-SimpleSwitch.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches-Threshold.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2011-11-18-TwoSwitches.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2012-04-02-IndirectBr.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2012-04-30-LoopUnswitch-LPad-Crash.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2012-05-20-Phi.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-Metadata.ll
    llvm/trunk/test/Transforms/LoopUnswitch/2015-09-18-Addrspace.ll
    llvm/trunk/test/Transforms/LoopUnswitch/AMDGPU/
    llvm/trunk/test/Transforms/LoopUnswitch/AMDGPU/divergent-unswitch.ll
    llvm/trunk/test/Transforms/LoopUnswitch/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoopUnswitch/LIV-loop-condtion.ll
    llvm/trunk/test/Transforms/LoopUnswitch/basictest.ll
    llvm/trunk/test/Transforms/LoopUnswitch/cleanuppad.ll
    llvm/trunk/test/Transforms/LoopUnswitch/copy-metadata.ll
    llvm/trunk/test/Transforms/LoopUnswitch/crash.ll
    llvm/trunk/test/Transforms/LoopUnswitch/elseif-non-exponential-behavior.ll
    llvm/trunk/test/Transforms/LoopUnswitch/exponential-behavior.ll
    llvm/trunk/test/Transforms/LoopUnswitch/guards.ll
    llvm/trunk/test/Transforms/LoopUnswitch/infinite-loop.ll
    llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll
    llvm/trunk/test/Transforms/LoopUnswitch/msan.ll
    llvm/trunk/test/Transforms/LoopUnswitch/pr32818.ll
    llvm/trunk/test/Transforms/LoopUnswitch/preserve-analyses.ll
    llvm/trunk/test/Transforms/LoopUnswitch/simplify-with-nonvalness.ll
    llvm/trunk/test/Transforms/LoopUnswitch/trivial-unswitch.ll
    llvm/trunk/test/Transforms/LoopUnswitch/unswitch-equality-undef.ll
    llvm/trunk/test/Transforms/LoopUnswitch/unswitch-select.ll
    llvm/trunk/test/Transforms/LoopVectorize/
    llvm/trunk/test/Transforms/LoopVectorize/12-12-11-if-conv.ll
    llvm/trunk/test/Transforms/LoopVectorize/2012-10-20-infloop.ll
    llvm/trunk/test/Transforms/LoopVectorize/2012-10-22-isconsec.ll
    llvm/trunk/test/Transforms/LoopVectorize/2016-07-27-loop-vec.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/aarch64-predication.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/aarch64-unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/arbitrary-induction-step.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/arm64-unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/backedge-overflow.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/deterministic-type-shrinkage.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/gather-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/induction-trunc.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/interleaved-vs-scalar.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/interleaved_cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/loop-vectorization-factors.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/max-vf-for-interleaved.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/no_vector_instructions.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/outer_loop_test1_no_explicit_vect_width.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/pr31900.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/pr33053.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/pr36032.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/predication_costs.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/sdiv-pow2.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/smallest-and-widest-types.ll
    llvm/trunk/test/Transforms/LoopVectorize/AArch64/type-shrinkage-insertelt.ll
    llvm/trunk/test/Transforms/LoopVectorize/AMDGPU/
    llvm/trunk/test/Transforms/LoopVectorize/AMDGPU/divergent-runtime-check.ll
    llvm/trunk/test/Transforms/LoopVectorize/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/AMDGPU/packed-math.ll
    llvm/trunk/test/Transforms/LoopVectorize/AMDGPU/unroll-in-loop-vectorizer.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/
    llvm/trunk/test/Transforms/LoopVectorize/ARM/arm-ieee-vectorize.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/arm-unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/gather-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/gcc-examples.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/interleaved_cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/ARM/mul-cast-vect.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/sphinx.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/vector_cast.ll
    llvm/trunk/test/Transforms/LoopVectorize/ARM/width-detect.ll
    llvm/trunk/test/Transforms/LoopVectorize/Hexagon/
    llvm/trunk/test/Transforms/LoopVectorize/Hexagon/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/Hexagon/minimum-vf.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/agg-interleave-a2.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/large-loop-rdx.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/pr30990.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/small-loop-rdx.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/stride-vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/vectorize-only-for-real.ll
    llvm/trunk/test/Transforms/LoopVectorize/PowerPC/vsx-tsvc-s173.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/addressing.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/branch-for-predicated-block.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/load-scalarization-cost-0.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/load-scalarization-cost-1.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/load-store-scalarization-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/mem-interleaving-costs-02.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/mem-interleaving-costs.ll
    llvm/trunk/test/Transforms/LoopVectorize/SystemZ/pr38110.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/
    llvm/trunk/test/Transforms/LoopVectorize/X86/already-vectorized.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/assume.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/avx1.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/avx512.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/consecutive-ptr-cg-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/consecutive-ptr-uniforms.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/constant-fold.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/constant-vector-operand.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/conversion-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/cost-model.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/float-induction-x86.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/force-ifcvt.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/fp32_to_uint32-cost-model.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/fp64_to_uint32-cost-model.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/fp_to_sint8-cost-model.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/gather-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/gather-vs-interleave.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/gather_scatter.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/gcc-examples.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/illegal-parallel-loop-uniform-write.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/imprecise-through-phis.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/int128_no_gather.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/interleaved-accesses-large-gap.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/interleaving.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/invariant-load-gather.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/invariant-store-vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/X86/masked_load_store.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/max-mstore.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/metadata-enable.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/min-trip-count-switch.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/mul_slm_16bit.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/no-vector.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/no_fpmath.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/no_fpmath_with_hotness.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/optsize.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/outer_loop_test1_no_explicit_vect_width.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/parallel-loops-after-reg2mem.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/parallel-loops.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/powof2div.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/pr23997.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/pr34438.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/pr35432.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/pr36524.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/pr39160.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/propagate-metadata.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/ptr-indvar-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/rauw-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/reduction-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/reduction-fastmath.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/reduction-small-size.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/redundant-vf2-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/reg-usage-debug.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/reg-usage.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/register-assumption.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/scatter_crash.ll   (with props)
    llvm/trunk/test/Transforms/LoopVectorize/X86/slm-no-vectorize.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/small-size.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/strided_load_cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/struct-store.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls-finite.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/svml-calls.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/tripcount.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/uint64_to_fp64-cost-model.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/uniform-phi.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/uniform_load.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/uniformshift.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-pm.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/unroll-small-loops.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/unroll_selection.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/veclib-calls.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vect.omp.force.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vect.omp.force.small-tc.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vector-scalar-select-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vector_max_bandwidth.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vector_ptr_load_store.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks-loopid-dbg.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks-missed.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks-profitable.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorization-remarks.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/vectorize-only-for-real.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/x86-interleaved-accesses-masked-group.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/x86-pr39099.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/x86-predication.ll
    llvm/trunk/test/Transforms/LoopVectorize/X86/x86_fp80-vector-store.ll
    llvm/trunk/test/Transforms/LoopVectorize/XCore/
    llvm/trunk/test/Transforms/LoopVectorize/XCore/lit.local.cfg
    llvm/trunk/test/Transforms/LoopVectorize/XCore/no-vector-registers.ll
    llvm/trunk/test/Transforms/LoopVectorize/align.ll
    llvm/trunk/test/Transforms/LoopVectorize/bsd_regex.ll
    llvm/trunk/test/Transforms/LoopVectorize/bzip_reverse_loops.ll
    llvm/trunk/test/Transforms/LoopVectorize/calloc.ll
    llvm/trunk/test/Transforms/LoopVectorize/cast-induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/conditional-assignment.ll
    llvm/trunk/test/Transforms/LoopVectorize/consec_no_gep.ll
    llvm/trunk/test/Transforms/LoopVectorize/consecutive-ptr-uniforms.ll
    llvm/trunk/test/Transforms/LoopVectorize/control-flow.ll
    llvm/trunk/test/Transforms/LoopVectorize/cpp-new-array.ll
    llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll
    llvm/trunk/test/Transforms/LoopVectorize/dead_instructions.ll
    llvm/trunk/test/Transforms/LoopVectorize/debugloc.ll
    llvm/trunk/test/Transforms/LoopVectorize/demanded-bits-of-pointer-instruction.ll
    llvm/trunk/test/Transforms/LoopVectorize/diag-missing-instr-debug-loc.ll
    llvm/trunk/test/Transforms/LoopVectorize/diag-with-hotness-info-2.ll
    llvm/trunk/test/Transforms/LoopVectorize/diag-with-hotness-info.ll
    llvm/trunk/test/Transforms/LoopVectorize/disable_nonforced.ll
    llvm/trunk/test/Transforms/LoopVectorize/disable_nonforced_enable.ll
    llvm/trunk/test/Transforms/LoopVectorize/discriminator.ll
    llvm/trunk/test/Transforms/LoopVectorize/ee-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/exact.ll
    llvm/trunk/test/Transforms/LoopVectorize/explicit_outer_detection.ll
    llvm/trunk/test/Transforms/LoopVectorize/explicit_outer_nonuniform_inner.ll
    llvm/trunk/test/Transforms/LoopVectorize/explicit_outer_uniform_diverg_branch.ll
    llvm/trunk/test/Transforms/LoopVectorize/fcmp-vectorize.ll
    llvm/trunk/test/Transforms/LoopVectorize/first-order-recurrence.ll
    llvm/trunk/test/Transforms/LoopVectorize/flags.ll
    llvm/trunk/test/Transforms/LoopVectorize/float-induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/float-reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/followup.ll
    llvm/trunk/test/Transforms/LoopVectorize/funcall.ll
    llvm/trunk/test/Transforms/LoopVectorize/gcc-examples.ll
    llvm/trunk/test/Transforms/LoopVectorize/gep_with_bitcast.ll
    llvm/trunk/test/Transforms/LoopVectorize/global_alias.ll
    llvm/trunk/test/Transforms/LoopVectorize/hints-trans.ll
    llvm/trunk/test/Transforms/LoopVectorize/hoist-loads.ll
    llvm/trunk/test/Transforms/LoopVectorize/i8-induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/icmp-uniforms.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-conv-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-conversion-edgemasks.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-conversion-nest.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-conversion-reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-conversion.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-pred-non-void.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-pred-not-when-safe.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-pred-stores.ll
    llvm/trunk/test/Transforms/LoopVectorize/if-reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/incorrect-dom-info.ll
    llvm/trunk/test/Transforms/LoopVectorize/increment.ll
    llvm/trunk/test/Transforms/LoopVectorize/induction-step.ll
    llvm/trunk/test/Transforms/LoopVectorize/induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/induction_plus.ll
    llvm/trunk/test/Transforms/LoopVectorize/infiniteloop.ll
    llvm/trunk/test/Transforms/LoopVectorize/int_sideeffect.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-1.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-2.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-3.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-alias.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses-pred-stores.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-accesses.ll
    llvm/trunk/test/Transforms/LoopVectorize/interleaved-acess-with-remarks.ll
    llvm/trunk/test/Transforms/LoopVectorize/intrinsic.ll
    llvm/trunk/test/Transforms/LoopVectorize/invariant-store-vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/iv_outside_user.ll
    llvm/trunk/test/Transforms/LoopVectorize/lcssa-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/legal_preheader_check.ll
    llvm/trunk/test/Transforms/LoopVectorize/libcall-remark.ll
    llvm/trunk/test/Transforms/LoopVectorize/lifetime.ll
    llvm/trunk/test/Transforms/LoopVectorize/loop-form.ll
    llvm/trunk/test/Transforms/LoopVectorize/loop-scalars.ll
    llvm/trunk/test/Transforms/LoopVectorize/loop-vect-memdep.ll
    llvm/trunk/test/Transforms/LoopVectorize/memdep.ll
    llvm/trunk/test/Transforms/LoopVectorize/metadata-unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/metadata-width.ll
    llvm/trunk/test/Transforms/LoopVectorize/metadata.ll
    llvm/trunk/test/Transforms/LoopVectorize/middle-block-dbg.ll
    llvm/trunk/test/Transforms/LoopVectorize/miniters.ll
    llvm/trunk/test/Transforms/LoopVectorize/minmax_reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/multi-use-reduction-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/multiple-address-spaces.ll
    llvm/trunk/test/Transforms/LoopVectorize/multiple-strides-vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/no-interleave-up-front.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_array_bounds.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_idiv_reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_int_induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_outside_user.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_switch.ll
    llvm/trunk/test/Transforms/LoopVectorize/no_switch_disable_vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/noalias-md-licm.ll
    llvm/trunk/test/Transforms/LoopVectorize/noalias-md.ll
    llvm/trunk/test/Transforms/LoopVectorize/nofloat.ll
    llvm/trunk/test/Transforms/LoopVectorize/non-const-n.ll
    llvm/trunk/test/Transforms/LoopVectorize/nontemporal.ll
    llvm/trunk/test/Transforms/LoopVectorize/nsw-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/opt.ll
    llvm/trunk/test/Transforms/LoopVectorize/optsize.ll
    llvm/trunk/test/Transforms/LoopVectorize/outer_loop_test1.ll
    llvm/trunk/test/Transforms/LoopVectorize/outer_loop_test2.ll
    llvm/trunk/test/Transforms/LoopVectorize/partial-lcssa.ll
    llvm/trunk/test/Transforms/LoopVectorize/phi-cost.ll
    llvm/trunk/test/Transforms/LoopVectorize/phi-hang.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr25281.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr28541.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr30654-phiscev-sext-trunc.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr30806-phi-scev.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr30806.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr31098.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr31190.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr32859.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr33706.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr34681.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr35743.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr35773.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr36311.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr36983.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr37248.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr37515.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr38800.ll   (with props)
    llvm/trunk/test/Transforms/LoopVectorize/pr39099.ll
    llvm/trunk/test/Transforms/LoopVectorize/pr39417-optsize-scevchecks.ll
    llvm/trunk/test/Transforms/LoopVectorize/preserve-dbg-loc-and-loop-metadata.ll
    llvm/trunk/test/Transforms/LoopVectorize/ptr-induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/ptr_loops.ll
    llvm/trunk/test/Transforms/LoopVectorize/read-only.ll
    llvm/trunk/test/Transforms/LoopVectorize/reduction-small-size.ll
    llvm/trunk/test/Transforms/LoopVectorize/reduction.ll
    llvm/trunk/test/Transforms/LoopVectorize/remove_metadata.ll
    llvm/trunk/test/Transforms/LoopVectorize/reverse_induction.ll
    llvm/trunk/test/Transforms/LoopVectorize/reverse_iter.ll
    llvm/trunk/test/Transforms/LoopVectorize/runtime-check-address-space.ll
    llvm/trunk/test/Transforms/LoopVectorize/runtime-check-readonly-address-space.ll
    llvm/trunk/test/Transforms/LoopVectorize/runtime-check-readonly.ll
    llvm/trunk/test/Transforms/LoopVectorize/runtime-check.ll
    llvm/trunk/test/Transforms/LoopVectorize/runtime-limit.ll
    llvm/trunk/test/Transforms/LoopVectorize/safegep.ll
    llvm/trunk/test/Transforms/LoopVectorize/same-base-access.ll
    llvm/trunk/test/Transforms/LoopVectorize/scalar-select.ll
    llvm/trunk/test/Transforms/LoopVectorize/scalar_after_vectorization.ll
    llvm/trunk/test/Transforms/LoopVectorize/scev-exitlim-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/simple-unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/skip-iterations.ll
    llvm/trunk/test/Transforms/LoopVectorize/small-loop.ll
    llvm/trunk/test/Transforms/LoopVectorize/start-non-zero.ll
    llvm/trunk/test/Transforms/LoopVectorize/store-shuffle-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/struct_access.ll
    llvm/trunk/test/Transforms/LoopVectorize/tbaa-nodep.ll
    llvm/trunk/test/Transforms/LoopVectorize/tripcount.ll
    llvm/trunk/test/Transforms/LoopVectorize/undef-inst-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/unroll-novec-memcheck-metadata.ll
    llvm/trunk/test/Transforms/LoopVectorize/unroll.ll
    llvm/trunk/test/Transforms/LoopVectorize/unroll_novec.ll
    llvm/trunk/test/Transforms/LoopVectorize/unsafe-dep-remark.ll
    llvm/trunk/test/Transforms/LoopVectorize/unsized-pointee-crash.ll
    llvm/trunk/test/Transforms/LoopVectorize/value-ptr-bug.ll
    llvm/trunk/test/Transforms/LoopVectorize/vect-phiscev-sext-trunc.ll
    llvm/trunk/test/Transforms/LoopVectorize/vect.omp.persistence.ll
    llvm/trunk/test/Transforms/LoopVectorize/vect.stats.ll
    llvm/trunk/test/Transforms/LoopVectorize/vector-geps.ll
    llvm/trunk/test/Transforms/LoopVectorize/vectorize-once.ll
    llvm/trunk/test/Transforms/LoopVectorize/version-mem-access.ll
    llvm/trunk/test/Transforms/LoopVectorize/vplan-stress-test-no-explict-vf.ll
    llvm/trunk/test/Transforms/LoopVectorize/vplan_hcfg_stress_test.ll
    llvm/trunk/test/Transforms/LoopVectorize/write-only.ll
    llvm/trunk/test/Transforms/LoopVectorize/zero-sized-pointee-crash.ll
    llvm/trunk/test/Transforms/LoopVersioning/
    llvm/trunk/test/Transforms/LoopVersioning/add-phi-update-users.ll
    llvm/trunk/test/Transforms/LoopVersioning/basic.ll
    llvm/trunk/test/Transforms/LoopVersioning/exit-block-dominates-rt-check-block.ll
    llvm/trunk/test/Transforms/LoopVersioning/incorrect-phi.ll
    llvm/trunk/test/Transforms/LoopVersioning/lcssa.ll
    llvm/trunk/test/Transforms/LoopVersioning/loop-invariant-bound.ll
    llvm/trunk/test/Transforms/LoopVersioning/noalias-version-twice.ll
    llvm/trunk/test/Transforms/LoopVersioning/noalias.ll
    llvm/trunk/test/Transforms/LoopVersioningLICM/
    llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll
    llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll
    llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM3.ll
    llvm/trunk/test/Transforms/LoopVersioningLICM/metadata.ll
    llvm/trunk/test/Transforms/LowerAtomic/
    llvm/trunk/test/Transforms/LowerAtomic/atomic-load.ll
    llvm/trunk/test/Transforms/LowerAtomic/atomic-swap.ll
    llvm/trunk/test/Transforms/LowerAtomic/barrier.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/PR33346.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/basic.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/expect_nonboolean.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/phi_merge.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/phi_or.ll
    llvm/trunk/test/Transforms/LowerExpectIntrinsic/phi_tern.ll
    llvm/trunk/test/Transforms/LowerGuardIntrinsic/
    llvm/trunk/test/Transforms/LowerGuardIntrinsic/basic.ll
    llvm/trunk/test/Transforms/LowerGuardIntrinsic/with-calling-conv.ll
    llvm/trunk/test/Transforms/LowerInvoke/
    llvm/trunk/test/Transforms/LowerInvoke/2003-12-10-Crash.ll
    llvm/trunk/test/Transforms/LowerInvoke/lowerinvoke.ll
    llvm/trunk/test/Transforms/LowerSwitch/
    llvm/trunk/test/Transforms/LowerSwitch/2003-05-01-PHIProblem.ll
    llvm/trunk/test/Transforms/LowerSwitch/2003-08-23-EmptySwitch.ll
    llvm/trunk/test/Transforms/LowerSwitch/2004-03-13-SwitchIsDefaultCrash.ll
    llvm/trunk/test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll
    llvm/trunk/test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll
    llvm/trunk/test/Transforms/LowerSwitch/2014-06-23-PHIlowering.ll
    llvm/trunk/test/Transforms/LowerSwitch/delete-default-block-crash.ll
    llvm/trunk/test/Transforms/LowerSwitch/do-not-handle-impossible-values.ll
    llvm/trunk/test/Transforms/LowerSwitch/feature.ll
    llvm/trunk/test/Transforms/LowerSwitch/fold-popular-case-to-unreachable-default.ll
    llvm/trunk/test/Transforms/LowerSwitch/phi-in-dead-block.ll
    llvm/trunk/test/Transforms/LowerTypeTests/
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/blockaddr-import.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/cfi-direct-call.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/cfi-direct-call1.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/export-icall.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/exported-funcs.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/import-alias.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/import-icall.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/import.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml
    llvm/trunk/test/Transforms/LowerTypeTests/blockaddr-import.ll
    llvm/trunk/test/Transforms/LowerTypeTests/blockaddress-2.ll
    llvm/trunk/test/Transforms/LowerTypeTests/blockaddress.ll
    llvm/trunk/test/Transforms/LowerTypeTests/cfi-direct-call.ll
    llvm/trunk/test/Transforms/LowerTypeTests/cfi-direct-call1.ll
    llvm/trunk/test/Transforms/LowerTypeTests/constant.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-alias.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-allones.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-bytearray.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-cross-dso-cfi.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-dead.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-icall.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-inline.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-nothing.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-single.ll
    llvm/trunk/test/Transforms/LowerTypeTests/export-symver.ll
    llvm/trunk/test/Transforms/LowerTypeTests/external-global.ll
    llvm/trunk/test/Transforms/LowerTypeTests/function-arm-thumb.ll
    llvm/trunk/test/Transforms/LowerTypeTests/function-disjoint.ll
    llvm/trunk/test/Transforms/LowerTypeTests/function-ext.ll
    llvm/trunk/test/Transforms/LowerTypeTests/function-weak.ll
    llvm/trunk/test/Transforms/LowerTypeTests/function.ll
    llvm/trunk/test/Transforms/LowerTypeTests/icall-branch-funnel.ll
    llvm/trunk/test/Transforms/LowerTypeTests/import-alias.ll
    llvm/trunk/test/Transforms/LowerTypeTests/import-icall.ll
    llvm/trunk/test/Transforms/LowerTypeTests/import-unsat.ll
    llvm/trunk/test/Transforms/LowerTypeTests/import.ll
    llvm/trunk/test/Transforms/LowerTypeTests/layout.ll
    llvm/trunk/test/Transforms/LowerTypeTests/nonstring.ll
    llvm/trunk/test/Transforms/LowerTypeTests/pr25902.ll
    llvm/trunk/test/Transforms/LowerTypeTests/pr37625.ll
    llvm/trunk/test/Transforms/LowerTypeTests/section.ll
    llvm/trunk/test/Transforms/LowerTypeTests/simple.ll
    llvm/trunk/test/Transforms/LowerTypeTests/simplify.ll
    llvm/trunk/test/Transforms/LowerTypeTests/simplify_phi.ll
    llvm/trunk/test/Transforms/LowerTypeTests/single-offset.ll
    llvm/trunk/test/Transforms/LowerTypeTests/unnamed.ll
    llvm/trunk/test/Transforms/LowerTypeTests/unsat.ll
    llvm/trunk/test/Transforms/LowerWidenableCondition/
    llvm/trunk/test/Transforms/LowerWidenableCondition/basic.ll
    llvm/trunk/test/Transforms/MakeGuardsExplicit/
    llvm/trunk/test/Transforms/MakeGuardsExplicit/basic.ll
    llvm/trunk/test/Transforms/Mem2Reg/
    llvm/trunk/test/Transforms/Mem2Reg/2002-03-28-UninitializedVal.ll
    llvm/trunk/test/Transforms/Mem2Reg/2002-05-01-ShouldNotPromoteThisAlloca.ll
    llvm/trunk/test/Transforms/Mem2Reg/2003-04-10-DFNotFound.ll
    llvm/trunk/test/Transforms/Mem2Reg/2003-04-18-DeadBlockProblem.ll
    llvm/trunk/test/Transforms/Mem2Reg/2003-04-24-MultipleIdenticalSuccessors.ll
    llvm/trunk/test/Transforms/Mem2Reg/2003-06-26-IterativePromote.ll
    llvm/trunk/test/Transforms/Mem2Reg/2003-10-05-DeadPHIInsertion.ll
    llvm/trunk/test/Transforms/Mem2Reg/2005-06-30-ReadBeforeWrite.ll
    llvm/trunk/test/Transforms/Mem2Reg/2005-11-28-Crash.ll
    llvm/trunk/test/Transforms/Mem2Reg/2007-08-27-VolatileLoadsStores.ll
    llvm/trunk/test/Transforms/Mem2Reg/ConvertDebugInfo.ll
    llvm/trunk/test/Transforms/Mem2Reg/ConvertDebugInfo2.ll
    llvm/trunk/test/Transforms/Mem2Reg/PromoteMemToRegister.ll
    llvm/trunk/test/Transforms/Mem2Reg/UndefValuesMerge.ll
    llvm/trunk/test/Transforms/Mem2Reg/atomic.ll
    llvm/trunk/test/Transforms/Mem2Reg/crash.ll
    llvm/trunk/test/Transforms/Mem2Reg/dbg-addr-inline-dse.ll
    llvm/trunk/test/Transforms/Mem2Reg/dbg-addr.ll
    llvm/trunk/test/Transforms/Mem2Reg/dbg-inline-scope-for-phi.ll
    llvm/trunk/test/Transforms/Mem2Reg/debug-alloca-phi-2.ll
    llvm/trunk/test/Transforms/Mem2Reg/debug-alloca-phi.ll
    llvm/trunk/test/Transforms/Mem2Reg/debug-alloca-vla-1.ll
    llvm/trunk/test/Transforms/Mem2Reg/debug-alloca-vla-2.ll
    llvm/trunk/test/Transforms/Mem2Reg/ignore-lifetime.ll
    llvm/trunk/test/Transforms/Mem2Reg/optnone.ll
    llvm/trunk/test/Transforms/Mem2Reg/pr24179.ll
    llvm/trunk/test/Transforms/Mem2Reg/pr37632-unreachable-list-of-stores.ll
    llvm/trunk/test/Transforms/Mem2Reg/preserve-nonnull-load-metadata.ll
    llvm/trunk/test/Transforms/Mem2Reg/undef-order.ll
    llvm/trunk/test/Transforms/MemCpyOpt/
    llvm/trunk/test/Transforms/MemCpyOpt/2008-02-24-MultipleUseofSRet.ll
    llvm/trunk/test/Transforms/MemCpyOpt/2008-03-13-ReturnSlotBitcast.ll
    llvm/trunk/test/Transforms/MemCpyOpt/2011-06-02-CallSlotOverwritten.ll
    llvm/trunk/test/Transforms/MemCpyOpt/align.ll
    llvm/trunk/test/Transforms/MemCpyOpt/atomic.ll
    llvm/trunk/test/Transforms/MemCpyOpt/callslot_aa.ll
    llvm/trunk/test/Transforms/MemCpyOpt/callslot_deref.ll
    llvm/trunk/test/Transforms/MemCpyOpt/callslot_throw.ll
    llvm/trunk/test/Transforms/MemCpyOpt/capturing-func.ll
    llvm/trunk/test/Transforms/MemCpyOpt/crash.ll
    llvm/trunk/test/Transforms/MemCpyOpt/fca2memcpy.ll
    llvm/trunk/test/Transforms/MemCpyOpt/form-memset.ll
    llvm/trunk/test/Transforms/MemCpyOpt/invariant.start.ll
    llvm/trunk/test/Transforms/MemCpyOpt/lifetime.ll
    llvm/trunk/test/Transforms/MemCpyOpt/load-store-to-memcpy.ll
    llvm/trunk/test/Transforms/MemCpyOpt/loadstore-sret.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-to-memset-with-lifetimes.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-to-memset.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy-undef.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memmove.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memset-memcpy-oversized.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll
    llvm/trunk/test/Transforms/MemCpyOpt/memset-memcpy-to-2x-memset.ll
    llvm/trunk/test/Transforms/MemCpyOpt/nontemporal.ll
    llvm/trunk/test/Transforms/MemCpyOpt/pr29105.ll
    llvm/trunk/test/Transforms/MemCpyOpt/process_store.ll
    llvm/trunk/test/Transforms/MemCpyOpt/profitable-memset.ll
    llvm/trunk/test/Transforms/MemCpyOpt/smaller.ll
    llvm/trunk/test/Transforms/MemCpyOpt/sret.ll
    llvm/trunk/test/Transforms/MemCpyOpt/stackrestore.ll
    llvm/trunk/test/Transforms/MergeFunc/
    llvm/trunk/test/Transforms/MergeFunc/2011-02-08-RemoveEqual.ll
    llvm/trunk/test/Transforms/MergeFunc/2013-01-10-MergeFuncAssert.ll
    llvm/trunk/test/Transforms/MergeFunc/address-spaces.ll
    llvm/trunk/test/Transforms/MergeFunc/alias.ll
    llvm/trunk/test/Transforms/MergeFunc/alloca.ll
    llvm/trunk/test/Transforms/MergeFunc/apply_function_attributes.ll
    llvm/trunk/test/Transforms/MergeFunc/call-and-invoke-with-ranges.ll
    llvm/trunk/test/Transforms/MergeFunc/constant-entire-value.ll
    llvm/trunk/test/Transforms/MergeFunc/crash.ll
    llvm/trunk/test/Transforms/MergeFunc/crash2.ll
    llvm/trunk/test/Transforms/MergeFunc/external-before-local.ll
    llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll
    llvm/trunk/test/Transforms/MergeFunc/functions.ll
    llvm/trunk/test/Transforms/MergeFunc/gep-base-type.ll
    llvm/trunk/test/Transforms/MergeFunc/inline-asm.ll
    llvm/trunk/test/Transforms/MergeFunc/inttoptr-address-space.ll
    llvm/trunk/test/Transforms/MergeFunc/inttoptr.ll
    llvm/trunk/test/Transforms/MergeFunc/linkonce_odr.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-block-address-other-function.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-block-address.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-const-ptr-and-int.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-different-vector-types.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-ptr-and-int.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-small-unnamed-addr.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-unnamed-addr-bitcast.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-unnamed-addr.ll
    llvm/trunk/test/Transforms/MergeFunc/merge-weak-crash.ll
    llvm/trunk/test/Transforms/MergeFunc/mergefunc-preserve-debug-info.ll
    llvm/trunk/test/Transforms/MergeFunc/mergefunc-struct-return.ll
    llvm/trunk/test/Transforms/MergeFunc/no-merge-block-address-different-labels.ll
    llvm/trunk/test/Transforms/MergeFunc/no-merge-block-address-other-function.ll
    llvm/trunk/test/Transforms/MergeFunc/no-merge-ptr-different-sizes.ll
    llvm/trunk/test/Transforms/MergeFunc/no-merge-ptr-int-different-values.ll
    llvm/trunk/test/Transforms/MergeFunc/nonzero-address-spaces.ll
    llvm/trunk/test/Transforms/MergeFunc/phi-check-blocks.ll
    llvm/trunk/test/Transforms/MergeFunc/phi-speculation1.ll
    llvm/trunk/test/Transforms/MergeFunc/phi-speculation2.ll
    llvm/trunk/test/Transforms/MergeFunc/ptr-int-transitivity-1.ll
    llvm/trunk/test/Transforms/MergeFunc/ptr-int-transitivity-2.ll
    llvm/trunk/test/Transforms/MergeFunc/ptr-int-transitivity-3.ll
    llvm/trunk/test/Transforms/MergeFunc/ranges-multiple.ll
    llvm/trunk/test/Transforms/MergeFunc/ranges.ll
    llvm/trunk/test/Transforms/MergeFunc/self-referential-global.ll
    llvm/trunk/test/Transforms/MergeFunc/tailcall.ll
    llvm/trunk/test/Transforms/MergeFunc/too-small.ll
    llvm/trunk/test/Transforms/MergeFunc/undef-different-types.ll
    llvm/trunk/test/Transforms/MergeFunc/unnamed-addr-reprocessing.ll
    llvm/trunk/test/Transforms/MergeFunc/va_arg.ll
    llvm/trunk/test/Transforms/MergeFunc/vector-GEP-crash.ll
    llvm/trunk/test/Transforms/MergeFunc/vector.ll
    llvm/trunk/test/Transforms/MergeFunc/vectors-and-arrays.ll
    llvm/trunk/test/Transforms/MergeFunc/weak-small.ll
    llvm/trunk/test/Transforms/MergeICmps/
    llvm/trunk/test/Transforms/MergeICmps/X86/
    llvm/trunk/test/Transforms/MergeICmps/X86/alias-merge-blocks.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/atomic.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/entry-block-shuffled.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/gep-used-outside.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/int64-and-ptr.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/last-block-produce-no-value.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/lit.local.cfg
    llvm/trunk/test/Transforms/MergeICmps/X86/multiple-blocks-does-work.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/pair-int32-int32.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/pr36557.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/split-block-does-work.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/tuple-four-int8.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/two-complex-bb.ll
    llvm/trunk/test/Transforms/MergeICmps/X86/volatile.ll
    llvm/trunk/test/Transforms/MergeICmps/pair-int32-int32.ll
    llvm/trunk/test/Transforms/MetaRenamer/
    llvm/trunk/test/Transforms/MetaRenamer/main.ll
    llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll
    llvm/trunk/test/Transforms/NameAnonGlobals/
    llvm/trunk/test/Transforms/NameAnonGlobals/rename.ll
    llvm/trunk/test/Transforms/NaryReassociate/
    llvm/trunk/test/Transforms/NaryReassociate/NVPTX/
    llvm/trunk/test/Transforms/NaryReassociate/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/NaryReassociate/NVPTX/nary-gep.ll
    llvm/trunk/test/Transforms/NaryReassociate/NVPTX/nary-slsr.ll
    llvm/trunk/test/Transforms/NaryReassociate/nary-add.ll
    llvm/trunk/test/Transforms/NaryReassociate/nary-mul.ll
    llvm/trunk/test/Transforms/NaryReassociate/pr24301.ll
    llvm/trunk/test/Transforms/NaryReassociate/pr35710.ll
    llvm/trunk/test/Transforms/NaryReassociate/pr37539.ll
    llvm/trunk/test/Transforms/NewGVN/
    llvm/trunk/test/Transforms/NewGVN/2007-07-25-DominatedLoop.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-25-InfiniteLoop.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-25-Loop.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-25-NestedLoop.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-25-SinglePredecessor.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-26-InterlockingLoops.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-26-NonRedundant.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-26-PhiErasure.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-30-PredIDom.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-31-NoDomInherit.ll
    llvm/trunk/test/Transforms/NewGVN/2007-07-31-RedundantPhi.ll
    llvm/trunk/test/Transforms/NewGVN/2008-02-12-UndefLoad.ll
    llvm/trunk/test/Transforms/NewGVN/2008-02-13-NewPHI.ll
    llvm/trunk/test/Transforms/NewGVN/2008-07-02-Unreachable.ll
    llvm/trunk/test/Transforms/NewGVN/2008-12-09-SelfRemove.ll
    llvm/trunk/test/Transforms/NewGVN/2008-12-12-RLE-Crash.ll
    llvm/trunk/test/Transforms/NewGVN/2008-12-14-rle-reanalyze.ll
    llvm/trunk/test/Transforms/NewGVN/2008-12-15-CacheVisited.ll
    llvm/trunk/test/Transforms/NewGVN/2009-01-21-SortInvalidation.ll
    llvm/trunk/test/Transforms/NewGVN/2009-01-22-SortInvalidation.ll
    llvm/trunk/test/Transforms/NewGVN/2009-03-10-PREOnVoid.ll
    llvm/trunk/test/Transforms/NewGVN/2009-07-13-MemDepSortFail.ll
    llvm/trunk/test/Transforms/NewGVN/2009-11-12-MemDepMallocBitCast.ll
    llvm/trunk/test/Transforms/NewGVN/2010-03-31-RedundantPHIs.ll
    llvm/trunk/test/Transforms/NewGVN/2010-05-08-OneBit.ll
    llvm/trunk/test/Transforms/NewGVN/2010-11-13-Simplify.ll
    llvm/trunk/test/Transforms/NewGVN/2011-04-27-phioperands.ll
    llvm/trunk/test/Transforms/NewGVN/2011-07-07-MatchIntrinsicExtract.ll
    llvm/trunk/test/Transforms/NewGVN/2011-09-07-TypeIdFor.ll
    llvm/trunk/test/Transforms/NewGVN/2012-05-22-PreCrash.ll
    llvm/trunk/test/Transforms/NewGVN/2016-08-30-MaskedScatterGather.ll
    llvm/trunk/test/Transforms/NewGVN/MemdepMiscompile.ll
    llvm/trunk/test/Transforms/NewGVN/assume-equal.ll
    llvm/trunk/test/Transforms/NewGVN/assumes.ll
    llvm/trunk/test/Transforms/NewGVN/basic-cyclic-opt.ll
    llvm/trunk/test/Transforms/NewGVN/basic-undef-test.ll
    llvm/trunk/test/Transforms/NewGVN/basic.ll
    llvm/trunk/test/Transforms/NewGVN/big-endian.ll
    llvm/trunk/test/Transforms/NewGVN/bitcast-of-call.ll
    llvm/trunk/test/Transforms/NewGVN/br-identical.ll
    llvm/trunk/test/Transforms/NewGVN/calloc-load-removal.ll
    llvm/trunk/test/Transforms/NewGVN/calls-nonlocal.ll
    llvm/trunk/test/Transforms/NewGVN/calls-readonly.ll
    llvm/trunk/test/Transforms/NewGVN/commute.ll
    llvm/trunk/test/Transforms/NewGVN/completeness.ll
    llvm/trunk/test/Transforms/NewGVN/cond_br.ll
    llvm/trunk/test/Transforms/NewGVN/cond_br2.ll
    llvm/trunk/test/Transforms/NewGVN/condprop-xfail.ll
    llvm/trunk/test/Transforms/NewGVN/condprop.ll
    llvm/trunk/test/Transforms/NewGVN/crash-no-aa.ll
    llvm/trunk/test/Transforms/NewGVN/crash.ll
    llvm/trunk/test/Transforms/NewGVN/cyclic-phi-handling.ll
    llvm/trunk/test/Transforms/NewGVN/dbg-redundant-load.ll
    llvm/trunk/test/Transforms/NewGVN/deadstore.ll
    llvm/trunk/test/Transforms/NewGVN/debugloc.ll
    llvm/trunk/test/Transforms/NewGVN/edge.ll
    llvm/trunk/test/Transforms/NewGVN/eliminate-callsite-inline.ll
    llvm/trunk/test/Transforms/NewGVN/eliminate-ssacopy.ll
    llvm/trunk/test/Transforms/NewGVN/equivalent-phi.ll
    llvm/trunk/test/Transforms/NewGVN/fence.ll
    llvm/trunk/test/Transforms/NewGVN/flags-simplify.ll
    llvm/trunk/test/Transforms/NewGVN/flags.ll
    llvm/trunk/test/Transforms/NewGVN/fold-const-expr.ll
    llvm/trunk/test/Transforms/NewGVN/fpmath.ll
    llvm/trunk/test/Transforms/NewGVN/funclet.ll
    llvm/trunk/test/Transforms/NewGVN/int_sideeffect.ll
    llvm/trunk/test/Transforms/NewGVN/invariant.group.ll
    llvm/trunk/test/Transforms/NewGVN/invariant.start.ll
    llvm/trunk/test/Transforms/NewGVN/lifetime-simple.ll
    llvm/trunk/test/Transforms/NewGVN/load-constant-mem.ll
    llvm/trunk/test/Transforms/NewGVN/load-from-unreachable-predecessor.ll
    llvm/trunk/test/Transforms/NewGVN/loadforward.ll
    llvm/trunk/test/Transforms/NewGVN/malloc-load-removal.ll
    llvm/trunk/test/Transforms/NewGVN/memory-handling.ll
    llvm/trunk/test/Transforms/NewGVN/metadata-nonnull.ll
    llvm/trunk/test/Transforms/NewGVN/metadata-simplify.ll
    llvm/trunk/test/Transforms/NewGVN/no_speculative_loads_with_asan.ll
    llvm/trunk/test/Transforms/NewGVN/noalias.ll
    llvm/trunk/test/Transforms/NewGVN/non-integral-pointers.ll
    llvm/trunk/test/Transforms/NewGVN/non-local-offset.ll
    llvm/trunk/test/Transforms/NewGVN/nonescaping-malloc.ll
    llvm/trunk/test/Transforms/NewGVN/null-aliases-nothing.ll
    llvm/trunk/test/Transforms/NewGVN/opt-remarks.ll
    llvm/trunk/test/Transforms/NewGVN/pair_jumpthread.ll
    llvm/trunk/test/Transforms/NewGVN/phi-edge-handling.ll
    llvm/trunk/test/Transforms/NewGVN/phi-of-ops-move-block.ll
    llvm/trunk/test/Transforms/NewGVN/phi-translate-partial-alias.ll
    llvm/trunk/test/Transforms/NewGVN/pr10820.ll
    llvm/trunk/test/Transforms/NewGVN/pr12979.ll
    llvm/trunk/test/Transforms/NewGVN/pr14166.ll
    llvm/trunk/test/Transforms/NewGVN/pr17732.ll
    llvm/trunk/test/Transforms/NewGVN/pr17852.ll
    llvm/trunk/test/Transforms/NewGVN/pr24397.ll
    llvm/trunk/test/Transforms/NewGVN/pr24426.ll
    llvm/trunk/test/Transforms/NewGVN/pr25440.ll
    llvm/trunk/test/Transforms/NewGVN/pr28562.ll
    llvm/trunk/test/Transforms/NewGVN/pr31472.ll
    llvm/trunk/test/Transforms/NewGVN/pr31483.ll
    llvm/trunk/test/Transforms/NewGVN/pr31491.ll
    llvm/trunk/test/Transforms/NewGVN/pr31501.ll
    llvm/trunk/test/Transforms/NewGVN/pr31573.ll
    llvm/trunk/test/Transforms/NewGVN/pr31594.ll
    llvm/trunk/test/Transforms/NewGVN/pr31613.ll
    llvm/trunk/test/Transforms/NewGVN/pr31682.ll
    llvm/trunk/test/Transforms/NewGVN/pr31758.ll
    llvm/trunk/test/Transforms/NewGVN/pr32403.ll
    llvm/trunk/test/Transforms/NewGVN/pr32607.ll
    llvm/trunk/test/Transforms/NewGVN/pr32836.ll
    llvm/trunk/test/Transforms/NewGVN/pr32838.ll
    llvm/trunk/test/Transforms/NewGVN/pr32845.ll
    llvm/trunk/test/Transforms/NewGVN/pr32852.ll
    llvm/trunk/test/Transforms/NewGVN/pr32897.ll
    llvm/trunk/test/Transforms/NewGVN/pr32934.ll
    llvm/trunk/test/Transforms/NewGVN/pr32945.ll
    llvm/trunk/test/Transforms/NewGVN/pr32952.ll
    llvm/trunk/test/Transforms/NewGVN/pr33014.ll
    llvm/trunk/test/Transforms/NewGVN/pr33086.ll
    llvm/trunk/test/Transforms/NewGVN/pr33116.ll
    llvm/trunk/test/Transforms/NewGVN/pr33185.ll
    llvm/trunk/test/Transforms/NewGVN/pr33187.ll
    llvm/trunk/test/Transforms/NewGVN/pr33196.ll
    llvm/trunk/test/Transforms/NewGVN/pr33204.ll
    llvm/trunk/test/Transforms/NewGVN/pr33305.ll
    llvm/trunk/test/Transforms/NewGVN/pr33367.ll
    llvm/trunk/test/Transforms/NewGVN/pr33432.ll
    llvm/trunk/test/Transforms/NewGVN/pr33461.ll
    llvm/trunk/test/Transforms/NewGVN/pr33720.ll
    llvm/trunk/test/Transforms/NewGVN/pr34135.ll
    llvm/trunk/test/Transforms/NewGVN/pr34430.ll
    llvm/trunk/test/Transforms/NewGVN/pr34452.ll
    llvm/trunk/test/Transforms/NewGVN/pr35074.ll
    llvm/trunk/test/Transforms/NewGVN/pr35125.ll
    llvm/trunk/test/Transforms/NewGVN/pre-compare.ll
    llvm/trunk/test/Transforms/NewGVN/pre-new-inst.ll
    llvm/trunk/test/Transforms/NewGVN/predicates.ll
    llvm/trunk/test/Transforms/NewGVN/propagate-ir-flags.ll
    llvm/trunk/test/Transforms/NewGVN/range.ll
    llvm/trunk/test/Transforms/NewGVN/readattrs.ll
    llvm/trunk/test/Transforms/NewGVN/refine-stores.ll
    llvm/trunk/test/Transforms/NewGVN/rle-must-alias.ll
    llvm/trunk/test/Transforms/NewGVN/rle-no-phi-translate.ll
    llvm/trunk/test/Transforms/NewGVN/rle-nonlocal.ll
    llvm/trunk/test/Transforms/NewGVN/rle.ll
    llvm/trunk/test/Transforms/NewGVN/simp-to-self.ll
    llvm/trunk/test/Transforms/NewGVN/stale-loop-info.ll
    llvm/trunk/test/Transforms/NewGVN/storeoverstore.ll
    llvm/trunk/test/Transforms/NewGVN/tbaa.ll
    llvm/trunk/test/Transforms/NewGVN/unreachable_block_infinite_loop.ll
    llvm/trunk/test/Transforms/NewGVN/verify-memoryphi.ll
    llvm/trunk/test/Transforms/NewGVN/volatile-nonvolatile.ll
    llvm/trunk/test/Transforms/ObjCARC/
    llvm/trunk/test/Transforms/ObjCARC/allocas.ll
    llvm/trunk/test/Transforms/ObjCARC/apelim.ll
    llvm/trunk/test/Transforms/ObjCARC/basic.ll
    llvm/trunk/test/Transforms/ObjCARC/cfg-hazards.ll
    llvm/trunk/test/Transforms/ObjCARC/clang-arc-use-barrier.ll
    llvm/trunk/test/Transforms/ObjCARC/comdat-ipo.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-catchswitch.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-end-of-use-list.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-replace-arg-use.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-storestrong-funclet.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-storestrong-ivar.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-storestrong.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll
    llvm/trunk/test/Transforms/ObjCARC/contract.ll
    llvm/trunk/test/Transforms/ObjCARC/empty-block.ll
    llvm/trunk/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll
    llvm/trunk/test/Transforms/ObjCARC/escape.ll
    llvm/trunk/test/Transforms/ObjCARC/expand.ll
    llvm/trunk/test/Transforms/ObjCARC/funclet.ll
    llvm/trunk/test/Transforms/ObjCARC/gvn.ll
    llvm/trunk/test/Transforms/ObjCARC/intrinsic-use-isolated.ll
    llvm/trunk/test/Transforms/ObjCARC/intrinsic-use.ll
    llvm/trunk/test/Transforms/ObjCARC/invoke-2.ll
    llvm/trunk/test/Transforms/ObjCARC/invoke.ll
    llvm/trunk/test/Transforms/ObjCARC/move-and-form-retain-autorelease.ll
    llvm/trunk/test/Transforms/ObjCARC/move-and-merge-autorelease.ll
    llvm/trunk/test/Transforms/ObjCARC/nested.ll
    llvm/trunk/test/Transforms/ObjCARC/opt-catchswitch.ll
    llvm/trunk/test/Transforms/ObjCARC/path-overflow.ll
    llvm/trunk/test/Transforms/ObjCARC/pointer-types.ll
    llvm/trunk/test/Transforms/ObjCARC/post-inlining.ll
    llvm/trunk/test/Transforms/ObjCARC/pr12270.ll
    llvm/trunk/test/Transforms/ObjCARC/provenance.ll
    llvm/trunk/test/Transforms/ObjCARC/retain-block-side-effects.ll
    llvm/trunk/test/Transforms/ObjCARC/retain-not-declared.ll
    llvm/trunk/test/Transforms/ObjCARC/rle-s2l.ll
    llvm/trunk/test/Transforms/ObjCARC/rv.ll
    llvm/trunk/test/Transforms/ObjCARC/split-backedge.ll
    llvm/trunk/test/Transforms/ObjCARC/tail-call-invariant-enforcement.ll
    llvm/trunk/test/Transforms/ObjCARC/unsafe-claim-rv.ll
    llvm/trunk/test/Transforms/ObjCARC/weak-contract.ll
    llvm/trunk/test/Transforms/ObjCARC/weak-copies.ll
    llvm/trunk/test/Transforms/ObjCARC/weak-dce.ll
    llvm/trunk/test/Transforms/ObjCARC/weak.ll
    llvm/trunk/test/Transforms/PGOProfile/
    llvm/trunk/test/Transforms/PGOProfile/Inputs/
    llvm/trunk/test/Transforms/PGOProfile/Inputs/PR28219.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/branch1.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/branch1_large_count.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/branch2.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/criticaledge.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/cspgo.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/diag.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/diag_FE.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/func_entry.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/indirect_call.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/indirectbr.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/irreducible.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/landingpad.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/large_count_remarks.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/loop1.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/loop2.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/memop_size_annotation.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/multiple_hash_profile.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/noreturncall.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/remap.map
    llvm/trunk/test/Transforms/PGOProfile/Inputs/remap.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/select1.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/select2.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/select_hash_conflict.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/switch.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_cs.proftext
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_cspgo_bar_gen.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_cspgo_bar_use.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_indirect_call_promotion.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_samplepgo_icp.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_samplepgo_icp2a.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_samplepgo_icp2b.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/thinlto_samplepgo_icp3.ll
    llvm/trunk/test/Transforms/PGOProfile/Inputs/unreachable_bb.proftext
    llvm/trunk/test/Transforms/PGOProfile/PR28219.ll
    llvm/trunk/test/Transforms/PGOProfile/X86/
    llvm/trunk/test/Transforms/PGOProfile/X86/lit.local.cfg
    llvm/trunk/test/Transforms/PGOProfile/X86/macho.ll
    llvm/trunk/test/Transforms/PGOProfile/branch1.ll
    llvm/trunk/test/Transforms/PGOProfile/branch2.ll
    llvm/trunk/test/Transforms/PGOProfile/chr.ll
    llvm/trunk/test/Transforms/PGOProfile/comdat_internal.ll
    llvm/trunk/test/Transforms/PGOProfile/comdat_rename.ll
    llvm/trunk/test/Transforms/PGOProfile/counter_promo.ll
    llvm/trunk/test/Transforms/PGOProfile/counter_promo_exit_merge.ll
    llvm/trunk/test/Transforms/PGOProfile/counter_promo_mexits.ll
    llvm/trunk/test/Transforms/PGOProfile/counter_promo_nest.ll
    llvm/trunk/test/Transforms/PGOProfile/criticaledge.ll
    llvm/trunk/test/Transforms/PGOProfile/cspgo_profile_summary.ll
    llvm/trunk/test/Transforms/PGOProfile/diag_FE_profile.ll
    llvm/trunk/test/Transforms/PGOProfile/diag_mismatch.ll
    llvm/trunk/test/Transforms/PGOProfile/diag_no_funcprofdata.ll
    llvm/trunk/test/Transforms/PGOProfile/diag_no_profile.ll
    llvm/trunk/test/Transforms/PGOProfile/do-not-instrument.ll
    llvm/trunk/test/Transforms/PGOProfile/func_entry.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_covariant_call_return.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_covariant_invoke_return.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_invoke.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_invoke_nouse.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_mismatch_msg.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_sample.ll
    llvm/trunk/test/Transforms/PGOProfile/icp_vararg.ll
    llvm/trunk/test/Transforms/PGOProfile/indirect_call_annotation.ll
    llvm/trunk/test/Transforms/PGOProfile/indirect_call_profile.ll
    llvm/trunk/test/Transforms/PGOProfile/indirect_call_promotion.ll
    llvm/trunk/test/Transforms/PGOProfile/indirect_call_promotion_vla.ll
    llvm/trunk/test/Transforms/PGOProfile/indirectbr.ll
    llvm/trunk/test/Transforms/PGOProfile/infinite_loop.ll
    llvm/trunk/test/Transforms/PGOProfile/infinite_loop_gen.ll
    llvm/trunk/test/Transforms/PGOProfile/irreducible.ll
    llvm/trunk/test/Transforms/PGOProfile/landingpad.ll
    llvm/trunk/test/Transforms/PGOProfile/large_count_remarks.ll
    llvm/trunk/test/Transforms/PGOProfile/loop1.ll
    llvm/trunk/test/Transforms/PGOProfile/loop2.ll
    llvm/trunk/test/Transforms/PGOProfile/memcpy.ll
    llvm/trunk/test/Transforms/PGOProfile/memop_clone.ll
    llvm/trunk/test/Transforms/PGOProfile/memop_size_annotation.ll
    llvm/trunk/test/Transforms/PGOProfile/memop_size_from_strlen.ll
    llvm/trunk/test/Transforms/PGOProfile/memop_size_opt.ll
    llvm/trunk/test/Transforms/PGOProfile/memop_size_opt_zero.ll
    llvm/trunk/test/Transforms/PGOProfile/multiple_hash_profile.ll
    llvm/trunk/test/Transforms/PGOProfile/noreturncall.ll
    llvm/trunk/test/Transforms/PGOProfile/preinline.ll
    llvm/trunk/test/Transforms/PGOProfile/remap.ll
    llvm/trunk/test/Transforms/PGOProfile/select1.ll
    llvm/trunk/test/Transforms/PGOProfile/select2.ll
    llvm/trunk/test/Transforms/PGOProfile/select_hash_conflict.ll
    llvm/trunk/test/Transforms/PGOProfile/single_bb.ll
    llvm/trunk/test/Transforms/PGOProfile/split-indirectbr-critical-edges.ll
    llvm/trunk/test/Transforms/PGOProfile/statics_counter_naming.ll
    llvm/trunk/test/Transforms/PGOProfile/switch.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_cspgo_gen.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_cspgo_use.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_indirect_call_promotion.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_samplepgo_icp.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_samplepgo_icp2.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_samplepgo_icp3.ll
    llvm/trunk/test/Transforms/PGOProfile/thinlto_samplepgo_icp_droppeddead.ll
    llvm/trunk/test/Transforms/PGOProfile/unreachable_bb.ll
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/X86/
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/X86/good-prototype.ll
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/X86/lit.local.cfg
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll
    llvm/trunk/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll
    llvm/trunk/test/Transforms/PhaseOrdering/
    llvm/trunk/test/Transforms/PhaseOrdering/2010-03-22-empty-baseclass.ll
    llvm/trunk/test/Transforms/PhaseOrdering/PR6627.ll
    llvm/trunk/test/Transforms/PhaseOrdering/basic.ll
    llvm/trunk/test/Transforms/PhaseOrdering/bitfield-bittests.ll
    llvm/trunk/test/Transforms/PhaseOrdering/gdce.ll
    llvm/trunk/test/Transforms/PhaseOrdering/globalaa-retained.ll
    llvm/trunk/test/Transforms/PhaseOrdering/rotate.ll
    llvm/trunk/test/Transforms/PhaseOrdering/scev-custom-dl.ll
    llvm/trunk/test/Transforms/PhaseOrdering/scev.ll
    llvm/trunk/test/Transforms/PhaseOrdering/simplifycfg-options.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/
    llvm/trunk/test/Transforms/PlaceSafepoints/basic.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/call-in-loop.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/finite-loops.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/libcall.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/memset.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/no-statepoints.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/split-backedge.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/statepoint-coreclr.ll
    llvm/trunk/test/Transforms/PlaceSafepoints/statepoint-frameescape.ll
    llvm/trunk/test/Transforms/PreISelIntrinsicLowering/
    llvm/trunk/test/Transforms/PreISelIntrinsicLowering/load-relative.ll
    llvm/trunk/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll
    llvm/trunk/test/Transforms/PruneEH/
    llvm/trunk/test/Transforms/PruneEH/2008-06-02-Weak.ll
    llvm/trunk/test/Transforms/PruneEH/ipo-nounwind.ll
    llvm/trunk/test/Transforms/PruneEH/looptest.ll
    llvm/trunk/test/Transforms/PruneEH/musttail.ll
    llvm/trunk/test/Transforms/PruneEH/operand-bundles.ll
    llvm/trunk/test/Transforms/PruneEH/pr23971.ll
    llvm/trunk/test/Transforms/PruneEH/pr26263.ll
    llvm/trunk/test/Transforms/PruneEH/recursivetest.ll
    llvm/trunk/test/Transforms/PruneEH/seh-nounwind.ll
    llvm/trunk/test/Transforms/PruneEH/simplenoreturntest.ll
    llvm/trunk/test/Transforms/PruneEH/simpletest.ll
    llvm/trunk/test/Transforms/Reassociate/
    llvm/trunk/test/Transforms/Reassociate/2002-05-15-AgressiveSubMove.ll
    llvm/trunk/test/Transforms/Reassociate/2002-05-15-MissedTree.ll
    llvm/trunk/test/Transforms/Reassociate/2002-05-15-SubReassociate.ll
    llvm/trunk/test/Transforms/Reassociate/2002-07-09-DominanceProblem.ll
    llvm/trunk/test/Transforms/Reassociate/2003-08-12-InfiniteLoop.ll
    llvm/trunk/test/Transforms/Reassociate/2005-09-01-ArrayOutOfBounds.ll
    llvm/trunk/test/Transforms/Reassociate/2006-04-27-ReassociateVector.ll
    llvm/trunk/test/Transforms/Reassociate/2011-01-26-UseAfterFree.ll
    llvm/trunk/test/Transforms/Reassociate/2012-05-08-UndefLeak.ll
    llvm/trunk/test/Transforms/Reassociate/2012-06-08-InfiniteLoop.ll
    llvm/trunk/test/Transforms/Reassociate/absorption.ll
    llvm/trunk/test/Transforms/Reassociate/add_across_block_crash.ll
    llvm/trunk/test/Transforms/Reassociate/basictest.ll
    llvm/trunk/test/Transforms/Reassociate/binop-identity.ll
    llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll
    llvm/trunk/test/Transforms/Reassociate/commute.ll
    llvm/trunk/test/Transforms/Reassociate/crash.ll
    llvm/trunk/test/Transforms/Reassociate/crash2.ll
    llvm/trunk/test/Transforms/Reassociate/deadcode.ll
    llvm/trunk/test/Transforms/Reassociate/erase_inst_made_change.ll
    llvm/trunk/test/Transforms/Reassociate/factorize-again.ll
    llvm/trunk/test/Transforms/Reassociate/fast-AgressiveSubMove.ll
    llvm/trunk/test/Transforms/Reassociate/fast-ArrayOutOfBounds.ll
    llvm/trunk/test/Transforms/Reassociate/fast-MissedTree.ll
    llvm/trunk/test/Transforms/Reassociate/fast-ReassociateVector.ll
    llvm/trunk/test/Transforms/Reassociate/fast-SubReassociate.ll
    llvm/trunk/test/Transforms/Reassociate/fast-basictest.ll
    llvm/trunk/test/Transforms/Reassociate/fast-fp-commute.ll
    llvm/trunk/test/Transforms/Reassociate/fast-mightymul.ll
    llvm/trunk/test/Transforms/Reassociate/fast-multistep.ll
    llvm/trunk/test/Transforms/Reassociate/fp-commute.ll
    llvm/trunk/test/Transforms/Reassociate/fp-expr.ll
    llvm/trunk/test/Transforms/Reassociate/infloop-deadphi.ll
    llvm/trunk/test/Transforms/Reassociate/inverses.ll
    llvm/trunk/test/Transforms/Reassociate/keep-debug-loc.ll
    llvm/trunk/test/Transforms/Reassociate/long-chains.ll
    llvm/trunk/test/Transforms/Reassociate/looptest.ll
    llvm/trunk/test/Transforms/Reassociate/matching-binops.ll
    llvm/trunk/test/Transforms/Reassociate/mightymul.ll
    llvm/trunk/test/Transforms/Reassociate/min_int.ll
    llvm/trunk/test/Transforms/Reassociate/mixed-fast-nonfast-fp.ll
    llvm/trunk/test/Transforms/Reassociate/mulfactor.ll
    llvm/trunk/test/Transforms/Reassociate/multistep.ll
    llvm/trunk/test/Transforms/Reassociate/negation.ll
    llvm/trunk/test/Transforms/Reassociate/negation1.ll
    llvm/trunk/test/Transforms/Reassociate/no-op.ll
    llvm/trunk/test/Transforms/Reassociate/optional-flags.ll
    llvm/trunk/test/Transforms/Reassociate/otherops.ll
    llvm/trunk/test/Transforms/Reassociate/pointer-collision-non-determinism.ll
    llvm/trunk/test/Transforms/Reassociate/pr12245.ll
    llvm/trunk/test/Transforms/Reassociate/pr21205.ll
    llvm/trunk/test/Transforms/Reassociate/pr28367.ll
    llvm/trunk/test/Transforms/Reassociate/propagate-flags.ll
    llvm/trunk/test/Transforms/Reassociate/reassoc-intermediate-fnegs.ll
    llvm/trunk/test/Transforms/Reassociate/reassociate-deadinst.ll
    llvm/trunk/test/Transforms/Reassociate/reassociate_dbgvalue_discard.ll
    llvm/trunk/test/Transforms/Reassociate/repeats.ll
    llvm/trunk/test/Transforms/Reassociate/secondary.ll
    llvm/trunk/test/Transforms/Reassociate/shift-factor.ll
    llvm/trunk/test/Transforms/Reassociate/shifttest.ll
    llvm/trunk/test/Transforms/Reassociate/subtest.ll
    llvm/trunk/test/Transforms/Reassociate/vaarg_movable.ll
    llvm/trunk/test/Transforms/Reassociate/wrap-flags.ll
    llvm/trunk/test/Transforms/Reassociate/xor_reassoc.ll
    llvm/trunk/test/Transforms/Reg2Mem/
    llvm/trunk/test/Transforms/Reg2Mem/crash.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-1.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-10.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-11.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-12.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-13.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-2.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-3.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-4.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-5.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-6.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-7.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-8.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers-9.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-pointers.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/base-vector.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/basic.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/basics.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/call-gc-result.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/check_traversal_order.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/constants.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/deopt-intrinsic-cconv.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/deopt-intrinsic.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/deopt-lowering-attrs.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/deref-pointers.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/drop-invalid-metadata.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/gc-relocate-creation.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/invokes.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/leaf-function.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/libcall.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/live-vector-nosplit.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/patchable-statepoints.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/preprocess.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/relocate-invoke-result.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/relocation.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/rematerialize-derived-pointers.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/rewrite-invoke.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/scalar-base-vector.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/statepoint-attrs.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/statepoint-calling-conventions.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/statepoint-coreclr.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/statepoint-format.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/two-invokes-one-landingpad.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/unreachable-regression.ll
    llvm/trunk/test/Transforms/RewriteStatepointsForGC/vector-bitcast.ll
    llvm/trunk/test/Transforms/SCCP/
    llvm/trunk/test/Transforms/SCCP/2002-05-02-MissSecondInst.ll
    llvm/trunk/test/Transforms/SCCP/2002-05-20-MissedIncomingValue.ll
    llvm/trunk/test/Transforms/SCCP/2002-05-21-InvalidSimplify.ll
    llvm/trunk/test/Transforms/SCCP/2002-08-30-GetElementPtrTest.ll
    llvm/trunk/test/Transforms/SCCP/2003-06-24-OverdefinedPHIValue.ll
    llvm/trunk/test/Transforms/SCCP/2003-08-26-InvokeHandling.ll
    llvm/trunk/test/Transforms/SCCP/2004-11-16-DeadInvoke.ll
    llvm/trunk/test/Transforms/SCCP/2004-12-10-UndefBranchBug.ll
    llvm/trunk/test/Transforms/SCCP/2006-10-23-IPSCCP-Crash.ll
    llvm/trunk/test/Transforms/SCCP/2006-12-04-PackedType.ll
    llvm/trunk/test/Transforms/SCCP/2006-12-19-UndefBug.ll
    llvm/trunk/test/Transforms/SCCP/2007-05-16-InvokeCrash.ll
    llvm/trunk/test/Transforms/SCCP/2008-01-27-UndefCorrelate.ll
    llvm/trunk/test/Transforms/SCCP/2008-04-22-multiple-ret-sccp.ll
    llvm/trunk/test/Transforms/SCCP/2008-05-23-UndefCallFold.ll
    llvm/trunk/test/Transforms/SCCP/2009-01-14-IPSCCP-Invoke.ll
    llvm/trunk/test/Transforms/SCCP/2009-05-27-VectorOperandZero.ll
    llvm/trunk/test/Transforms/SCCP/apint-array.ll
    llvm/trunk/test/Transforms/SCCP/apint-basictest.ll
    llvm/trunk/test/Transforms/SCCP/apint-basictest2.ll
    llvm/trunk/test/Transforms/SCCP/apint-basictest3.ll
    llvm/trunk/test/Transforms/SCCP/apint-basictest4.ll
    llvm/trunk/test/Transforms/SCCP/apint-bigarray.ll
    llvm/trunk/test/Transforms/SCCP/apint-bigint.ll
    llvm/trunk/test/Transforms/SCCP/apint-bigint2.ll
    llvm/trunk/test/Transforms/SCCP/apint-ipsccp1.ll
    llvm/trunk/test/Transforms/SCCP/apint-ipsccp2.ll
    llvm/trunk/test/Transforms/SCCP/apint-ipsccp3.ll
    llvm/trunk/test/Transforms/SCCP/apint-ipsccp4.ll
    llvm/trunk/test/Transforms/SCCP/apint-load.ll
    llvm/trunk/test/Transforms/SCCP/apint-phi.ll
    llvm/trunk/test/Transforms/SCCP/apint-select.ll
    llvm/trunk/test/Transforms/SCCP/atomic-load-store.ll
    llvm/trunk/test/Transforms/SCCP/atomic.ll
    llvm/trunk/test/Transforms/SCCP/bitcast.ll
    llvm/trunk/test/Transforms/SCCP/calltest.ll
    llvm/trunk/test/Transforms/SCCP/comdat-ipo.ll
    llvm/trunk/test/Transforms/SCCP/constant-struct.ll
    llvm/trunk/test/Transforms/SCCP/crash.ll
    llvm/trunk/test/Transforms/SCCP/definite-initializer.ll
    llvm/trunk/test/Transforms/SCCP/dont-zap-return.ll
    llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll
    llvm/trunk/test/Transforms/SCCP/indirectbr.ll
    llvm/trunk/test/Transforms/SCCP/ip-constant-ranges.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-addr-taken.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-basic.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-branch-unresolved-undef.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-phi-one-pred-dead.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-preserve-analysis.ll
    llvm/trunk/test/Transforms/SCCP/ipsccp-ssa-copy-nested-conds.ll
    llvm/trunk/test/Transforms/SCCP/latticeval-invalidate.ll
    llvm/trunk/test/Transforms/SCCP/loadtest.ll
    llvm/trunk/test/Transforms/SCCP/logical-nuke.ll
    llvm/trunk/test/Transforms/SCCP/overdefined-div.ll
    llvm/trunk/test/Transforms/SCCP/pr27712.ll
    llvm/trunk/test/Transforms/SCCP/pr35357.ll
    llvm/trunk/test/Transforms/SCCP/preserve-analysis.ll
    llvm/trunk/test/Transforms/SCCP/return-zapped.ll
    llvm/trunk/test/Transforms/SCCP/retvalue-undef.ll
    llvm/trunk/test/Transforms/SCCP/sccptest.ll
    llvm/trunk/test/Transforms/SCCP/select.ll
    llvm/trunk/test/Transforms/SCCP/switch-multiple-undef.ll
    llvm/trunk/test/Transforms/SCCP/switch-undef-constantfoldterminator.ll
    llvm/trunk/test/Transforms/SCCP/switch.ll
    llvm/trunk/test/Transforms/SCCP/ub-shift.ll
    llvm/trunk/test/Transforms/SCCP/undef-resolve.ll
    llvm/trunk/test/Transforms/SCCP/vector-bitcast.ll
    llvm/trunk/test/Transforms/SLPVectorizer/
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/64-bit-vector.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/PR38339.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/commute.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/ext-trunc.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/gather-cost.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/gather-reduce.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/gather-root.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/getelementptr.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/horizontal.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/load-store-q.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/matmul.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/minimum-sizes.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/mismatched-intrinsics.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/nontemporal.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/remarks.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/sdiv-pow2.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/spillcost-di.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/transpose.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AArch64/tsc-s352.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/address-space-ptr-sze-gep-index-assert.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/horizontal-store.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/packed-math.ll
    llvm/trunk/test/Transforms/SLPVectorizer/AMDGPU/reduction.ll
    llvm/trunk/test/Transforms/SLPVectorizer/ARM/
    llvm/trunk/test/Transforms/SLPVectorizer/ARM/extract-insert.ll
    llvm/trunk/test/Transforms/SLPVectorizer/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/ARM/memory.ll
    llvm/trunk/test/Transforms/SLPVectorizer/ARM/sroa.ll
    llvm/trunk/test/Transforms/SLPVectorizer/NVPTX/
    llvm/trunk/test/Transforms/SLPVectorizer/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/NVPTX/non-vectorizable-intrinsic.ll
    llvm/trunk/test/Transforms/SLPVectorizer/NVPTX/v2f16.ll
    llvm/trunk/test/Transforms/SLPVectorizer/PowerPC/
    llvm/trunk/test/Transforms/SLPVectorizer/PowerPC/aggregate.ll
    llvm/trunk/test/Transforms/SLPVectorizer/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/PowerPC/pr27897.ll
    llvm/trunk/test/Transforms/SLPVectorizer/PowerPC/short-to-double.ll
    llvm/trunk/test/Transforms/SLPVectorizer/SystemZ/
    llvm/trunk/test/Transforms/SLPVectorizer/SystemZ/SLP-cmp-cost-query.ll
    llvm/trunk/test/Transforms/SLPVectorizer/SystemZ/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/SystemZ/pr34619.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR32086.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR34635.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR35628_1.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR35628_2.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR35777.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR35865.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR36280.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR39774.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/PR40310.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/addsub.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/aggregate.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/alternate-calls.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/alternate-cast.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/alternate-fp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/alternate-int.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-add-saddo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-add-ssat.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-add-uaddo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-add-usat.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-add.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-fix.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-fp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-mul-smulo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-mul-umulo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-mul.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-sub-ssat.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-sub-ssubo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-sub-usat.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-sub-usubo.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/arith-sub.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/atomics.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/bad_types.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/barriercall.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/bitreverse.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/blending-shuffle.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/bswap.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/call.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cast.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cmp_commute.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cmp_sel.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/commutativity.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/compare-reduce.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/consecutive-access.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/continue_vectorizing.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_7zip.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_binaryop.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_bullet.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_bullet3.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_cmpop.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_dequeue.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_flop7.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_gep.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_lencod.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_mandeltext.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_netbsd_decompress.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_scheduling.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_sim4b1.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_smallpt.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/crash_vectorizeTree.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cross_block_slp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cse.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/ctlz.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/ctpop.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cttz.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/cycle_dup.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/debug_info.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/diamond.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/external_user.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/external_user_jumbled_load.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/extract-shuffle.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/extract.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/extract_in_tree_user.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/extractcost.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/extractelement.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fabs-cost-softfp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fabs.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fcopysign.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/flag.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fma.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fptosi.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fptoui.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/fround.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/funclet.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/gep.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/gep_mismatch.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/hadd.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/hoist.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/horizontal-list.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/horizontal-minmax.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/horizontal.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/hsub.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/implicitfloat.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/in-tree-user.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/insert-after-bundle.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/insert-element-build-vector.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/insertvalue.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/intrinsic.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/jumbled-load-multiuse.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/jumbled-load-shuffle-placement.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/jumbled-load-used-in-phi.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/jumbled-load.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/limit.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/X86/load-merge.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/long_chains.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/loopinvariant.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/metadata.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/minimum-sizes.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/multi_block.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/multi_user.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/odd_store.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/operandorder.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/opt.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/ordering.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/partail.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/phi.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/phi3.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/phi_landingpad.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/phi_overalignedtype.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/powof2div.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr16571.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr16628.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr16899.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr18060.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr19657.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr23510.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr27163.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr31599.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/pr35497.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/propagate_ir_flags.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reassociated-loads.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reduction.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reduction2.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reduction_loads.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reduction_unrolled.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/remark_horcost.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/remark_listcost.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/remark_not_all_parts.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/remark_unsupported.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reorder_phi.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reorder_repeated_ops.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/resched.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/return.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/reverse_extract_elements.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/rgb_phi.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/saxpy.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/schedule-bundle.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/schedule_budget.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/scheduling.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/sext.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/shift-ashr.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/shift-lshr.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/shift-shl.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/sign-extend.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/simple-loop.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/simplebb.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/sitofp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/slp-throttle.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/sqrt.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/store-jumbled.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/stores_vectorize.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/uitofp.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/undef_vect.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/unreachable.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/value-bug.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/vect_copyable_in_binops.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/vector.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/vector_gep.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/vectorize-reorder-reuse.ll
    llvm/trunk/test/Transforms/SLPVectorizer/X86/zext.ll
    llvm/trunk/test/Transforms/SLPVectorizer/XCore/
    llvm/trunk/test/Transforms/SLPVectorizer/XCore/lit.local.cfg
    llvm/trunk/test/Transforms/SLPVectorizer/XCore/no-vector-registers.ll
    llvm/trunk/test/Transforms/SLPVectorizer/int_sideeffect.ll
    llvm/trunk/test/Transforms/SROA/
    llvm/trunk/test/Transforms/SROA/address-spaces.ll
    llvm/trunk/test/Transforms/SROA/alignment.ll
    llvm/trunk/test/Transforms/SROA/alloca-address-space.ll
    llvm/trunk/test/Transforms/SROA/basictest.ll
    llvm/trunk/test/Transforms/SROA/big-endian.ll
    llvm/trunk/test/Transforms/SROA/dbg-addr-diamond.ll
    llvm/trunk/test/Transforms/SROA/dbg-single-piece.ll
    llvm/trunk/test/Transforms/SROA/dead-inst.ll
    llvm/trunk/test/Transforms/SROA/fca.ll
    llvm/trunk/test/Transforms/SROA/mem-par-metadata-sroa.ll
    llvm/trunk/test/Transforms/SROA/non-integral-pointers.ll
    llvm/trunk/test/Transforms/SROA/phi-and-select.ll
    llvm/trunk/test/Transforms/SROA/phi-with-duplicate-pred.ll
    llvm/trunk/test/Transforms/SROA/pointer-offset-size.ll
    llvm/trunk/test/Transforms/SROA/ppcf128-no-fold.ll
    llvm/trunk/test/Transforms/SROA/pr26972.ll
    llvm/trunk/test/Transforms/SROA/pr37267.ll
    llvm/trunk/test/Transforms/SROA/preserve-nonnull.ll
    llvm/trunk/test/Transforms/SROA/slice-order-independence.ll
    llvm/trunk/test/Transforms/SROA/slice-width.ll
    llvm/trunk/test/Transforms/SROA/vector-conversion.ll
    llvm/trunk/test/Transforms/SROA/vector-lifetime-intrinsic.ll
    llvm/trunk/test/Transforms/SROA/vector-promotion.ll
    llvm/trunk/test/Transforms/SROA/vectors-of-pointers.ll
    llvm/trunk/test/Transforms/SafeStack/
    llvm/trunk/test/Transforms/SafeStack/AArch64/
    llvm/trunk/test/Transforms/SafeStack/AArch64/abi.ll
    llvm/trunk/test/Transforms/SafeStack/AArch64/abi_ssp.ll
    llvm/trunk/test/Transforms/SafeStack/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/SafeStack/AArch64/unreachable.ll
    llvm/trunk/test/Transforms/SafeStack/ARM/
    llvm/trunk/test/Transforms/SafeStack/ARM/abi.ll
    llvm/trunk/test/Transforms/SafeStack/ARM/debug.ll
    llvm/trunk/test/Transforms/SafeStack/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/SafeStack/ARM/setjmp.ll
    llvm/trunk/test/Transforms/SafeStack/X86/
    llvm/trunk/test/Transforms/SafeStack/X86/abi.ll
    llvm/trunk/test/Transforms/SafeStack/X86/abi_ssp.ll
    llvm/trunk/test/Transforms/SafeStack/X86/addr-taken.ll
    llvm/trunk/test/Transforms/SafeStack/X86/array-aligned.ll
    llvm/trunk/test/Transforms/SafeStack/X86/array.ll
    llvm/trunk/test/Transforms/SafeStack/X86/byval.ll
    llvm/trunk/test/Transforms/SafeStack/X86/call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/cast.ll
    llvm/trunk/test/Transforms/SafeStack/X86/coloring-ssp.ll
    llvm/trunk/test/Transforms/SafeStack/X86/coloring.ll
    llvm/trunk/test/Transforms/SafeStack/X86/coloring2.ll
    llvm/trunk/test/Transforms/SafeStack/X86/constant-gep-call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/constant-gep.ll
    llvm/trunk/test/Transforms/SafeStack/X86/constant-geps.ll
    llvm/trunk/test/Transforms/SafeStack/X86/debug-loc-dynamic.ll
    llvm/trunk/test/Transforms/SafeStack/X86/debug-loc.ll
    llvm/trunk/test/Transforms/SafeStack/X86/debug-loc2.ll
    llvm/trunk/test/Transforms/SafeStack/X86/dynamic-alloca.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-addr-pointer.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-bitcast-store.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-bitcast-store2.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-casted-pointer.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-gep-call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-gep-invoke.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-gep-negative.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-gep-ptrtoint.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-gep-store.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-phi-call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-select-call.ll
    llvm/trunk/test/Transforms/SafeStack/X86/escape-vector.ll
    llvm/trunk/test/Transforms/SafeStack/X86/invoke.ll
    llvm/trunk/test/Transforms/SafeStack/X86/layout-frag.ll
    llvm/trunk/test/Transforms/SafeStack/X86/layout-region-split.ll
    llvm/trunk/test/Transforms/SafeStack/X86/lit.local.cfg
    llvm/trunk/test/Transforms/SafeStack/X86/memintrinsic-oob-read.ll
    llvm/trunk/test/Transforms/SafeStack/X86/no-attr.ll
    llvm/trunk/test/Transforms/SafeStack/X86/phi-cycle.ll
    llvm/trunk/test/Transforms/SafeStack/X86/phi.ll
    llvm/trunk/test/Transforms/SafeStack/X86/ret.ll
    llvm/trunk/test/Transforms/SafeStack/X86/setjmp.ll
    llvm/trunk/test/Transforms/SafeStack/X86/setjmp2.ll
    llvm/trunk/test/Transforms/SafeStack/X86/sink-to-use.ll
    llvm/trunk/test/Transforms/SafeStack/X86/ssp.ll
    llvm/trunk/test/Transforms/SafeStack/X86/store.ll
    llvm/trunk/test/Transforms/SafeStack/X86/struct.ll
    llvm/trunk/test/Transforms/SampleProfile/
    llvm/trunk/test/Transforms/SampleProfile/Inputs/
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_discriminator_value.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_fn_header.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_line_values.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_mangle.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_sample_line.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/bad_samples.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/branch.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/calls.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/cov-zero-samples.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/coverage-warning.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/discriminator.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/einline.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/entry_counts.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/entry_counts_cold.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/flattened.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/fnptr.binprof   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/fnptr.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/function_metadata.compact.afdo   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/function_metadata.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/gcc-simple.afdo   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/indirect-call.afdo   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/indirect-call.compact.afdo   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/indirect-call.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline-act.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline-combine.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline-coverage.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline-hint.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline.compactbinary.afdo   (with props)
    llvm/trunk/test/Transforms/SampleProfile/Inputs/inline.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/nodebug.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/offset.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/propagate.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/remap.map
    llvm/trunk/test/Transforms/SampleProfile/Inputs/remap.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/remarks.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/summary.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/syntax.prof
    llvm/trunk/test/Transforms/SampleProfile/Inputs/warm-inline-instance.prof
    llvm/trunk/test/Transforms/SampleProfile/branch.ll
    llvm/trunk/test/Transforms/SampleProfile/calls.ll
    llvm/trunk/test/Transforms/SampleProfile/cold-indirect-call.ll
    llvm/trunk/test/Transforms/SampleProfile/compact-binary-profile.ll
    llvm/trunk/test/Transforms/SampleProfile/cov-zero-samples.ll
    llvm/trunk/test/Transforms/SampleProfile/coverage-warning.ll
    llvm/trunk/test/Transforms/SampleProfile/discriminator.ll
    llvm/trunk/test/Transforms/SampleProfile/early-inline.ll
    llvm/trunk/test/Transforms/SampleProfile/entry_counts.ll
    llvm/trunk/test/Transforms/SampleProfile/entry_counts_cold.ll
    llvm/trunk/test/Transforms/SampleProfile/flattened.ll
    llvm/trunk/test/Transforms/SampleProfile/fnptr.ll
    llvm/trunk/test/Transforms/SampleProfile/function_metadata.ll
    llvm/trunk/test/Transforms/SampleProfile/gcc-simple.ll
    llvm/trunk/test/Transforms/SampleProfile/indirect-call-gcc.ll
    llvm/trunk/test/Transforms/SampleProfile/indirect-call.ll
    llvm/trunk/test/Transforms/SampleProfile/inline-act.ll
    llvm/trunk/test/Transforms/SampleProfile/inline-cold-callsite-samplepgo.ll
    llvm/trunk/test/Transforms/SampleProfile/inline-combine.ll
    llvm/trunk/test/Transforms/SampleProfile/inline-coverage.ll
    llvm/trunk/test/Transforms/SampleProfile/inline.ll
    llvm/trunk/test/Transforms/SampleProfile/nodebug.ll
    llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll
    llvm/trunk/test/Transforms/SampleProfile/offset.ll
    llvm/trunk/test/Transforms/SampleProfile/propagate.ll
    llvm/trunk/test/Transforms/SampleProfile/remap.ll
    llvm/trunk/test/Transforms/SampleProfile/remarks.ll
    llvm/trunk/test/Transforms/SampleProfile/section-accurate-samplepgo.ll
    llvm/trunk/test/Transforms/SampleProfile/summary.ll
    llvm/trunk/test/Transforms/SampleProfile/syntax.ll
    llvm/trunk/test/Transforms/SampleProfile/warm-inline-instance.ll
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/expand-masked-compressstore.ll
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/expand-masked-expandload.ll
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/expand-masked-gather.ll
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/expand-masked-load.ll
    llvm/trunk/test/Transforms/ScalarizeMaskedMemIntrin/X86/expand-masked-store.ll
    llvm/trunk/test/Transforms/Scalarizer/
    llvm/trunk/test/Transforms/Scalarizer/basic.ll
    llvm/trunk/test/Transforms/Scalarizer/cache-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/crash-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/dbginfo.ll
    llvm/trunk/test/Transforms/Scalarizer/dbgloc-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/intrinsics.ll
    llvm/trunk/test/Transforms/Scalarizer/order-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/phi-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/store-bug.ll
    llvm/trunk/test/Transforms/Scalarizer/vector-gep.ll
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/AMDGPU/
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/AMDGPU/split-gep-and-gvn-addrspace-addressing-modes.ll
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep-and-gvn.ll
    llvm/trunk/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2006-06-13-SingleEntryPHI.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2006-06-27-DeadSwitchCase.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-05-09-Unreachable.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-05-09-tl.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-07-12-ExitDomInfo.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-07-13-DomInfo.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-07-18-DomInfo.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-08-01-Dom.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-08-01-LCSSA.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2007-10-04-DomFrontier.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2008-06-02-DomInfo.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2008-06-17-DomFrontier.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2010-11-18-LCSSA.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2011-06-02-CritSwitch.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2011-09-26-EHCrash.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2012-04-02-IndirectBr.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2012-04-30-LoopUnswitch-LPad-Crash.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2012-05-20-Phi.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/2015-09-18-Addrspace.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/LIV-loop-condtion.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/basictest.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/cleanuppad.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/copy-metadata.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/crash.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/delete-dead-blocks.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-behavior.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch-nested.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch-nested2.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-nontrivial-unswitch2.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/exponential-switch-unswitch.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/formDedicatedAfterTrivial1.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/formDedicatedAfterTrivial2.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/formDedicatedAfterTrivial3.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/guards.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/infinite-loop.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/msan.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch-cost.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/nontrivial-unswitch.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/pr37888.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/preserve-analyses.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/trivial-unswitch-iteration.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/trivial-unswitch.ll
    llvm/trunk/test/Transforms/SimpleLoopUnswitch/update-scev.ll
    llvm/trunk/test/Transforms/SimplifyCFG/
    llvm/trunk/test/Transforms/SimplifyCFG/2002-05-21-PHIElimination.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2002-09-24-PHIAssertion.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-03-07-DominateProblem.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-08-05-InvokeCrash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-08-17-BranchFold.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-08-17-BranchFoldOrdering.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch-dbg.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2003-08-17-FoldSwitch.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2004-12-10-SimplifyCFGCrash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2005-06-16-PHICrash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2005-08-01-PHIUpdateFail.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2005-10-02-InvokeSimplify.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2005-12-03-IncorrectPHIFold.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2006-02-17-InfiniteUnroll.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2006-08-03-Crash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2006-10-19-UncondDiv.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2006-12-08-Ptr-ICmp-Branch.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2007-11-22-InvokeNoUnwind.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2007-12-21-Crash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-01-02-hoist-fp-add.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-05-16-PHIBlockMerge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-07-13-InfLoopMiscompile.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-09-08-MultiplePred.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-09-17-SpeculativeHoist.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-10-03-SpeculativelyExecuteBeforePHI.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-12-06-SingleEntryPhi.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2008-12-16-DCECond.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2009-05-12-externweak.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2010-03-30-InvokeCrash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2011-03-08-UnreachableUse.ll
    llvm/trunk/test/Transforms/SimplifyCFG/2011-09-05-TrivialLPad.ll
    llvm/trunk/test/Transforms/SimplifyCFG/AArch64/
    llvm/trunk/test/Transforms/SimplifyCFG/AArch64/cttz-ctlz.ll
    llvm/trunk/test/Transforms/SimplifyCFG/AArch64/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/AArch64/prefer-fma.ll
    llvm/trunk/test/Transforms/SimplifyCFG/AMDGPU/
    llvm/trunk/test/Transforms/SimplifyCFG/AMDGPU/cttz-ctlz.ll
    llvm/trunk/test/Transforms/SimplifyCFG/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/cttz-ctlz.ll
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/select-trunc-i64.ll
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table-constant-expr.ll
    llvm/trunk/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/BrUnwind.ll
    llvm/trunk/test/Transforms/SimplifyCFG/ConditionalTrappingConstantExpr.ll
    llvm/trunk/test/Transforms/SimplifyCFG/CoveredLookupTable.ll
    llvm/trunk/test/Transforms/SimplifyCFG/DeadSetCC.ll
    llvm/trunk/test/Transforms/SimplifyCFG/EmptyBlockMerge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/EqualPHIEdgeBlockMerge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll
    llvm/trunk/test/Transforms/SimplifyCFG/Hexagon/
    llvm/trunk/test/Transforms/SimplifyCFG/Hexagon/disable-lookup-table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/Hexagon/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/Hexagon/switch-to-lookup-table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/HoistCode.ll
    llvm/trunk/test/Transforms/SimplifyCFG/InfLoop.ll
    llvm/trunk/test/Transforms/SimplifyCFG/MagicPointer.ll
    llvm/trunk/test/Transforms/SimplifyCFG/Mips/
    llvm/trunk/test/Transforms/SimplifyCFG/Mips/cttz-ctlz.ll
    llvm/trunk/test/Transforms/SimplifyCFG/Mips/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/PHINode.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR16069.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR17073.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR25267.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR27615-simplify-cond-br.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR29163.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR30210.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PR9946.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiBlockMerge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiBlockMerge2.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate3.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PhiNoEliminate.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PowerPC/
    llvm/trunk/test/Transforms/SimplifyCFG/PowerPC/cttz-ctlz-spec.ll
    llvm/trunk/test/Transforms/SimplifyCFG/PowerPC/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/RISCV/
    llvm/trunk/test/Transforms/SimplifyCFG/RISCV/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/RISCV/select-trunc-i64.ll
    llvm/trunk/test/Transforms/SimplifyCFG/SPARC/
    llvm/trunk/test/Transforms/SimplifyCFG/SPARC/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/SPARC/switch_to_lookup_table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/SpeculativeExec.ll
    llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
    llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToReturn.ll
    llvm/trunk/test/Transforms/SimplifyCFG/UnreachableEliminate.ll
    llvm/trunk/test/Transforms/SimplifyCFG/X86/
    llvm/trunk/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/X86/lit.local.cfg
    llvm/trunk/test/Transforms/SimplifyCFG/X86/speculate-cttz-ctlz.ll
    llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll
    llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll
    llvm/trunk/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll
    llvm/trunk/test/Transforms/SimplifyCFG/assume.ll
    llvm/trunk/test/Transforms/SimplifyCFG/attr-convergent.ll
    llvm/trunk/test/Transforms/SimplifyCFG/attr-noduplicate.ll
    llvm/trunk/test/Transforms/SimplifyCFG/basictest.ll
    llvm/trunk/test/Transforms/SimplifyCFG/bbi-23595.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-cond-merge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-cond-prop.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-dbg.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-test.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-three.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-threshold.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-fold.ll
    llvm/trunk/test/Transforms/SimplifyCFG/branch-phi-thread.ll
    llvm/trunk/test/Transforms/SimplifyCFG/bug-25299.ll
    llvm/trunk/test/Transforms/SimplifyCFG/clamp.ll
    llvm/trunk/test/Transforms/SimplifyCFG/combine-parallel-mem-md.ll
    llvm/trunk/test/Transforms/SimplifyCFG/common-dest-folding.ll
    llvm/trunk/test/Transforms/SimplifyCFG/critedge-assume.ll
    llvm/trunk/test/Transforms/SimplifyCFG/dbginfo.ll
    llvm/trunk/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll
    llvm/trunk/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll
    llvm/trunk/test/Transforms/SimplifyCFG/div-rem-pairs.ll
    llvm/trunk/test/Transforms/SimplifyCFG/duplicate-landingpad.ll
    llvm/trunk/test/Transforms/SimplifyCFG/duplicate-phis.ll
    llvm/trunk/test/Transforms/SimplifyCFG/empty-catchpad.ll
    llvm/trunk/test/Transforms/SimplifyCFG/empty-cleanuppad.ll
    llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll
    llvm/trunk/test/Transforms/SimplifyCFG/fold-branch-debuginvariant.ll
    llvm/trunk/test/Transforms/SimplifyCFG/fold-debug-info.ll
    llvm/trunk/test/Transforms/SimplifyCFG/gepcost.ll
    llvm/trunk/test/Transforms/SimplifyCFG/guards.ll
    llvm/trunk/test/Transforms/SimplifyCFG/hoist-common-code.ll
    llvm/trunk/test/Transforms/SimplifyCFG/hoist-dbgvalue-inlined.ll
    llvm/trunk/test/Transforms/SimplifyCFG/hoist-dbgvalue.ll
    llvm/trunk/test/Transforms/SimplifyCFG/hoist-with-range.ll
    llvm/trunk/test/Transforms/SimplifyCFG/implied-and-or.ll
    llvm/trunk/test/Transforms/SimplifyCFG/implied-cond-matching-false-dest.ll
    llvm/trunk/test/Transforms/SimplifyCFG/implied-cond-matching-imm.ll
    llvm/trunk/test/Transforms/SimplifyCFG/implied-cond-matching.ll
    llvm/trunk/test/Transforms/SimplifyCFG/implied-cond.ll
    llvm/trunk/test/Transforms/SimplifyCFG/indirectbr.ll
    llvm/trunk/test/Transforms/SimplifyCFG/inline-asm-sink.ll
    llvm/trunk/test/Transforms/SimplifyCFG/invoke.ll
    llvm/trunk/test/Transforms/SimplifyCFG/invoke_unwind.ll
    llvm/trunk/test/Transforms/SimplifyCFG/iterative-simplify.ll
    llvm/trunk/test/Transforms/SimplifyCFG/lifetime.ll
    llvm/trunk/test/Transforms/SimplifyCFG/merge-cleanuppads.ll
    llvm/trunk/test/Transforms/SimplifyCFG/merge-cond-stores-2.ll
    llvm/trunk/test/Transforms/SimplifyCFG/merge-cond-stores.ll
    llvm/trunk/test/Transforms/SimplifyCFG/multiple-phis.ll
    llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll
    llvm/trunk/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll
    llvm/trunk/test/Transforms/SimplifyCFG/no_speculative_loads_with_tsan.ll
    llvm/trunk/test/Transforms/SimplifyCFG/noreturn-call.ll
    llvm/trunk/test/Transforms/SimplifyCFG/opt-for-fuzzing.ll
    llvm/trunk/test/Transforms/SimplifyCFG/phi-undef-loadstore.ll
    llvm/trunk/test/Transforms/SimplifyCFG/pr33605.ll
    llvm/trunk/test/Transforms/SimplifyCFG/pr34131.ll
    llvm/trunk/test/Transforms/SimplifyCFG/pr35774.ll
    llvm/trunk/test/Transforms/SimplifyCFG/pr39807.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-branchweights-partial.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-branchweights-switch-create.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-branchweights.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-load-metadata-2.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-load-metadata-3.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-load-metadata.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-make-implicit-on-switch-to-br.ll
    llvm/trunk/test/Transforms/SimplifyCFG/preserve-store-alignment.ll
    llvm/trunk/test/Transforms/SimplifyCFG/rangereduce.ll
    llvm/trunk/test/Transforms/SimplifyCFG/remove-debug-2.ll
    llvm/trunk/test/Transforms/SimplifyCFG/remove-debug.ll
    llvm/trunk/test/Transforms/SimplifyCFG/return-merge.ll
    llvm/trunk/test/Transforms/SimplifyCFG/seh-nounwind.ll
    llvm/trunk/test/Transforms/SimplifyCFG/select-gep.ll
    llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-call.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-dbgvalue.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-math.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-store.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-vector-ops.ll
    llvm/trunk/test/Transforms/SimplifyCFG/speculate-with-offset.ll
    llvm/trunk/test/Transforms/SimplifyCFG/statepoint-invoke-unwind.ll
    llvm/trunk/test/Transforms/SimplifyCFG/suppress-zero-branch-weights.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-dead-default.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-masked-bits.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-on-const-select.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-range-to-icmp.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-simplify-crash.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-to-br.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-to-icmp.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-to-select-multiple-edge-per-block-phi.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch-to-select-two-case.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch_create.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch_switch_fold.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch_thread.ll
    llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll
    llvm/trunk/test/Transforms/SimplifyCFG/trap-debugloc.ll
    llvm/trunk/test/Transforms/SimplifyCFG/trap-no-null-opt-debugloc.ll
    llvm/trunk/test/Transforms/SimplifyCFG/trapping-load-unreachable.ll
    llvm/trunk/test/Transforms/SimplifyCFG/two-entry-phi-return.ll
    llvm/trunk/test/Transforms/SimplifyCFG/unreachable-blocks.ll
    llvm/trunk/test/Transforms/SimplifyCFG/unreachable-cleanuppad.ll
    llvm/trunk/test/Transforms/SimplifyCFG/volatile-phioper.ll
    llvm/trunk/test/Transforms/SimplifyCFG/wineh-unreachable.ll
    llvm/trunk/test/Transforms/Sink/
    llvm/trunk/test/Transforms/Sink/badloadsink.ll
    llvm/trunk/test/Transforms/Sink/basic.ll
    llvm/trunk/test/Transforms/Sink/call.ll
    llvm/trunk/test/Transforms/Sink/catchswitch.ll
    llvm/trunk/test/Transforms/Sink/convergent.ll
    llvm/trunk/test/Transforms/Sink/fence.ll
    llvm/trunk/test/Transforms/Sink/landingpad.ll
    llvm/trunk/test/Transforms/SpeculateAroundPHIs/
    llvm/trunk/test/Transforms/SpeculateAroundPHIs/basic-x86.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-calls.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-casts.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-compares.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/spec-fp.ll
    llvm/trunk/test/Transforms/SpeculativeExecution/spec.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/AMDGPU/
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/AMDGPU/pr23975.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/AMDGPU/reassociate-geps-and-slsr-addrspace.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/NVPTX/
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/NVPTX/lit.local.cfg
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/NVPTX/reassociate-geps-and-slsr.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/NVPTX/speculative-slsr.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/X86/
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/X86/lit.local.cfg
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/X86/no-slsr.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/slsr-add.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/slsr-gep.ll
    llvm/trunk/test/Transforms/StraightLineStrengthReduce/slsr-mul.ll
    llvm/trunk/test/Transforms/StripDeadPrototypes/
    llvm/trunk/test/Transforms/StripDeadPrototypes/basic.ll
    llvm/trunk/test/Transforms/StripSymbols/
    llvm/trunk/test/Transforms/StripSymbols/2007-01-15-llvm.used.ll
    llvm/trunk/test/Transforms/StripSymbols/2010-06-30-StripDebug.ll
    llvm/trunk/test/Transforms/StripSymbols/2010-08-25-crash.ll
    llvm/trunk/test/Transforms/StripSymbols/block-address.ll
    llvm/trunk/test/Transforms/StripSymbols/strip-cov.ll
    llvm/trunk/test/Transforms/StripSymbols/strip-dead-debug-info.ll
    llvm/trunk/test/Transforms/StructurizeCFG/
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/backedge-id-bug-xfail.ll
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/backedge-id-bug.ll
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/lit.local.cfg
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/loop-subregion-misordered.ll
    llvm/trunk/test/Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll
    llvm/trunk/test/Transforms/StructurizeCFG/branch-on-argument.ll
    llvm/trunk/test/Transforms/StructurizeCFG/bug36015.ll
    llvm/trunk/test/Transforms/StructurizeCFG/invert-condition.ll
    llvm/trunk/test/Transforms/StructurizeCFG/invert-constantexpr.ll
    llvm/trunk/test/Transforms/StructurizeCFG/loop-continue-phi.ll
    llvm/trunk/test/Transforms/StructurizeCFG/loop-multiple-exits.ll
    llvm/trunk/test/Transforms/StructurizeCFG/nested-loop-order.ll
    llvm/trunk/test/Transforms/StructurizeCFG/no-branch-to-entry.ll
    llvm/trunk/test/Transforms/StructurizeCFG/one-loop-multiple-backedges.ll
    llvm/trunk/test/Transforms/StructurizeCFG/post-order-traversal-bug.ll
    llvm/trunk/test/Transforms/StructurizeCFG/rebuild-ssa-infinite-loop.ll
    llvm/trunk/test/Transforms/StructurizeCFG/switch.ll
    llvm/trunk/test/Transforms/SyntheticCountsPropagation/
    llvm/trunk/test/Transforms/SyntheticCountsPropagation/initial.ll
    llvm/trunk/test/Transforms/SyntheticCountsPropagation/prop.ll
    llvm/trunk/test/Transforms/SyntheticCountsPropagation/scc.ll
    llvm/trunk/test/Transforms/TailCallElim/
    llvm/trunk/test/Transforms/TailCallElim/2010-06-26-MultipleReturnValues.ll
    llvm/trunk/test/Transforms/TailCallElim/EraseBB.ll
    llvm/trunk/test/Transforms/TailCallElim/accum_recursion.ll
    llvm/trunk/test/Transforms/TailCallElim/ackermann.ll
    llvm/trunk/test/Transforms/TailCallElim/basic.ll
    llvm/trunk/test/Transforms/TailCallElim/debugloc.ll
    llvm/trunk/test/Transforms/TailCallElim/deopt-bundle.ll
    llvm/trunk/test/Transforms/TailCallElim/dont_reorder_load.ll
    llvm/trunk/test/Transforms/TailCallElim/dup_tail.ll
    llvm/trunk/test/Transforms/TailCallElim/inf-recursion.ll
    llvm/trunk/test/Transforms/TailCallElim/notail.ll
    llvm/trunk/test/Transforms/TailCallElim/opt-remarks-recursion.ll
    llvm/trunk/test/Transforms/TailCallElim/reorder_load.ll
    llvm/trunk/test/Transforms/TailCallElim/setjmp.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/comdat.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/function-alias.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/new-pm.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/no-type-md.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/pr33536.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split-internal-typeid.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split-internal1.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split-internal2.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split-vfunc-internal.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split-vfunc.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/split.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/symver.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/unsplittable.ll
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/x86/
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/x86/lit.local.cfg
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll
    llvm/trunk/test/Transforms/Util/
    llvm/trunk/test/Transforms/Util/PR37334-break-crit-edges-require-dt.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/
    llvm/trunk/test/Transforms/Util/PredicateInfo/condprop.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/diamond.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/edge.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/ordering.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/pr33456.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/pr33457.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/testandor.ll
    llvm/trunk/test/Transforms/Util/PredicateInfo/unnamed-types.ll
    llvm/trunk/test/Transforms/Util/call-promotion-utils-ptrcast-attribute.ll
    llvm/trunk/test/Transforms/Util/call-promotion-utils-ptrcast.ll
    llvm/trunk/test/Transforms/Util/clone-dicompileunit.ll
    llvm/trunk/test/Transforms/Util/combine-alias-scope-metadata.ll
    llvm/trunk/test/Transforms/Util/dbg-user-of-aext.ll
    llvm/trunk/test/Transforms/Util/flattencfg.ll
    llvm/trunk/test/Transforms/Util/libcalls-fast-math-inf-loop.ll
    llvm/trunk/test/Transforms/Util/libcalls-opt-remarks.ll
    llvm/trunk/test/Transforms/Util/libcalls-shrinkwrap-double.ll
    llvm/trunk/test/Transforms/Util/libcalls-shrinkwrap-float.ll
    llvm/trunk/test/Transforms/Util/libcalls-shrinkwrap-long-double.ll
    llvm/trunk/test/Transforms/Util/lowerinvoke-funclet.ll
    llvm/trunk/test/Transforms/Util/lowerswitch.ll
    llvm/trunk/test/Transforms/Util/simplify-dbg-declare-load.ll
    llvm/trunk/test/Transforms/Util/store-first-op.ll
    llvm/trunk/test/Transforms/Util/strip-gc-relocates.ll
    llvm/trunk/test/Transforms/Util/strip-nonlinetable-debuginfo-containingtypes.ll
    llvm/trunk/test/Transforms/Util/strip-nonlinetable-debuginfo-cus.ll
    llvm/trunk/test/Transforms/Util/strip-nonlinetable-debuginfo-localvars.ll
    llvm/trunk/test/Transforms/Util/strip-nonlinetable-debuginfo-loops.ll
    llvm/trunk/test/Transforms/Util/strip-nonlinetable-debuginfo-subroutinetypes.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/export.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-branch-funnel.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-single-impl.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-uniform-ret-val.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-unique-ret-val0.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-unique-ret-val1.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-vcp-branch-funnel.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/Inputs/import-vcp.yaml
    llvm/trunk/test/Transforms/WholeProgramDevirt/bad-read-from-vtable.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/branch-funnel-threshold.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/branch-funnel.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/constant-arg.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/devirt-single-impl-check.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/devirt-single-impl.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/expand-check.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-nothing.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-single-impl.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/export-vcp.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/import-indir.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/import-no-dominating-assume.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/import.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/non-constant-vtable.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/pointer-vtable.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/soa-vtable.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/struct-vtable.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/uniform-retval-invoke.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/uniform-retval.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/unique-retval.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-accesses-memory.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-decl.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-no-this.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-non-constant-arg.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-too-wide-ints.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-type-mismatch.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vcp-uses-this.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll
    llvm/trunk/test/Transforms/WholeProgramDevirt/vtable-decl.ll
Modified:
    llvm/trunk/include/llvm/InitializePasses.h
    llvm/trunk/include/llvm/Transforms/Scalar.h
    llvm/trunk/lib/Passes/PassBuilder.cpp
    llvm/trunk/lib/Passes/PassRegistry.def
    llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt
    llvm/trunk/lib/Transforms/Scalar/Scalar.cpp

Modified: llvm/trunk/include/llvm/InitializePasses.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/include/llvm/InitializePasses.h (original)
+++ llvm/trunk/include/llvm/InitializePasses.h Tue Apr 16 21:52:47 2019
@@ -219,6 +219,7 @@ void initializeLoopDeletionLegacyPassPas
 void initializeLoopDistributeLegacyPass(PassRegistry&);
 void initializeLoopExtractorPass(PassRegistry&);
 void initializeLoopGuardWideningLegacyPassPass(PassRegistry&);
+void initializeLoopFuseLegacyPass(PassRegistry&);
 void initializeLoopIdiomRecognizeLegacyPassPass(PassRegistry&);
 void initializeLoopInfoWrapperPassPass(PassRegistry&);
 void initializeLoopInstSimplifyLegacyPassPass(PassRegistry&);

Modified: llvm/trunk/include/llvm/Transforms/Scalar.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Scalar.h (original)
+++ llvm/trunk/include/llvm/Transforms/Scalar.h Tue Apr 16 21:52:47 2019
@@ -460,6 +460,12 @@ FunctionPass *createLoopDistributePass()
 
 //===----------------------------------------------------------------------===//
 //
+// LoopFuse - Fuse loops.
+//
+FunctionPass *createLoopFusePass();
+
+//===----------------------------------------------------------------------===//
+//
 // LoopLoadElimination - Perform loop-aware load elimination.
 //
 FunctionPass *createLoopLoadEliminationPass();

Added: llvm/trunk/include/llvm/Transforms/Scalar/LoopFuse.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopFuse.h?rev=358552&view=auto
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Scalar/LoopFuse.h (added)
+++ llvm/trunk/include/llvm/Transforms/Scalar/LoopFuse.h Tue Apr 16 21:52:47 2019
@@ -0,0 +1,30 @@
+//===- LoopFuse.h - Loop Fusion Pass ----------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file implements the Loop Fusion pass.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_SCALAR_LOOPFUSE_H
+#define LLVM_TRANSFORMS_SCALAR_LOOPFUSE_H
+
+#include "llvm/IR/PassManager.h"
+
+namespace llvm {
+
+class Function;
+
+class LoopFusePass : public PassInfoMixin<LoopFusePass> {
+public:
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+};
+
+} // end namespace llvm
+
+#endif // LLVM_TRANSFORMS_SCALAR_LOOPFUSE_H

Modified: llvm/trunk/lib/Passes/PassBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/lib/Passes/PassBuilder.cpp (original)
+++ llvm/trunk/lib/Passes/PassBuilder.cpp Tue Apr 16 21:52:47 2019
@@ -122,6 +122,7 @@
 #include "llvm/Transforms/Scalar/LoopDataPrefetch.h"
 #include "llvm/Transforms/Scalar/LoopDeletion.h"
 #include "llvm/Transforms/Scalar/LoopDistribute.h"
+#include "llvm/Transforms/Scalar/LoopFuse.h"
 #include "llvm/Transforms/Scalar/LoopIdiomRecognize.h"
 #include "llvm/Transforms/Scalar/LoopInstSimplify.h"
 #include "llvm/Transforms/Scalar/LoopLoadElimination.h"

Modified: llvm/trunk/lib/Passes/PassRegistry.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassRegistry.def?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/lib/Passes/PassRegistry.def (original)
+++ llvm/trunk/lib/Passes/PassRegistry.def Tue Apr 16 21:52:47 2019
@@ -197,6 +197,7 @@ FUNCTION_PASS("partially-inline-libcalls
 FUNCTION_PASS("lcssa", LCSSAPass())
 FUNCTION_PASS("loop-data-prefetch", LoopDataPrefetchPass())
 FUNCTION_PASS("loop-load-elim", LoopLoadEliminationPass())
+FUNCTION_PASS("loop-fuse", LoopFusePass())
 FUNCTION_PASS("loop-distribute", LoopDistributePass())
 FUNCTION_PASS("loop-vectorize", LoopVectorizePass())
 FUNCTION_PASS("pgo-memop-opt", PGOMemOPSizeOpt())

Modified: llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt (original)
+++ llvm/trunk/lib/Transforms/Scalar/CMakeLists.txt Tue Apr 16 21:52:47 2019
@@ -28,6 +28,7 @@ add_llvm_library(LLVMScalarOpts
   LoopDeletion.cpp
   LoopDataPrefetch.cpp
   LoopDistribute.cpp
+  LoopFuse.cpp
   LoopIdiomRecognize.cpp
   LoopInstSimplify.cpp
   LoopInterchange.cpp

Added: llvm/trunk/lib/Transforms/Scalar/LoopFuse.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopFuse.cpp?rev=358552&view=auto
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopFuse.cpp (added)
+++ llvm/trunk/lib/Transforms/Scalar/LoopFuse.cpp Tue Apr 16 21:52:47 2019
@@ -0,0 +1,1212 @@
+//===- LoopFuse.cpp - Loop Fusion Pass ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file implements the loop fusion pass.
+/// The implementation is largely based on the following document:
+///
+///       Code Transformations to Augment the Scope of Loop Fusion in a
+///         Production Compiler
+///       Christopher Mark Barton
+///       MSc Thesis
+///       https://webdocs.cs.ualberta.ca/~amaral/thesis/ChristopherBartonMSc.pdf
+///
+/// The general approach taken is to collect sets of control flow equivalent
+/// loops and test whether they can be fused. The necessary conditions for
+/// fusion are:
+///    1. The loops must be adjacent (there cannot be any statements between
+///       the two loops).
+///    2. The loops must be conforming (they must execute the same number of
+///       iterations).
+///    3. The loops must be control flow equivalent (if one loop executes, the
+///       other is guaranteed to execute).
+///    4. There cannot be any negative distance dependencies between the loops.
+/// If all of these conditions are satisfied, it is safe to fuse the loops.
+///
+/// This implementation creates FusionCandidates that represent the loop and the
+/// necessary information needed by fusion. It then operates on the fusion
+/// candidates, first confirming that the candidate is eligible for fusion. The
+/// candidates are then collected into control flow equivalent sets, sorted in
+/// dominance order. Each set of control flow equivalent candidates is then
+/// traversed, attempting to fuse pairs of candidates in the set. If all
+/// requirements for fusion are met, the two candidates are fused, creating a
+/// new (fused) candidate which is then added back into the set to consider for
+/// additional fusion.
+///
+/// This implementation currently does not make any modifications to remove
+/// conditions for fusion. Code transformations to make loops conform to each of
+/// the conditions for fusion are discussed in more detail in the document
+/// above. These can be added to the current implementation in the future.
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Scalar/LoopFuse.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Analysis/DependenceAnalysis.h"
+#include "llvm/Analysis/DomTreeUpdater.h"
+#include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Analysis/OptimizationRemarkEmitter.h"
+#include "llvm/Analysis/PostDominators.h"
+#include "llvm/Analysis/ScalarEvolution.h"
+#include "llvm/Analysis/ScalarEvolutionExpressions.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Verifier.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/Transforms/Scalar.h"
+#include "llvm/Transforms/Utils.h"
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "loop-fusion"
+
+STATISTIC(FuseCounter, "Count number of loop fusions performed");
+STATISTIC(NumFusionCandidates, "Number of candidates for loop fusion");
+STATISTIC(InvalidPreheader, "Loop has invalid preheader");
+STATISTIC(InvalidHeader, "Loop has invalid header");
+STATISTIC(InvalidExitingBlock, "Loop has invalid exiting blocks");
+STATISTIC(InvalidExitBlock, "Loop has invalid exit block");
+STATISTIC(InvalidLatch, "Loop has invalid latch");
+STATISTIC(InvalidLoop, "Loop is invalid");
+STATISTIC(AddressTakenBB, "Basic block has address taken");
+STATISTIC(MayThrowException, "Loop may throw an exception");
+STATISTIC(ContainsVolatileAccess, "Loop contains a volatile access");
+STATISTIC(NotSimplifiedForm, "Loop is not in simplified form");
+STATISTIC(InvalidDependencies, "Dependencies prevent fusion");
+STATISTIC(InvalidTripCount,
+          "Loop does not have invariant backedge taken count");
+STATISTIC(UncomputableTripCount, "SCEV cannot compute trip count of loop");
+STATISTIC(NonEqualTripCount, "Candidate trip counts are not the same");
+STATISTIC(NonAdjacent, "Candidates are not adjacent");
+STATISTIC(NonEmptyPreheader, "Candidate has a non-empty preheader");
+
+enum FusionDependenceAnalysisChoice {
+  FUSION_DEPENDENCE_ANALYSIS_SCEV,
+  FUSION_DEPENDENCE_ANALYSIS_DA,
+  FUSION_DEPENDENCE_ANALYSIS_ALL,
+};
+
+static cl::opt<FusionDependenceAnalysisChoice> FusionDependenceAnalysis(
+    "loop-fusion-dependence-analysis",
+    cl::desc("Which dependence analysis should loop fusion use?"),
+    cl::values(clEnumValN(FUSION_DEPENDENCE_ANALYSIS_SCEV, "scev",
+                          "Use the scalar evolution interface"),
+               clEnumValN(FUSION_DEPENDENCE_ANALYSIS_DA, "da",
+                          "Use the dependence analysis interface"),
+               clEnumValN(FUSION_DEPENDENCE_ANALYSIS_ALL, "all",
+                          "Use all available analyses")),
+    cl::Hidden, cl::init(FUSION_DEPENDENCE_ANALYSIS_ALL), cl::ZeroOrMore);
+
+#ifndef NDEBUG
+static cl::opt<bool>
+    VerboseFusionDebugging("loop-fusion-verbose-debug",
+                           cl::desc("Enable verbose debugging for Loop Fusion"),
+                           cl::Hidden, cl::init(false), cl::ZeroOrMore);
+#endif
+
+/// This class is used to represent a candidate for loop fusion. When it is
+/// constructed, it checks the conditions for loop fusion to ensure that it
+/// represents a valid candidate. It caches several parts of a loop that are
+/// used throughout loop fusion (e.g., loop preheader, loop header, etc) instead
+/// of continually querying the underlying Loop to retrieve these values. It is
+/// assumed these will not change throughout loop fusion.
+///
+/// The invalidate method should be used to indicate that the FusionCandidate is
+/// no longer a valid candidate for fusion. Similarly, the isValid() method can
+/// be used to ensure that the FusionCandidate is still valid for fusion.
+struct FusionCandidate {
+  /// Cache of parts of the loop used throughout loop fusion. These should not
+  /// need to change throughout the analysis and transformation.
+  /// These parts are cached to avoid repeatedly looking up in the Loop class.
+
+  /// Preheader of the loop this candidate represents
+  BasicBlock *Preheader;
+  /// Header of the loop this candidate represents
+  BasicBlock *Header;
+  /// Blocks in the loop that exit the loop
+  BasicBlock *ExitingBlock;
+  /// The successor block of this loop (where the exiting blocks go to)
+  BasicBlock *ExitBlock;
+  /// Latch of the loop
+  BasicBlock *Latch;
+  /// The loop that this fusion candidate represents
+  Loop *L;
+  /// Vector of instructions in this loop that read from memory
+  SmallVector<Instruction *, 16> MemReads;
+  /// Vector of instructions in this loop that write to memory
+  SmallVector<Instruction *, 16> MemWrites;
+  /// Are all of the members of this fusion candidate still valid
+  bool Valid;
+
+  /// Dominator and PostDominator trees are needed for the
+  /// FusionCandidateCompare function, required by FusionCandidateSet to
+  /// determine where the FusionCandidate should be inserted into the set. These
+  /// are used to establish ordering of the FusionCandidates based on dominance.
+  const DominatorTree *DT;
+  const PostDominatorTree *PDT;
+
+  FusionCandidate(Loop *L, const DominatorTree *DT,
+                  const PostDominatorTree *PDT)
+      : Preheader(L->getLoopPreheader()), Header(L->getHeader()),
+        ExitingBlock(L->getExitingBlock()), ExitBlock(L->getExitBlock()),
+        Latch(L->getLoopLatch()), L(L), Valid(true), DT(DT), PDT(PDT) {
+
+    // Walk over all blocks in the loop and check for conditions that may
+    // prevent fusion. For each block, walk over all instructions and collect
+    // the memory reads and writes If any instructions that prevent fusion are
+    // found, invalidate this object and return.
+    for (BasicBlock *BB : L->blocks()) {
+      if (BB->hasAddressTaken()) {
+        AddressTakenBB++;
+        invalidate();
+        return;
+      }
+
+      for (Instruction &I : *BB) {
+        if (I.mayThrow()) {
+          MayThrowException++;
+          invalidate();
+          return;
+        }
+        if (StoreInst *SI = dyn_cast<StoreInst>(&I)) {
+          if (SI->isVolatile()) {
+            ContainsVolatileAccess++;
+            invalidate();
+            return;
+          }
+        }
+        if (LoadInst *LI = dyn_cast<LoadInst>(&I)) {
+          if (LI->isVolatile()) {
+            ContainsVolatileAccess++;
+            invalidate();
+            return;
+          }
+        }
+        if (I.mayWriteToMemory())
+          MemWrites.push_back(&I);
+        if (I.mayReadFromMemory())
+          MemReads.push_back(&I);
+      }
+    }
+  }
+
+  /// Check if all members of the class are valid.
+  bool isValid() const {
+    return Preheader && Header && ExitingBlock && ExitBlock && Latch && L &&
+           !L->isInvalid() && Valid;
+  }
+
+  /// Verify that all members are in sync with the Loop object.
+  void verify() const {
+    assert(isValid() && "Candidate is not valid!!");
+    assert(!L->isInvalid() && "Loop is invalid!");
+    assert(Preheader == L->getLoopPreheader() && "Preheader is out of sync");
+    assert(Header == L->getHeader() && "Header is out of sync");
+    assert(ExitingBlock == L->getExitingBlock() &&
+           "Exiting Blocks is out of sync");
+    assert(ExitBlock == L->getExitBlock() && "Exit block is out of sync");
+    assert(Latch == L->getLoopLatch() && "Latch is out of sync");
+  }
+
+#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
+  LLVM_DUMP_METHOD void dump() const {
+    dbgs() << "\tPreheader: " << (Preheader ? Preheader->getName() : "nullptr")
+           << "\n"
+           << "\tHeader: " << (Header ? Header->getName() : "nullptr") << "\n"
+           << "\tExitingBB: "
+           << (ExitingBlock ? ExitingBlock->getName() : "nullptr") << "\n"
+           << "\tExitBB: " << (ExitBlock ? ExitBlock->getName() : "nullptr")
+           << "\n"
+           << "\tLatch: " << (Latch ? Latch->getName() : "nullptr") << "\n";
+  }
+#endif
+
+private:
+  // This is only used internally for now, to clear the MemWrites and MemReads
+  // list and setting Valid to false. I can't envision other uses of this right
+  // now, since once FusionCandidates are put into the FusionCandidateSet they
+  // are immutable. Thus, any time we need to change/update a FusionCandidate,
+  // we must create a new one and insert it into the FusionCandidateSet to
+  // ensure the FusionCandidateSet remains ordered correctly.
+  void invalidate() {
+    MemWrites.clear();
+    MemReads.clear();
+    Valid = false;
+  }
+};
+
+inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
+                                     const FusionCandidate &FC) {
+  if (FC.isValid())
+    OS << FC.Preheader->getName();
+  else
+    OS << "<Invalid>";
+
+  return OS;
+}
+
+struct FusionCandidateCompare {
+  /// Comparison functor to sort two Control Flow Equivalent fusion candidates
+  /// into dominance order.
+  /// If LHS dominates RHS and RHS post-dominates LHS, return true;
+  /// IF RHS dominates LHS and LHS post-dominates RHS, return false;
+  bool operator()(const FusionCandidate &LHS,
+                  const FusionCandidate &RHS) const {
+    const DominatorTree *DT = LHS.DT;
+    const PostDominatorTree *PDT = LHS.PDT;
+
+    assert(DT && PDT && "Expecting valid dominator tree");
+
+    if (DT->dominates(LHS.Preheader, RHS.Preheader)) {
+      // Verify RHS Postdominates LHS
+      assert(PDT->dominates(RHS.Preheader, LHS.Preheader));
+      return true;
+    }
+
+    if (DT->dominates(RHS.Preheader, LHS.Preheader)) {
+      // RHS dominates LHS
+      // Verify LHS post-dominates RHS
+      assert(PDT->dominates(LHS.Preheader, RHS.Preheader));
+      return false;
+    }
+    // If LHS does not dominate RHS and RHS does not dominate LHS then there is
+    // no dominance relationship between the two FusionCandidates. Thus, they
+    // should not be in the same set together.
+    llvm_unreachable(
+        "No dominance relationship between these fusion candidates!");
+  }
+};
+
+namespace {
+using LoopVector = SmallVector<Loop *, 4>;
+
+// Set of Control Flow Equivalent (CFE) Fusion Candidates, sorted in dominance
+// order. Thus, if FC0 comes *before* FC1 in a FusionCandidateSet, then FC0
+// dominates FC1 and FC1 post-dominates FC0.
+// std::set was chosen because we want a sorted data structure with stable
+// iterators. A subsequent patch to loop fusion will enable fusing non-ajdacent
+// loops by moving intervening code around. When this intervening code contains
+// loops, those loops will be moved also. The corresponding FusionCandidates
+// will also need to be moved accordingly. As this is done, having stable
+// iterators will simplify the logic. Similarly, having an efficient insert that
+// keeps the FusionCandidateSet sorted will also simplify the implementation.
+using FusionCandidateSet = std::set<FusionCandidate, FusionCandidateCompare>;
+using FusionCandidateCollection = SmallVector<FusionCandidateSet, 4>;
+} // namespace
+
+inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
+                                     const FusionCandidateSet &CandSet) {
+  for (auto IT : CandSet)
+    OS << IT << "\n";
+
+  return OS;
+}
+
+static void
+printFusionCandidates(const FusionCandidateCollection &FusionCandidates) {
+  LLVM_DEBUG(dbgs() << "Fusion Candidates: \n");
+  for (const auto &CandidateSet : FusionCandidates) {
+    LLVM_DEBUG({
+      dbgs() << "*** Fusion Candidate Set ***\n";
+      dbgs() << CandidateSet;
+      dbgs() << "****************************\n";
+    });
+  }
+}
+
+/// Collect all loops in function at the same nest level, starting at the
+/// outermost level.
+///
+/// This data structure collects all loops at the same nest level for a
+/// given function (specified by the LoopInfo object). It starts at the
+/// outermost level.
+struct LoopDepthTree {
+  using LoopsOnLevelTy = SmallVector<LoopVector, 4>;
+  using iterator = LoopsOnLevelTy::iterator;
+  using const_iterator = LoopsOnLevelTy::const_iterator;
+
+  LoopDepthTree(LoopInfo &LI) : Depth(1) {
+    if (!LI.empty())
+      LoopsOnLevel.emplace_back(LoopVector(LI.rbegin(), LI.rend()));
+  }
+
+  /// Test whether a given loop has been removed from the function, and thus is
+  /// no longer valid.
+  bool isRemovedLoop(const Loop *L) const { return RemovedLoops.count(L); }
+
+  /// Record that a given loop has been removed from the function and is no
+  /// longer valid.
+  void removeLoop(const Loop *L) { RemovedLoops.insert(L); }
+
+  /// Descend the tree to the next (inner) nesting level
+  void descend() {
+    LoopsOnLevelTy LoopsOnNextLevel;
+
+    for (const LoopVector &LV : *this)
+      for (Loop *L : LV)
+        if (!isRemovedLoop(L) && L->begin() != L->end())
+          LoopsOnNextLevel.emplace_back(LoopVector(L->begin(), L->end()));
+
+    LoopsOnLevel = LoopsOnNextLevel;
+    RemovedLoops.clear();
+    Depth++;
+  }
+
+  bool empty() const { return size() == 0; }
+  size_t size() const { return LoopsOnLevel.size() - RemovedLoops.size(); }
+  unsigned getDepth() const { return Depth; }
+
+  iterator begin() { return LoopsOnLevel.begin(); }
+  iterator end() { return LoopsOnLevel.end(); }
+  const_iterator begin() const { return LoopsOnLevel.begin(); }
+  const_iterator end() const { return LoopsOnLevel.end(); }
+
+private:
+  /// Set of loops that have been removed from the function and are no longer
+  /// valid.
+  SmallPtrSet<const Loop *, 8> RemovedLoops;
+
+  /// Depth of the current level, starting at 1 (outermost loops).
+  unsigned Depth;
+
+  /// Vector of loops at the current depth level that have the same parent loop
+  LoopsOnLevelTy LoopsOnLevel;
+};
+
+#ifndef NDEBUG
+static void printLoopVector(const LoopVector &LV) {
+  dbgs() << "****************************\n";
+  for (auto L : LV)
+    printLoop(*L, dbgs());
+  dbgs() << "****************************\n";
+}
+#endif
+
+static void reportLoopFusion(const FusionCandidate &FC0,
+                             const FusionCandidate &FC1,
+                             OptimizationRemarkEmitter &ORE) {
+  using namespace ore;
+  ORE.emit(
+      OptimizationRemark(DEBUG_TYPE, "LoopFusion", FC0.Preheader->getParent())
+      << "Fused " << NV("Cand1", StringRef(FC0.Preheader->getName()))
+      << " with " << NV("Cand2", StringRef(FC1.Preheader->getName())));
+}
+
+struct LoopFuser {
+private:
+  // Sets of control flow equivalent fusion candidates for a given nest level.
+  FusionCandidateCollection FusionCandidates;
+
+  LoopDepthTree LDT;
+  DomTreeUpdater DTU;
+
+  LoopInfo &LI;
+  DominatorTree &DT;
+  DependenceInfo &DI;
+  ScalarEvolution &SE;
+  PostDominatorTree &PDT;
+  OptimizationRemarkEmitter &ORE;
+
+public:
+  LoopFuser(LoopInfo &LI, DominatorTree &DT, DependenceInfo &DI,
+            ScalarEvolution &SE, PostDominatorTree &PDT,
+            OptimizationRemarkEmitter &ORE, const DataLayout &DL)
+      : LDT(LI), DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Lazy), LI(LI),
+        DT(DT), DI(DI), SE(SE), PDT(PDT), ORE(ORE) {}
+
+  /// This is the main entry point for loop fusion. It will traverse the
+  /// specified function and collect candidate loops to fuse, starting at the
+  /// outermost nesting level and working inwards.
+  bool fuseLoops(Function &F) {
+#ifndef NDEBUG
+    if (VerboseFusionDebugging) {
+      LI.print(dbgs());
+    }
+#endif
+
+    LLVM_DEBUG(dbgs() << "Performing Loop Fusion on function " << F.getName()
+                      << "\n");
+    bool Changed = false;
+
+    while (!LDT.empty()) {
+      LLVM_DEBUG(dbgs() << "Got " << LDT.size() << " loop sets for depth "
+                        << LDT.getDepth() << "\n";);
+
+      for (const LoopVector &LV : LDT) {
+        assert(LV.size() > 0 && "Empty loop set was build!");
+
+        // Skip singleton loop sets as they do not offer fusion opportunities on
+        // this level.
+        if (LV.size() == 1)
+          continue;
+#ifndef NDEBUG
+        if (VerboseFusionDebugging) {
+          LLVM_DEBUG({
+            dbgs() << "  Visit loop set (#" << LV.size() << "):\n";
+            printLoopVector(LV);
+          });
+        }
+#endif
+
+        collectFusionCandidates(LV);
+        Changed |= fuseCandidates();
+      }
+
+      // Finished analyzing candidates at this level.
+      // Descend to the next level and clear all of the candidates currently
+      // collected. Note that it will not be possible to fuse any of the
+      // existing candidates with new candidates because the new candidates will
+      // be at a different nest level and thus not be control flow equivalent
+      // with all of the candidates collected so far.
+      LLVM_DEBUG(dbgs() << "Descend one level!\n");
+      LDT.descend();
+      FusionCandidates.clear();
+    }
+
+    if (Changed)
+      LLVM_DEBUG(dbgs() << "Function after Loop Fusion: \n"; F.dump(););
+
+#ifndef NDEBUG
+    assert(DT.verify());
+    assert(PDT.verify());
+    LI.verify(DT);
+    SE.verify();
+#endif
+
+    LLVM_DEBUG(dbgs() << "Loop Fusion complete\n");
+    return Changed;
+  }
+
+private:
+  /// Determine if two fusion candidates are control flow equivalent.
+  ///
+  /// Two fusion candidates are control flow equivalent if when one executes,
+  /// the other is guaranteed to execute. This is determined using dominators
+  /// and post-dominators: if A dominates B and B post-dominates A then A and B
+  /// are control-flow equivalent.
+  bool isControlFlowEquivalent(const FusionCandidate &FC0,
+                               const FusionCandidate &FC1) const {
+    assert(FC0.Preheader && FC1.Preheader && "Expecting valid preheaders");
+
+    if (DT.dominates(FC0.Preheader, FC1.Preheader))
+      return PDT.dominates(FC1.Preheader, FC0.Preheader);
+
+    if (DT.dominates(FC1.Preheader, FC0.Preheader))
+      return PDT.dominates(FC0.Preheader, FC1.Preheader);
+
+    return false;
+  }
+
+  /// Determine if a fusion candidate (representing a loop) is eligible for
+  /// fusion. Note that this only checks whether a single loop can be fused - it
+  /// does not check whether it is *legal* to fuse two loops together.
+  bool eligibleForFusion(const FusionCandidate &FC) const {
+    if (!FC.isValid()) {
+      LLVM_DEBUG(dbgs() << "FC " << FC << " has invalid CFG requirements!\n");
+      if (!FC.Preheader)
+        InvalidPreheader++;
+      if (!FC.Header)
+        InvalidHeader++;
+      if (!FC.ExitingBlock)
+        InvalidExitingBlock++;
+      if (!FC.ExitBlock)
+        InvalidExitBlock++;
+      if (!FC.Latch)
+        InvalidLatch++;
+      if (FC.L->isInvalid())
+        InvalidLoop++;
+
+      return false;
+    }
+
+    // Require ScalarEvolution to be able to determine a trip count.
+    if (!SE.hasLoopInvariantBackedgeTakenCount(FC.L)) {
+      LLVM_DEBUG(dbgs() << "Loop " << FC.L->getName()
+                        << " trip count not computable!\n");
+      InvalidTripCount++;
+      return false;
+    }
+
+    if (!FC.L->isLoopSimplifyForm()) {
+      LLVM_DEBUG(dbgs() << "Loop " << FC.L->getName()
+                        << " is not in simplified form!\n");
+      NotSimplifiedForm++;
+      return false;
+    }
+
+    return true;
+  }
+
+  /// Iterate over all loops in the given loop set and identify the loops that
+  /// are eligible for fusion. Place all eligible fusion candidates into Control
+  /// Flow Equivalent sets, sorted by dominance.
+  void collectFusionCandidates(const LoopVector &LV) {
+    for (Loop *L : LV) {
+      FusionCandidate CurrCand(L, &DT, &PDT);
+      if (!eligibleForFusion(CurrCand))
+        continue;
+
+      // Go through each list in FusionCandidates and determine if L is control
+      // flow equivalent with the first loop in that list. If it is, append LV.
+      // If not, go to the next list.
+      // If no suitable list is found, start another list and add it to
+      // FusionCandidates.
+      bool FoundSet = false;
+
+      for (auto &CurrCandSet : FusionCandidates) {
+        if (isControlFlowEquivalent(*CurrCandSet.begin(), CurrCand)) {
+          CurrCandSet.insert(CurrCand);
+          FoundSet = true;
+#ifndef NDEBUG
+          if (VerboseFusionDebugging)
+            LLVM_DEBUG(dbgs() << "Adding " << CurrCand
+                              << " to existing candidate set\n");
+#endif
+          break;
+        }
+      }
+      if (!FoundSet) {
+        // No set was found. Create a new set and add to FusionCandidates
+#ifndef NDEBUG
+        if (VerboseFusionDebugging)
+          LLVM_DEBUG(dbgs() << "Adding " << CurrCand << " to new set\n");
+#endif
+        FusionCandidateSet NewCandSet;
+        NewCandSet.insert(CurrCand);
+        FusionCandidates.push_back(NewCandSet);
+      }
+      NumFusionCandidates++;
+    }
+  }
+
+  /// Determine if it is beneficial to fuse two loops.
+  ///
+  /// For now, this method simply returns true because we want to fuse as much
+  /// as possible (primarily to test the pass). This method will evolve, over
+  /// time, to add heuristics for profitability of fusion.
+  bool isBeneficialFusion(const FusionCandidate &FC0,
+                          const FusionCandidate &FC1) {
+    return true;
+  }
+
+  /// Determine if two fusion candidates have the same trip count (i.e., they
+  /// execute the same number of iterations).
+  ///
+  /// Note that for now this method simply returns a boolean value because there
+  /// are no mechanisms in loop fusion to handle different trip counts. In the
+  /// future, this behaviour can be extended to adjust one of the loops to make
+  /// the trip counts equal (e.g., loop peeling). When this is added, this
+  /// interface may need to change to return more information than just a
+  /// boolean value.
+  bool identicalTripCounts(const FusionCandidate &FC0,
+                           const FusionCandidate &FC1) const {
+    const SCEV *TripCount0 = SE.getBackedgeTakenCount(FC0.L);
+    if (isa<SCEVCouldNotCompute>(TripCount0)) {
+      UncomputableTripCount++;
+      LLVM_DEBUG(dbgs() << "Trip count of first loop could not be computed!");
+      return false;
+    }
+
+    const SCEV *TripCount1 = SE.getBackedgeTakenCount(FC1.L);
+    if (isa<SCEVCouldNotCompute>(TripCount1)) {
+      UncomputableTripCount++;
+      LLVM_DEBUG(dbgs() << "Trip count of second loop could not be computed!");
+      return false;
+    }
+    LLVM_DEBUG(dbgs() << "\tTrip counts: " << *TripCount0 << " & "
+                      << *TripCount1 << " are "
+                      << (TripCount0 == TripCount1 ? "identical" : "different")
+                      << "\n");
+
+    return (TripCount0 == TripCount1);
+  }
+
+  /// Walk each set of control flow equivalent fusion candidates and attempt to
+  /// fuse them. This does a single linear traversal of all candidates in the
+  /// set. The conditions for legal fusion are checked at this point. If a pair
+  /// of fusion candidates passes all legality checks, they are fused together
+  /// and a new fusion candidate is created and added to the FusionCandidateSet.
+  /// The original fusion candidates are then removed, as they are no longer
+  /// valid.
+  bool fuseCandidates() {
+    bool Fused = false;
+    LLVM_DEBUG(printFusionCandidates(FusionCandidates));
+    for (auto &CandidateSet : FusionCandidates) {
+      if (CandidateSet.size() < 2)
+        continue;
+
+      LLVM_DEBUG(dbgs() << "Attempting fusion on Candidate Set:\n"
+                        << CandidateSet << "\n");
+
+      for (auto FC0 = CandidateSet.begin(); FC0 != CandidateSet.end(); ++FC0) {
+        assert(!LDT.isRemovedLoop(FC0->L) &&
+               "Should not have removed loops in CandidateSet!");
+        auto FC1 = FC0;
+        for (++FC1; FC1 != CandidateSet.end(); ++FC1) {
+          assert(!LDT.isRemovedLoop(FC1->L) &&
+                 "Should not have removed loops in CandidateSet!");
+
+          LLVM_DEBUG(dbgs() << "Attempting to fuse candidate \n"; FC0->dump();
+                     dbgs() << " with\n"; FC1->dump(); dbgs() << "\n");
+
+          FC0->verify();
+          FC1->verify();
+
+          if (!identicalTripCounts(*FC0, *FC1)) {
+            LLVM_DEBUG(dbgs() << "Fusion candidates do not have identical trip "
+                                 "counts. Not fusing.\n");
+            NonEqualTripCount++;
+            continue;
+          }
+
+          if (!isAdjacent(*FC0, *FC1)) {
+            LLVM_DEBUG(dbgs()
+                       << "Fusion candidates are not adjacent. Not fusing.\n");
+            NonAdjacent++;
+            continue;
+          }
+
+          // For now we skip fusing if the second candidate has any instructions
+          // in the preheader. This is done because we currently do not have the
+          // safety checks to determine if it is save to move the preheader of
+          // the second candidate past the body of the first candidate. Once
+          // these checks are added, this condition can be removed.
+          if (!isEmptyPreheader(*FC1)) {
+            LLVM_DEBUG(dbgs() << "Fusion candidate does not have empty "
+                                 "preheader. Not fusing.\n");
+            NonEmptyPreheader++;
+            continue;
+          }
+
+          if (!dependencesAllowFusion(*FC0, *FC1)) {
+            LLVM_DEBUG(dbgs() << "Memory dependencies do not allow fusion!\n");
+            continue;
+          }
+
+          bool BeneficialToFuse = isBeneficialFusion(*FC0, *FC1);
+          LLVM_DEBUG(dbgs()
+                     << "\tFusion appears to be "
+                     << (BeneficialToFuse ? "" : "un") << "profitable!\n");
+          if (!BeneficialToFuse)
+            continue;
+
+          // All analysis has completed and has determined that fusion is legal
+          // and profitable. At this point, start transforming the code and
+          // perform fusion.
+
+          LLVM_DEBUG(dbgs() << "\tFusion is performed: " << *FC0 << " and "
+                            << *FC1 << "\n");
+
+          // Report fusion to the Optimization Remarks.
+          // Note this needs to be done *before* performFusion because
+          // performFusion will change the original loops, making it not
+          // possible to identify them after fusion is complete.
+          reportLoopFusion(*FC0, *FC1, ORE);
+
+          FusionCandidate FusedCand(performFusion(*FC0, *FC1), &DT, &PDT);
+          FusedCand.verify();
+          assert(eligibleForFusion(FusedCand) &&
+                 "Fused candidate should be eligible for fusion!");
+
+          // Notify the loop-depth-tree that these loops are not valid objects
+          // anymore.
+          LDT.removeLoop(FC1->L);
+
+          CandidateSet.erase(FC0);
+          CandidateSet.erase(FC1);
+
+          auto InsertPos = CandidateSet.insert(FusedCand);
+
+          assert(InsertPos.second &&
+                 "Unable to insert TargetCandidate in CandidateSet!");
+
+          // Reset FC0 and FC1 the new (fused) candidate. Subsequent iterations
+          // of the FC1 loop will attempt to fuse the new (fused) loop with the
+          // remaining candidates in the current candidate set.
+          FC0 = FC1 = InsertPos.first;
+
+          LLVM_DEBUG(dbgs() << "Candidate Set (after fusion): " << CandidateSet
+                            << "\n");
+
+          Fused = true;
+        }
+      }
+    }
+    return Fused;
+  }
+
+  /// Rewrite all additive recurrences in a SCEV to use a new loop.
+  class AddRecLoopReplacer : public SCEVRewriteVisitor<AddRecLoopReplacer> {
+  public:
+    AddRecLoopReplacer(ScalarEvolution &SE, const Loop &OldL, const Loop &NewL,
+                       bool UseMax = true)
+        : SCEVRewriteVisitor(SE), Valid(true), UseMax(UseMax), OldL(OldL),
+          NewL(NewL) {}
+
+    const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) {
+      const Loop *ExprL = Expr->getLoop();
+      SmallVector<const SCEV *, 2> Operands;
+      if (ExprL == &OldL) {
+        Operands.append(Expr->op_begin(), Expr->op_end());
+        return SE.getAddRecExpr(Operands, &NewL, Expr->getNoWrapFlags());
+      }
+
+      if (OldL.contains(ExprL)) {
+        bool Pos = SE.isKnownPositive(Expr->getStepRecurrence(SE));
+        if (!UseMax || !Pos || !Expr->isAffine()) {
+          Valid = false;
+          return Expr;
+        }
+        return visit(Expr->getStart());
+      }
+
+      for (const SCEV *Op : Expr->operands())
+        Operands.push_back(visit(Op));
+      return SE.getAddRecExpr(Operands, ExprL, Expr->getNoWrapFlags());
+    }
+
+    bool wasValidSCEV() const { return Valid; }
+
+  private:
+    bool Valid, UseMax;
+    const Loop &OldL, &NewL;
+  };
+
+  /// Return false if the access functions of \p I0 and \p I1 could cause
+  /// a negative dependence.
+  bool accessDiffIsPositive(const Loop &L0, const Loop &L1, Instruction &I0,
+                            Instruction &I1, bool EqualIsInvalid) {
+    Value *Ptr0 = getLoadStorePointerOperand(&I0);
+    Value *Ptr1 = getLoadStorePointerOperand(&I1);
+    if (!Ptr0 || !Ptr1)
+      return false;
+
+    const SCEV *SCEVPtr0 = SE.getSCEVAtScope(Ptr0, &L0);
+    const SCEV *SCEVPtr1 = SE.getSCEVAtScope(Ptr1, &L1);
+#ifndef NDEBUG
+    if (VerboseFusionDebugging)
+      LLVM_DEBUG(dbgs() << "    Access function check: " << *SCEVPtr0 << " vs "
+                        << *SCEVPtr1 << "\n");
+#endif
+    AddRecLoopReplacer Rewriter(SE, L0, L1);
+    SCEVPtr0 = Rewriter.visit(SCEVPtr0);
+#ifndef NDEBUG
+    if (VerboseFusionDebugging)
+      LLVM_DEBUG(dbgs() << "    Access function after rewrite: " << *SCEVPtr0
+                        << " [Valid: " << Rewriter.wasValidSCEV() << "]\n");
+#endif
+    if (!Rewriter.wasValidSCEV())
+      return false;
+
+    // TODO: isKnownPredicate doesnt work well when one SCEV is loop carried (by
+    //       L0) and the other is not. We could check if it is monotone and test
+    //       the beginning and end value instead.
+
+    BasicBlock *L0Header = L0.getHeader();
+    auto HasNonLinearDominanceRelation = [&](const SCEV *S) {
+      const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(S);
+      if (!AddRec)
+        return false;
+      return !DT.dominates(L0Header, AddRec->getLoop()->getHeader()) &&
+             !DT.dominates(AddRec->getLoop()->getHeader(), L0Header);
+    };
+    if (SCEVExprContains(SCEVPtr1, HasNonLinearDominanceRelation))
+      return false;
+
+    ICmpInst::Predicate Pred =
+        EqualIsInvalid ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_SGE;
+    bool IsAlwaysGE = SE.isKnownPredicate(Pred, SCEVPtr0, SCEVPtr1);
+#ifndef NDEBUG
+    if (VerboseFusionDebugging)
+      LLVM_DEBUG(dbgs() << "    Relation: " << *SCEVPtr0
+                        << (IsAlwaysGE ? "  >=  " : "  may <  ") << *SCEVPtr1
+                        << "\n");
+#endif
+    return IsAlwaysGE;
+  }
+
+  /// Return true if the dependences between @p I0 (in @p L0) and @p I1 (in
+  /// @p L1) allow loop fusion of @p L0 and @p L1. The dependence analyses
+  /// specified by @p DepChoice are used to determine this.
+  bool dependencesAllowFusion(const FusionCandidate &FC0,
+                              const FusionCandidate &FC1, Instruction &I0,
+                              Instruction &I1, bool AnyDep,
+                              FusionDependenceAnalysisChoice DepChoice) {
+#ifndef NDEBUG
+    if (VerboseFusionDebugging) {
+      LLVM_DEBUG(dbgs() << "Check dep: " << I0 << " vs " << I1 << " : "
+                        << DepChoice << "\n");
+    }
+#endif
+    switch (DepChoice) {
+    case FUSION_DEPENDENCE_ANALYSIS_SCEV:
+      return accessDiffIsPositive(*FC0.L, *FC1.L, I0, I1, AnyDep);
+    case FUSION_DEPENDENCE_ANALYSIS_DA: {
+      auto DepResult = DI.depends(&I0, &I1, true);
+      if (!DepResult)
+        return true;
+#ifndef NDEBUG
+      if (VerboseFusionDebugging) {
+        LLVM_DEBUG(dbgs() << "DA res: "; DepResult->dump(dbgs());
+                   dbgs() << " [#l: " << DepResult->getLevels() << "][Ordered: "
+                          << (DepResult->isOrdered() ? "true" : "false")
+                          << "]\n");
+        LLVM_DEBUG(dbgs() << "DepResult Levels: " << DepResult->getLevels()
+                          << "\n");
+      }
+#endif
+
+      if (DepResult->getNextPredecessor() || DepResult->getNextSuccessor())
+        LLVM_DEBUG(
+            dbgs() << "TODO: Implement pred/succ dependence handling!\n");
+
+      // TODO: Can we actually use the dependence info analysis here?
+      return false;
+    }
+
+    case FUSION_DEPENDENCE_ANALYSIS_ALL:
+      return dependencesAllowFusion(FC0, FC1, I0, I1, AnyDep,
+                                    FUSION_DEPENDENCE_ANALYSIS_SCEV) ||
+             dependencesAllowFusion(FC0, FC1, I0, I1, AnyDep,
+                                    FUSION_DEPENDENCE_ANALYSIS_DA);
+    }
+
+    llvm_unreachable("Unknown fusion dependence analysis choice!");
+  }
+
+  /// Perform a dependence check and return if @p FC0 and @p FC1 can be fused.
+  bool dependencesAllowFusion(const FusionCandidate &FC0,
+                              const FusionCandidate &FC1) {
+    LLVM_DEBUG(dbgs() << "Check if " << FC0 << " can be fused with " << FC1
+                      << "\n");
+    assert(FC0.L->getLoopDepth() == FC1.L->getLoopDepth());
+    assert(DT.dominates(FC0.Preheader, FC1.Preheader));
+
+    for (Instruction *WriteL0 : FC0.MemWrites) {
+      for (Instruction *WriteL1 : FC1.MemWrites)
+        if (!dependencesAllowFusion(FC0, FC1, *WriteL0, *WriteL1,
+                                    /* AnyDep */ false,
+                                    FusionDependenceAnalysis)) {
+          InvalidDependencies++;
+          return false;
+        }
+      for (Instruction *ReadL1 : FC1.MemReads)
+        if (!dependencesAllowFusion(FC0, FC1, *WriteL0, *ReadL1,
+                                    /* AnyDep */ false,
+                                    FusionDependenceAnalysis)) {
+          InvalidDependencies++;
+          return false;
+        }
+    }
+
+    for (Instruction *WriteL1 : FC1.MemWrites) {
+      for (Instruction *WriteL0 : FC0.MemWrites)
+        if (!dependencesAllowFusion(FC0, FC1, *WriteL0, *WriteL1,
+                                    /* AnyDep */ false,
+                                    FusionDependenceAnalysis)) {
+          InvalidDependencies++;
+          return false;
+        }
+      for (Instruction *ReadL0 : FC0.MemReads)
+        if (!dependencesAllowFusion(FC0, FC1, *ReadL0, *WriteL1,
+                                    /* AnyDep */ false,
+                                    FusionDependenceAnalysis)) {
+          InvalidDependencies++;
+          return false;
+        }
+    }
+
+    // Walk through all uses in FC1. For each use, find the reaching def. If the
+    // def is located in FC0 then it is is not safe to fuse.
+    for (BasicBlock *BB : FC1.L->blocks())
+      for (Instruction &I : *BB)
+        for (auto &Op : I.operands())
+          if (Instruction *Def = dyn_cast<Instruction>(Op))
+            if (FC0.L->contains(Def->getParent())) {
+              InvalidDependencies++;
+              return false;
+            }
+
+    return true;
+  }
+
+  /// Determine if the exit block of \p FC0 is the preheader of \p FC1. In this
+  /// case, there is no code in between the two fusion candidates, thus making
+  /// them adjacent.
+  bool isAdjacent(const FusionCandidate &FC0,
+                  const FusionCandidate &FC1) const {
+    return FC0.ExitBlock == FC1.Preheader;
+  }
+
+  bool isEmptyPreheader(const FusionCandidate &FC) const {
+    return FC.Preheader->size() == 1;
+  }
+
+  /// Fuse two fusion candidates, creating a new fused loop.
+  ///
+  /// This method contains the mechanics of fusing two loops, represented by \p
+  /// FC0 and \p FC1. It is assumed that \p FC0 dominates \p FC1 and \p FC1
+  /// postdominates \p FC0 (making them control flow equivalent). It also
+  /// assumes that the other conditions for fusion have been met: adjacent,
+  /// identical trip counts, and no negative distance dependencies exist that
+  /// would prevent fusion. Thus, there is no checking for these conditions in
+  /// this method.
+  ///
+  /// Fusion is performed by rewiring the CFG to update successor blocks of the
+  /// components of tho loop. Specifically, the following changes are done:
+  ///
+  ///   1. The preheader of \p FC1 is removed as it is no longer necessary
+  ///   (because it is currently only a single statement block).
+  ///   2. The latch of \p FC0 is modified to jump to the header of \p FC1.
+  ///   3. The latch of \p FC1 i modified to jump to the header of \p FC0.
+  ///   4. All blocks from \p FC1 are removed from FC1 and added to FC0.
+  ///
+  /// All of these modifications are done with dominator tree updates, thus
+  /// keeping the dominator (and post dominator) information up-to-date.
+  ///
+  /// This can be improved in the future by actually merging blocks during
+  /// fusion. For example, the preheader of \p FC1 can be merged with the
+  /// preheader of \p FC0. This would allow loops with more than a single
+  /// statement in the preheader to be fused. Similarly, the latch blocks of the
+  /// two loops could also be fused into a single block. This will require
+  /// analysis to prove it is safe to move the contents of the block past
+  /// existing code, which currently has not been implemented.
+  Loop *performFusion(const FusionCandidate &FC0, const FusionCandidate &FC1) {
+    assert(FC0.isValid() && FC1.isValid() &&
+           "Expecting valid fusion candidates");
+
+    LLVM_DEBUG(dbgs() << "Fusion Candidate 0: \n"; FC0.dump();
+               dbgs() << "Fusion Candidate 1: \n"; FC1.dump(););
+
+    assert(FC1.Preheader == FC0.ExitBlock);
+    assert(FC1.Preheader->size() == 1 &&
+           FC1.Preheader->getSingleSuccessor() == FC1.Header);
+
+    // Remember the phi nodes originally in the header of FC0 in order to rewire
+    // them later. However, this is only necessary if the new loop carried
+    // values might not dominate the exiting branch. While we do not generally
+    // test if this is the case but simply insert intermediate phi nodes, we
+    // need to make sure these intermediate phi nodes have different
+    // predecessors. To this end, we filter the special case where the exiting
+    // block is the latch block of the first loop. Nothing needs to be done
+    // anyway as all loop carried values dominate the latch and thereby also the
+    // exiting branch.
+    SmallVector<PHINode *, 8> OriginalFC0PHIs;
+    if (FC0.ExitingBlock != FC0.Latch)
+      for (PHINode &PHI : FC0.Header->phis())
+        OriginalFC0PHIs.push_back(&PHI);
+
+    // Replace incoming blocks for header PHIs first.
+    FC1.Preheader->replaceSuccessorsPhiUsesWith(FC0.Preheader);
+    FC0.Latch->replaceSuccessorsPhiUsesWith(FC1.Latch);
+
+    // Then modify the control flow and update DT and PDT.
+    SmallVector<DominatorTree::UpdateType, 8> TreeUpdates;
+
+    // The old exiting block of the first loop (FC0) has to jump to the header
+    // of the second as we need to execute the code in the second header block
+    // regardless of the trip count. That is, if the trip count is 0, so the
+    // back edge is never taken, we still have to execute both loop headers,
+    // especially (but not only!) if the second is a do-while style loop.
+    // However, doing so might invalidate the phi nodes of the first loop as
+    // the new values do only need to dominate their latch and not the exiting
+    // predicate. To remedy this potential problem we always introduce phi
+    // nodes in the header of the second loop later that select the loop carried
+    // value, if the second header was reached through an old latch of the
+    // first, or undef otherwise. This is sound as exiting the first implies the
+    // second will exit too, __without__ taking the back-edge. [Their
+    // trip-counts are equal after all.
+    // KB: Would this sequence be simpler to just just make FC0.ExitingBlock go
+    // to FC1.Header? I think this is basically what the three sequences are
+    // trying to accomplish; however, doing this directly in the CFG may mean
+    // the DT/PDT becomes invalid
+    FC0.ExitingBlock->getTerminator()->replaceUsesOfWith(FC1.Preheader,
+                                                         FC1.Header);
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(
+        DominatorTree::Delete, FC0.ExitingBlock, FC1.Preheader));
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(
+        DominatorTree::Insert, FC0.ExitingBlock, FC1.Header));
+
+    // The pre-header of L1 is not necessary anymore.
+    assert(pred_begin(FC1.Preheader) == pred_end(FC1.Preheader));
+    FC1.Preheader->getTerminator()->eraseFromParent();
+    new UnreachableInst(FC1.Preheader->getContext(), FC1.Preheader);
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(
+        DominatorTree::Delete, FC1.Preheader, FC1.Header));
+
+    // Moves the phi nodes from the second to the first loops header block.
+    while (PHINode *PHI = dyn_cast<PHINode>(&FC1.Header->front())) {
+      if (SE.isSCEVable(PHI->getType()))
+        SE.forgetValue(PHI);
+      if (PHI->hasNUsesOrMore(1))
+        PHI->moveBefore(&*FC0.Header->getFirstInsertionPt());
+      else
+        PHI->eraseFromParent();
+    }
+
+    // Introduce new phi nodes in the second loop header to ensure
+    // exiting the first and jumping to the header of the second does not break
+    // the SSA property of the phis originally in the first loop. See also the
+    // comment above.
+    Instruction *L1HeaderIP = &FC1.Header->front();
+    for (PHINode *LCPHI : OriginalFC0PHIs) {
+      int L1LatchBBIdx = LCPHI->getBasicBlockIndex(FC1.Latch);
+      assert(L1LatchBBIdx >= 0 &&
+             "Expected loop carried value to be rewired at this point!");
+
+      Value *LCV = LCPHI->getIncomingValue(L1LatchBBIdx);
+
+      PHINode *L1HeaderPHI = PHINode::Create(
+          LCV->getType(), 2, LCPHI->getName() + ".afterFC0", L1HeaderIP);
+      L1HeaderPHI->addIncoming(LCV, FC0.Latch);
+      L1HeaderPHI->addIncoming(UndefValue::get(LCV->getType()),
+                               FC0.ExitingBlock);
+
+      LCPHI->setIncomingValue(L1LatchBBIdx, L1HeaderPHI);
+    }
+
+    // Replace latch terminator destinations.
+    FC0.Latch->getTerminator()->replaceUsesOfWith(FC0.Header, FC1.Header);
+    FC1.Latch->getTerminator()->replaceUsesOfWith(FC1.Header, FC0.Header);
+
+    // If FC0.Latch and FC0.ExitingBlock are the same then we have already
+    // performed the updates above.
+    if (FC0.Latch != FC0.ExitingBlock)
+      TreeUpdates.emplace_back(DominatorTree::UpdateType(
+          DominatorTree::Insert, FC0.Latch, FC1.Header));
+
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(DominatorTree::Delete,
+                                                       FC0.Latch, FC0.Header));
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(DominatorTree::Insert,
+                                                       FC1.Latch, FC0.Header));
+    TreeUpdates.emplace_back(DominatorTree::UpdateType(DominatorTree::Delete,
+                                                       FC1.Latch, FC1.Header));
+
+    // Update DT/PDT
+    DTU.applyUpdates(TreeUpdates);
+
+    LI.removeBlock(FC1.Preheader);
+    DTU.deleteBB(FC1.Preheader);
+    DTU.flush();
+
+    // Is there a way to keep SE up-to-date so we don't need to forget the loops
+    // and rebuild the information in subsequent passes of fusion?
+    SE.forgetLoop(FC1.L);
+    SE.forgetLoop(FC0.L);
+
+    // Merge the loops.
+    SmallVector<BasicBlock *, 8> Blocks(FC1.L->block_begin(),
+                                        FC1.L->block_end());
+    for (BasicBlock *BB : Blocks) {
+      FC0.L->addBlockEntry(BB);
+      FC1.L->removeBlockFromLoop(BB);
+      if (LI.getLoopFor(BB) != FC1.L)
+        continue;
+      LI.changeLoopFor(BB, FC0.L);
+    }
+    while (!FC1.L->empty()) {
+      const auto &ChildLoopIt = FC1.L->begin();
+      Loop *ChildLoop = *ChildLoopIt;
+      FC1.L->removeChildLoop(ChildLoopIt);
+      FC0.L->addChildLoop(ChildLoop);
+    }
+
+    // Delete the now empty loop L1.
+    LI.erase(FC1.L);
+
+#ifndef NDEBUG
+    assert(!verifyFunction(*FC0.Header->getParent(), &errs()));
+    assert(DT.verify(DominatorTree::VerificationLevel::Fast));
+    assert(PDT.verify());
+    LI.verify(DT);
+    SE.verify();
+#endif
+
+    FuseCounter++;
+
+    LLVM_DEBUG(dbgs() << "Fusion done:\n");
+
+    return FC0.L;
+  }
+};
+
+struct LoopFuseLegacy : public FunctionPass {
+
+  static char ID;
+
+  LoopFuseLegacy() : FunctionPass(ID) {
+    initializeLoopFuseLegacyPass(*PassRegistry::getPassRegistry());
+  }
+
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+    AU.addRequiredID(LoopSimplifyID);
+    AU.addRequired<ScalarEvolutionWrapperPass>();
+    AU.addRequired<LoopInfoWrapperPass>();
+    AU.addRequired<DominatorTreeWrapperPass>();
+    AU.addRequired<PostDominatorTreeWrapperPass>();
+    AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
+    AU.addRequired<DependenceAnalysisWrapperPass>();
+
+    AU.addPreserved<ScalarEvolutionWrapperPass>();
+    AU.addPreserved<LoopInfoWrapperPass>();
+    AU.addPreserved<DominatorTreeWrapperPass>();
+    AU.addPreserved<PostDominatorTreeWrapperPass>();
+  }
+
+  bool runOnFunction(Function &F) override {
+    if (skipFunction(F))
+      return false;
+    auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
+    auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+    auto &DI = getAnalysis<DependenceAnalysisWrapperPass>().getDI();
+    auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+    auto &PDT = getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree();
+    auto &ORE = getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
+
+    const DataLayout &DL = F.getParent()->getDataLayout();
+    LoopFuser LF(LI, DT, DI, SE, PDT, ORE, DL);
+    return LF.fuseLoops(F);
+  }
+};
+
+PreservedAnalyses LoopFusePass::run(Function &F, FunctionAnalysisManager &AM) {
+  auto &LI = AM.getResult<LoopAnalysis>(F);
+  auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
+  auto &DI = AM.getResult<DependenceAnalysis>(F);
+  auto &SE = AM.getResult<ScalarEvolutionAnalysis>(F);
+  auto &PDT = AM.getResult<PostDominatorTreeAnalysis>(F);
+  auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
+
+  const DataLayout &DL = F.getParent()->getDataLayout();
+  LoopFuser LF(LI, DT, DI, SE, PDT, ORE, DL);
+  bool Changed = LF.fuseLoops(F);
+  if (!Changed)
+    return PreservedAnalyses::all();
+
+  PreservedAnalyses PA;
+  PA.preserve<DominatorTreeAnalysis>();
+  PA.preserve<PostDominatorTreeAnalysis>();
+  PA.preserve<ScalarEvolutionAnalysis>();
+  PA.preserve<LoopAnalysis>();
+  return PA;
+}
+
+char LoopFuseLegacy::ID = 0;
+
+INITIALIZE_PASS_BEGIN(LoopFuseLegacy, "loop-fusion", "Loop Fusion", false,
+                      false)
+INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(DependenceAnalysisWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
+INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
+INITIALIZE_PASS_END(LoopFuseLegacy, "loop-fusion", "Loop Fusion", false, false)
+
+FunctionPass *llvm::createLoopFusePass() { return new LoopFuseLegacy(); }

Modified: llvm/trunk/lib/Transforms/Scalar/Scalar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalar.cpp?rev=358552&r1=358551&r2=358552&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/Scalar.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/Scalar.cpp Tue Apr 16 21:52:47 2019
@@ -62,6 +62,7 @@ void llvm::initializeScalarOpts(PassRegi
   initializeJumpThreadingPass(Registry);
   initializeLegacyLICMPassPass(Registry);
   initializeLegacyLoopSinkPassPass(Registry);
+  initializeLoopFuseLegacyPass(Registry);
   initializeLoopDataPrefetchLegacyPassPass(Registry);
   initializeLoopDeletionLegacyPassPass(Registry);
   initializeLoopAccessLegacyAnalysisPass(Registry);

Added: llvm/trunk/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-01-31-UseStuckAround.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,11 @@
+; RUN:  opt < %s -adce
+
+define i32 @"main"(i32 %argc) {
+	br label %2
+
+	%retval = phi i32 [ %argc, %2 ]		; <i32>	[#uses=2]
+	%two = add i32 %retval, %retval		; <i32>	[#uses=1]
+	ret i32 %two
+
+	br label %1
+}

Added: llvm/trunk/test/Transforms/ADCE/2002-05-22-PHITest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-05-22-PHITest.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-05-22-PHITest.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-05-22-PHITest.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,16 @@
+; It is illegal to remove BB1 because it will mess up the PHI node!
+;
+; RUN: opt < %s -adce -S | grep BB1
+
+define i32 @test(i1 %C, i32 %A, i32 %B) {
+; <label>:0
+        br i1 %C, label %BB1, label %BB2
+
+BB1:            ; preds = %0
+        br label %BB2
+
+BB2:            ; preds = %BB1, %0
+        %R = phi i32 [ %A, %0 ], [ %B, %BB1 ]           ; <i32> [#uses=1]
+        ret i32 %R
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-05-23-ZeroArgPHITest.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,35 @@
+; This testcase contains a entire loop that should be removed.  The only thing
+; left is the store instruction in BB0.  The problem this testcase was running
+; into was that when the reg109 PHI was getting zero predecessors, it was 
+; removed even though there were uses still around.  Now the uses are filled
+; in with a dummy value before the PHI is deleted.
+;
+; RUN: opt < %s -S -adce | grep bb1
+; RUN: opt < %s -S -adce -adce-remove-loops | FileCheck %s
+	
+        %node_t = type { double*, %node_t*, %node_t**, double**, double*, i32, i32 }
+
+define void @localize_local(%node_t* %nodelist) {
+bb0:
+        %nodelist.upgrd.1 = alloca %node_t*             ; <%node_t**> [#uses=2]
+        store %node_t* %nodelist, %node_t** %nodelist.upgrd.1
+        br label %bb1
+
+bb1:            ; preds = %bb0
+        %reg107 = load %node_t*, %node_t** %nodelist.upgrd.1              ; <%node_t*> [#uses=2]
+        %cond211 = icmp eq %node_t* %reg107, null               ; <i1> [#uses=1]
+; CHECK: br label %bb3
+        br i1 %cond211, label %bb3, label %bb2
+
+bb2:            ; preds = %bb2, %bb1
+        %reg109 = phi %node_t* [ %reg110, %bb2 ], [ %reg107, %bb1 ]             ; <%node_t*> [#uses=1]
+        %reg212 = getelementptr %node_t, %node_t* %reg109, i64 0, i32 1          ; <%node_t**> [#uses=1]
+        %reg110 = load %node_t*, %node_t** %reg212                ; <%node_t*> [#uses=2]
+        %cond213 = icmp ne %node_t* %reg110, null               ; <i1> [#uses=1]
+; CHECK: br label %bb3
+        br i1 %cond213, label %bb2, label %bb3
+
+bb3:            ; preds = %bb2, %bb1
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash-distilled.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,19 @@
+; This testcase is a distilled form of: 2002-05-28-Crash.ll
+
+; RUN: opt < %s -adce 
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define float @test(i32 %i) {
+        %F = sitofp i32 %i to float             ; <float> [#uses=1]
+        %I = bitcast i32 %i to i32              ; <i32> [#uses=1]
+        br label %Loop
+
+Loop:           ; preds = %Loop, %0
+        %B = icmp ne i32 %I, 0          ; <i1> [#uses=1]
+; CHECK:   br label %Out
+        br i1 %B, label %Out, label %Loop
+
+Out:            ; preds = %Loop
+        ret float %F
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-05-28-Crash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,56 @@
+; This testcase is distilled from the GNU rx package.  The loop should be 
+; removed but causes a problem when ADCE does.  The source function is:
+; int rx_bitset_empty (int size, rx_Bitset set) {
+;  int x;
+;  RX_subset s;
+;  s = set[0];
+;  set[0] = 1;
+;  for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
+;    ;
+;  set[0] = s;
+;  return !s;
+;}
+;
+; RUN: opt < %s -adce
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define i32 @rx_bitset_empty(i32 %size, i32* %set) {
+bb1:
+        %reg110 = load i32, i32* %set                ; <i32> [#uses=2]
+        store i32 1, i32* %set
+        %cast112 = sext i32 %size to i64                ; <i64> [#uses=1]
+        %reg113 = add i64 %cast112, 31          ; <i64> [#uses=1]
+        %reg114 = lshr i64 %reg113, 5           ; <i64> [#uses=2]
+        %cast109 = trunc i64 %reg114 to i32             ; <i32> [#uses=1]
+        %reg129 = add i32 %cast109, -1          ; <i32> [#uses=1]
+        %reg114-idxcast = trunc i64 %reg114 to i32              ; <i32> [#uses=1]
+        %reg114-idxcast-offset = add i32 %reg114-idxcast, 1073741823            ; <i32> [#uses=1]
+        %reg114-idxcast-offset.upgrd.1 = zext i32 %reg114-idxcast-offset to i64         ; <i64> [#uses=1]
+        %reg124 = getelementptr i32, i32* %set, i64 %reg114-idxcast-offset.upgrd.1           ; <i32*> [#uses=1]
+        %reg125 = load i32, i32* %reg124             ; <i32> [#uses=1]
+        %cond232 = icmp ne i32 %reg125, 0               ; <i1> [#uses=1]
+; CHECK: br label %bb3
+        br i1 %cond232, label %bb3, label %bb2
+
+bb2:            ; preds = %bb2, %bb1
+        %cann-indvar = phi i32 [ 0, %bb1 ], [ %add1-indvar, %bb2 ]              ; <i32> [#uses=2]
+        %reg130-scale = mul i32 %cann-indvar, -1                ; <i32> [#uses=1]
+        %reg130 = add i32 %reg130-scale, %reg129                ; <i32> [#uses=1]
+        %add1-indvar = add i32 %cann-indvar, 1          ; <i32> [#uses=1]
+        %reg130-idxcast = bitcast i32 %reg130 to i32            ; <i32> [#uses=1]
+        %reg130-idxcast-offset = add i32 %reg130-idxcast, 1073741823            ; <i32> [#uses=1]
+        %reg130-idxcast-offset.upgrd.2 = zext i32 %reg130-idxcast-offset to i64         ; <i64> [#uses=1]
+        %reg118 = getelementptr i32, i32* %set, i64 %reg130-idxcast-offset.upgrd.2           ; <i32*> [#uses=1]
+        %reg119 = load i32, i32* %reg118             ; <i32> [#uses=1]
+        %cond233 = icmp eq i32 %reg119, 0               ; <i1> [#uses=1]
+        br i1 %cond233, label %bb2, label %bb3
+
+bb3:            ; preds = %bb2, %bb1
+        store i32 %reg110, i32* %set
+        %cast126 = zext i32 %reg110 to i64              ; <i64> [#uses=1]
+        %reg127 = add i64 %cast126, -1          ; <i64> [#uses=1]
+        %reg128 = lshr i64 %reg127, 63          ; <i64> [#uses=1]
+        %cast120 = trunc i64 %reg128 to i32             ; <i32> [#uses=1]
+        ret i32 %cast120
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-07-17-AssertionFailure.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,14 @@
+; This testcase fails because ADCE does not correctly delete the chain of 
+; three instructions that are dead here.  Ironically there were a dead basic
+; block in this function, it would work fine, but that would be the part we 
+; have to fix now, wouldn't it....
+;
+; RUN: opt < %s -adce -S | FileCheck %s
+
+define void @foo(i8* %reg5481) {
+        %cast611 = bitcast i8* %reg5481 to i8**         ; <i8**> [#uses=1]
+        %reg162 = load i8*, i8** %cast611            ; <i8*> [#uses=1]
+; CHECK-NOT: ptrtoint
+        ptrtoint i8* %reg162 to i32             ; <i32>:1 [#uses=0]
+        ret void
+}

Added: llvm/trunk/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-07-17-PHIAssertion.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; This testcase was extracted from the gzip SPEC benchmark
+;
+; RUN: opt < %s -adce | FileCheck %s
+
+ at bk = external global i32               ; <i32*> [#uses=2]
+ at hufts = external global i32            ; <i32*> [#uses=1]
+
+define i32 @inflate() {
+bb0:
+        br label %bb2
+
+bb2:            ; preds = %bb6, %bb0
+        %reg128 = phi i32 [ %reg130, %bb6 ], [ 0, %bb0 ]                ; <i32> [#uses=2]
+        br i1 true, label %bb4, label %bb3
+
+bb3:            ; preds = %bb2
+        br label %UnifiedExitNode
+
+; CHECK-NOT: bb4:
+; CHECK-NOT: bb5:
+bb4:            ; preds = %bb2
+        %reg117 = load i32, i32* @hufts              ; <i32> [#uses=2]
+        %cond241 = icmp ule i32 %reg117, %reg128                ; <i1> [#uses=1]
+        br i1 %cond241, label %bb6, label %bb5
+
+bb5:            ; preds = %bb4
+        br label %bb6
+
+bb6:            ; preds = %bb5, %bb4
+        %reg130 = phi i32 [ %reg117, %bb5 ], [ %reg128, %bb4 ]          ; <i32> [#uses=1]
+        br i1 false, label %bb2, label %bb7
+
+bb7:            ; preds = %bb6
+        %reg126 = load i32, i32* @bk         ; <i32> [#uses=1]
+        %cond247 = icmp ule i32 %reg126, 7              ; <i1> [#uses=1]
+        br i1 %cond247, label %bb9, label %bb8
+
+bb8:            ; preds = %bb8, %bb7
+        %reg119 = load i32, i32* @bk         ; <i32> [#uses=1]
+        %cond256 = icmp ugt i32 %reg119, 7              ; <i1> [#uses=1]
+        br i1 %cond256, label %bb8, label %bb9
+
+bb9:            ; preds = %bb8, %bb7
+        br label %UnifiedExitNode
+
+UnifiedExitNode:                ; preds = %bb9, %bb3
+        %UnifiedRetVal = phi i32 [ 7, %bb3 ], [ 0, %bb9 ]               ; <i32> [#uses=1]
+        ret i32 %UnifiedRetVal
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2002-07-29-Segfault.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2002-07-29-Segfault.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2002-07-29-Segfault.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2002-07-29-Segfault.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,10 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -disable-output -adce-remove-loops
+
+define void @test() {
+        br label %BB3
+
+BB3:            ; preds = %BB3, %0
+        br label %BB3
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-01-22-PredecessorProblem.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,30 @@
+; Testcase reduced from 197.parser by bugpoint
+; RUN: opt < %s -adce 
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define void @conjunction_prune() {
+; <label>:0
+        br label %bb19
+
+bb19:           ; preds = %bb23, %bb22, %0
+        %reg205 = phi i8* [ null, %bb22 ], [ null, %bb23 ], [ null, %0 ]                ; <i8*> [#uses=1]
+; CHECK: br label %bb22
+        br i1 false, label %bb21, label %bb22
+
+bb21:           ; preds = %bb19
+        %cast455 = bitcast i8* %reg205 to i8**          ; <i8**> [#uses=0]
+; CHECK: br label %bb22
+        br label %bb22
+
+bb22:           ; preds = %bb21, %bb19
+; CHECK: br label %bb23
+        br i1 false, label %bb19, label %bb23
+
+bb23:           ; preds = %bb22
+; CHECK: br label %bb28
+        br i1 false, label %bb19, label %bb28
+
+bb28:           ; preds = %bb23
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-04-25-PHIPostDominateProblem.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,37 @@
+; THis testcase caused an assertion failure because a PHI node did not have 
+; entries for it's postdominator.  But I think this can only happen when the 
+; PHI node is dead, so we just avoid patching up dead PHI nodes.
+
+; RUN: opt < %s -adce                    -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+target datalayout = "e-p:32:32"
+
+define void @dead_test8() {
+entry:
+        br label %loopentry
+
+loopentry:              ; preds = %endif, %entry
+        %k.1 = phi i32 [ %k.0, %endif ], [ 0, %entry ]          ; <i32> [#uses=1]
+        br i1 false, label %no_exit, label %return
+
+no_exit:                ; preds = %loopentry
+; CHECK: br label %then
+        br i1 false, label %then, label %else
+
+then:           ; preds = %no_exit
+        br label %endif
+
+else:           ; preds = %no_exit
+        %dec = add i32 %k.1, -1         ; <i32> [#uses=1]
+        br label %endif
+
+endif:          ; preds = %else, %then
+        %k.0 = phi i32 [ %dec, %else ], [ 0, %then ]            ; <i32> [#uses=1]
+        store i32 2, i32* null
+        br label %loopentry
+
+return:         ; preds = %loopentry
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-06-11-InvalidCFG.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,29 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+ at G = external global i32*               ; <i32**> [#uses=1]
+
+declare void @Fn(i32*)
+
+define i32 @main(i32 %argc.1, i8** %argv.1) {
+entry:
+        br label %endif.42
+
+endif.42:               ; preds = %shortcirc_done.12, %then.66, %endif.42, %entry
+        br i1 false, label %endif.65, label %endif.42
+
+then.66:                ; preds = %shortcirc_done.12
+        call void @Fn( i32* %tmp.2846 )
+        br label %endif.42
+
+endif.65:               ; preds = %endif.42
+        %tmp.2846 = load i32*, i32** @G               ; <i32*> [#uses=1]
+        br i1 false, label %shortcirc_next.12, label %shortcirc_done.12
+
+shortcirc_next.12:              ; preds = %endif.65
+        br label %shortcirc_done.12
+
+shortcirc_done.12:              ; preds = %shortcirc_next.12, %endif.65
+        br i1 false, label %then.66, label %endif.42
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-06-24-BadSuccessor.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,94 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops=true -disable-output
+
+target datalayout = "e-p:32:32"
+	%struct..CppObjTypeDesc = type { i32, i16, i16 }
+	%struct..TypeToken = type { i32, i16, i16 }
+
+define i32 @C_ReFaxToDb() {
+entry:
+	br i1 false, label %endif.0, label %then.0
+
+then.0:		; preds = %entry
+	ret i32 0
+
+endif.0:		; preds = %entry
+	br i1 false, label %then.11, label %then.4
+
+then.4:		; preds = %endif.0
+	ret i32 0
+
+then.11:		; preds = %endif.0
+	br i1 false, label %loopentry.0, label %else.2
+
+loopentry.0:		; preds = %loopentry.1, %endif.14, %then.11
+	br i1 false, label %endif.14, label %loopexit.0
+
+endif.14:		; preds = %loopentry.0
+	br i1 false, label %loopentry.1, label %loopentry.0
+
+loopentry.1:		; preds = %then.53, %endif.14
+	%SubArrays.10 = phi i32* [ %SubArrays.8, %then.53 ], [ null, %endif.14 ]		; <i32*> [#uses=3]
+	br i1 false, label %no_exit.1, label %loopentry.0
+
+no_exit.1:		; preds = %loopentry.1
+; CHECK: switch
+	switch i32 0, label %label.17 [
+		 i32 2, label %label.11
+		 i32 19, label %label.10
+	]
+
+label.10:		; preds = %no_exit.1
+	br i1 false, label %then.43, label %endif.43
+
+then.43:		; preds = %label.10
+	br i1 false, label %then.44, label %endif.44
+
+then.44:		; preds = %then.43
+	br i1 false, label %shortcirc_next.4, label %endif.45
+
+shortcirc_next.4:		; preds = %then.44
+	br i1 false, label %no_exit.2, label %loopexit.2
+
+no_exit.2:		; preds = %shortcirc_next.4
+	%tmp.897 = getelementptr i32, i32* %SubArrays.10, i64 0		; <i32*> [#uses=1]
+	%tmp.899 = load i32, i32* %tmp.897		; <i32> [#uses=1]
+	store i32 %tmp.899, i32* null
+	ret i32 0
+
+loopexit.2:		; preds = %shortcirc_next.4
+	ret i32 0
+
+endif.45:		; preds = %then.44
+	ret i32 0
+
+endif.44:		; preds = %then.43
+	ret i32 0
+
+endif.43:		; preds = %label.10
+	ret i32 0
+
+label.11:		; preds = %no_exit.1
+	ret i32 0
+
+label.17:		; preds = %no_exit.1
+	br i1 false, label %then.53, label %shortcirc_next.7
+
+shortcirc_next.7:		; preds = %label.17
+	br i1 false, label %then.53, label %shortcirc_next.8
+
+shortcirc_next.8:		; preds = %shortcirc_next.7
+	ret i32 0
+
+then.53:		; preds = %shortcirc_next.7, %label.17
+	%SubArrays.8 = phi i32* [ %SubArrays.10, %shortcirc_next.7 ], [ %SubArrays.10, %label.17 ]		; <i32*> [#uses=1]
+	%tmp.1023 = load i32, i32* null		; <i32> [#uses=1]
+	switch i32 %tmp.1023, label %loopentry.1 [
+	]
+
+loopexit.0:		; preds = %loopentry.0
+	ret i32 0
+
+else.2:		; preds = %then.11
+	ret i32 0
+}

Added: llvm/trunk/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-06-24-BasicFunctionality.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,44 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+define void @dead_test8(i32* %data.1, i32 %idx.1) {
+entry:
+        %tmp.1 = load i32, i32* %data.1              ; <i32> [#uses=2]
+        %tmp.41 = icmp sgt i32 %tmp.1, 0                ; <i1> [#uses=1]
+        br i1 %tmp.41, label %no_exit.preheader, label %return
+
+no_exit.preheader:              ; preds = %entry
+        %tmp.11 = getelementptr i32, i32* %data.1, i64 1             ; <i32*> [#uses=1]
+        %tmp.22-idxcast = sext i32 %idx.1 to i64                ; <i64> [#uses=1]
+        %tmp.28 = getelementptr i32, i32* %data.1, i64 %tmp.22-idxcast               ; <i32*> [#uses=1]
+        br label %no_exit
+
+no_exit:                ; preds = %endif, %no_exit.preheader
+        %k.1 = phi i32 [ %k.0, %endif ], [ 0, %no_exit.preheader ]              ; <i32> [#uses=3]
+        %i.0 = phi i32 [ %inc.1, %endif ], [ 0, %no_exit.preheader ]            ; <i32> [#uses=1]
+        %tmp.12 = load i32, i32* %tmp.11             ; <i32> [#uses=1]
+        %tmp.14 = sub i32 0, %tmp.12            ; <i32> [#uses=1]
+; CHECK-NOT: %tmp.161
+        %tmp.161 = icmp ne i32 %k.1, %tmp.14            ; <i1> [#uses=1]
+; CHECK: br label %then
+        br i1 %tmp.161, label %then, label %else
+
+then:           ; preds = %no_exit
+        %inc.0 = add i32 %k.1, 1                ; <i32> [#uses=1]
+        br label %endif
+
+else:           ; preds = %no_exit
+        %dec = add i32 %k.1, -1         ; <i32> [#uses=1]
+        br label %endif
+
+endif:          ; preds = %else, %then
+        %k.0 = phi i32 [ %dec, %else ], [ %inc.0, %then ]               ; <i32> [#uses=1]
+        store i32 2, i32* %tmp.28
+        %inc.1 = add i32 %i.0, 1                ; <i32> [#uses=2]
+        %tmp.4 = icmp slt i32 %inc.1, %tmp.1            ; <i1> [#uses=1]
+        br i1 %tmp.4, label %no_exit, label %return
+
+return:         ; preds = %endif, %entry
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-09-10-UnwindInstFail.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,22 @@
+; RUN: opt < %s -adce -disable-output
+
+define void @test() personality i32 (...)* @__gxx_personality_v0 {
+        br i1 false, label %then, label %endif
+
+then:           ; preds = %0
+        invoke void null( i8* null )
+                        to label %invoke_cont unwind label %invoke_catch
+
+invoke_catch:           ; preds = %then
+        %exn = landingpad {i8*, i32}
+                 cleanup
+        resume { i8*, i32 } %exn
+
+invoke_cont:            ; preds = %then
+        ret void
+
+endif:          ; preds = %0
+        ret void
+}
+
+declare i32 @__gxx_personality_v0(...)

Added: llvm/trunk/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-09-15-InfLoopCrash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,10 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+define i32 @main() {
+        br label %loop
+
+loop:           ; preds = %loop, %0
+        br label %loop
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2003-11-16-MissingPostDominanceInfo.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,20 @@
+; RUN: opt < %s -adce -simplifycfg -S | grep call
+; RUN: opt < %s -adce -adce-remove-loops -simplifycfg -S | grep call
+
+declare void @exit(i32)
+
+define i32 @main(i32 %argc) {
+        %C = icmp eq i32 %argc, 1               ; <i1> [#uses=2]
+        br i1 %C, label %Cond, label %Done
+
+Cond:           ; preds = %0
+        br i1 %C, label %Loop, label %Done
+
+Loop:           ; preds = %Loop, %Cond
+        call void @exit( i32 0 )
+        br label %Loop
+
+Done:           ; preds = %Cond, %0
+        ret i32 1
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2004-05-04-UnreachableBlock.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,17 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -disable-output
+
+define void @test() {
+entry:
+        br label %UnifiedReturnBlock
+
+UnifiedReturnBlock:             ; preds = %invoke_catch.0, %entry
+        ret void
+
+invoke_catch.0:         ; No predecessors!
+        br i1 false, label %UnifiedUnwindBlock, label %UnifiedReturnBlock
+
+UnifiedUnwindBlock:             ; preds = %invoke_catch.0
+        unreachable
+}
+

Added: llvm/trunk/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2005-02-17-PHI-Invoke-Crash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,52 @@
+; RUN: opt < %s -adce -disable-output
+
+declare void @strlen()
+
+declare void @_ZN10QByteArray6resizeEi()
+
+declare void @q_atomic_decrement()
+
+define void @_ZNK10QByteArray13leftJustifiedEicb() personality i32 (...)* @__gxx_personality_v0 {
+entry:
+        invoke void @strlen( )
+                        to label %tmp.3.i.noexc unwind label %invoke_catch.0
+
+tmp.3.i.noexc:          ; preds = %entry
+        br i1 false, label %then.0, label %else.0
+
+invoke_catch.0:         ; preds = %entry
+        %exn.0 = landingpad {i8*, i32}
+                 cleanup
+        invoke void @q_atomic_decrement( )
+                        to label %tmp.1.i.i183.noexc unwind label %terminate
+
+tmp.1.i.i183.noexc:             ; preds = %invoke_catch.0
+        ret void
+
+then.0:         ; preds = %tmp.3.i.noexc
+        invoke void @_ZN10QByteArray6resizeEi( )
+                        to label %invoke_cont.1 unwind label %invoke_catch.1
+
+invoke_catch.1:         ; preds = %then.0
+        %exn.1 = landingpad {i8*, i32}
+                 cleanup
+        invoke void @q_atomic_decrement( )
+                        to label %tmp.1.i.i162.noexc unwind label %terminate
+
+tmp.1.i.i162.noexc:             ; preds = %invoke_catch.1
+        ret void
+
+invoke_cont.1:          ; preds = %then.0
+        ret void
+
+else.0:         ; preds = %tmp.3.i.noexc
+        ret void
+
+terminate:              ; preds = %invoke_catch.1, %invoke_catch.0
+        %dbg.0.1 = phi {  }* [ null, %invoke_catch.1 ], [ null, %invoke_catch.0 ]               ; <{  }*> [#uses=0]
+        %exn = landingpad {i8*, i32}
+                 cleanup
+        unreachable
+}
+
+declare i32 @__gxx_personality_v0(...)

Added: llvm/trunk/test/Transforms/ADCE/2016-09-06.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2016-09-06.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2016-09-06.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2016-09-06.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,55 @@
+; RUN: opt < %s -sroa -adce -adce-remove-loops -S | FileCheck %s
+; ModuleID = 'test1.bc'
+source_filename = "test1.c"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: nounwind uwtable
+define i32 @foo(i32, i32, i32) #0 {
+  %4 = alloca i32, align 4
+  %5 = alloca i32, align 4
+  %6 = alloca i32, align 4
+  %7 = alloca i32, align 4
+  %8 = alloca i32, align 4
+  store i32 %0, i32* %4, align 4
+  store i32 %1, i32* %5, align 4
+  store i32 %2, i32* %6, align 4
+  store i32 0, i32* %7, align 4
+  %9 = load i32, i32* %5, align 4
+  %I10 = icmp ne i32 %9, 0
+  br i1 %I10, label %B11, label %B21
+
+B11: 
+  store i32 0, i32* %8, align 4
+  br label %B12
+
+B12:
+  %I13 = load i32, i32* %8, align 4
+  %I14 = load i32, i32* %6, align 4
+  %I15 = icmp slt i32 %I13, %I14
+; CHECK: br label %B20
+  br i1 %I15, label %B16, label %B20
+
+B16: 
+  br label %B17
+
+B17: 
+  %I18 = load i32, i32* %8, align 4
+  %I19 = add nsw i32 %I18, 1
+  store i32 %I19, i32* %8, align 4
+  br label %B12
+
+B20:
+  store i32 1, i32* %7, align 4
+  br label %B21
+
+B21: 
+  %I22 = load i32, i32* %7, align 4
+  ret i32 %I22
+}
+
+attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 4.0.0"}

Added: llvm/trunk/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/2017-08-21-DomTree-deletions.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,24 @@
+; RUN: opt < %s -adce | llvm-dis
+; RUN: opt < %s -adce -verify-dom-info | llvm-dis
+
+define void @foo() {
+entry:
+  br label %switch
+switch:                    ; preds = %entry
+  switch i32 undef, label %default [
+    i32 2, label %two
+    i32 5, label %five
+    i32 4, label %four
+  ]
+four:                      ; preds = %switch
+  br label %exit
+five:                      ; preds = %switch
+  br label %exit
+two:                       ; preds = %switch
+  br label %exit
+default:                   ; preds = %switch
+  br label %exit
+exit:                      ; preds = %default, %two, %five, %four
+  ret void
+}
+

Added: llvm/trunk/test/Transforms/ADCE/basictest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/basictest.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/basictest.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/basictest.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,18 @@
+; RUN: opt < %s -adce -simplifycfg | llvm-dis
+; RUN: opt < %s -passes=adce | llvm-dis
+
+define i32 @Test(i32 %A, i32 %B) {
+BB1:
+        br label %BB4
+
+BB2:            ; No predecessors!
+        br label %BB3
+
+BB3:            ; preds = %BB4, %BB2
+        %ret = phi i32 [ %X, %BB4 ], [ %B, %BB2 ]               ; <i32> [#uses=1]
+        ret i32 %ret
+
+BB4:            ; preds = %BB1
+        %X = phi i32 [ %A, %BB1 ]               ; <i32> [#uses=1]
+        br label %BB3
+}

Added: llvm/trunk/test/Transforms/ADCE/basictest1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/basictest1.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/basictest1.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/basictest1.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,102 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+%FILE = type { i32, i8*, i8*, i8, i8, i32, i32, i32 }
+	%spec_fd_t = type { i32, i32, i32, i8* }
+ at __iob = external global [20 x %FILE]		; <[20 x %FILE]*> [#uses=1]
+ at dbglvl = global i32 4		; <i32*> [#uses=3]
+ at spec_fd = external global [3 x %spec_fd_t]		; <[3 x %spec_fd_t]*> [#uses=4]
+ at .LC9 = internal global [34 x i8] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00"		; <[34 x i8]*> [#uses=1]
+ at .LC10 = internal global [4 x i8] c"EOF\00"		; <[4 x i8]*> [#uses=1]
+ at .LC11 = internal global [4 x i8] c"%d\0A\00"		; <[4 x i8]*> [#uses=1]
+ at .LC12 = internal global [17 x i8] c"spec_getc: %d = \00"		; <[17 x i8]*> [#uses=1]
+
+declare i32 @fprintf(%FILE*, i8*, ...)
+
+declare void @exit(i32)
+
+declare i32 @remove(i8*)
+
+declare i32 @fputc(i32, %FILE*)
+
+declare i32 @fwrite(i8*, i32, i32, %FILE*)
+
+declare void @perror(i8*)
+
+define i32 @spec_getc(i32 %fd) {
+	%reg109 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond266 = icmp sle i32 %reg109, 4		; <i1> [#uses=1]
+; CHECKL br label %bb3
+	br i1 %cond266, label %bb3, label %bb2
+
+bb2:		; preds = %0
+	%cast273 = getelementptr [17 x i8], [17 x i8]* @.LC12, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb3
+
+bb3:		; preds = %bb2, %0
+	%cond267 = icmp sle i32 %fd, 3		; <i1> [#uses=1]
+	br i1 %cond267, label %bb5, label %bb4
+
+bb4:		; preds = %bb3
+	%reg111 = getelementptr [20 x %FILE], [20 x %FILE]* @__iob, i64 0, i64 1, i32 3		; <i8*> [#uses=1]
+	%cast274 = getelementptr [34 x i8], [34 x i8]* @.LC9, i64 0, i64 0		; <i8*> [#uses=0]
+	%cast282 = bitcast i8* %reg111 to %FILE*		; <%FILE*> [#uses=0]
+	call void @exit( i32 1 )
+	br label %UnifiedExitNode
+
+bb5:		; preds = %bb3
+	%reg107-idxcast1 = sext i32 %fd to i64		; <i64> [#uses=2]
+	%reg107-idxcast2 = sext i32 %fd to i64		; <i64> [#uses=1]
+	%reg1311 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast2		; <%spec_fd_t*> [#uses=1]
+	%idx1 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2		; <i32*> [#uses=1]
+	%reg1321 = load i32, i32* %idx1		; <i32> [#uses=3]
+	%idx2 = getelementptr %spec_fd_t, %spec_fd_t* %reg1311, i64 0, i32 1		; <i32*> [#uses=1]
+	%reg1331 = load i32, i32* %idx2		; <i32> [#uses=1]
+	%cond270 = icmp slt i32 %reg1321, %reg1331		; <i1> [#uses=1]
+	br i1 %cond270, label %bb9, label %bb6
+
+bb6:		; preds = %bb5
+	%reg134 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond271 = icmp sle i32 %reg134, 4		; <i1> [#uses=1]
+; CHECK: br label %bb8
+	br i1 %cond271, label %bb8, label %bb7
+
+bb7:		; preds = %bb6
+	%cast277 = getelementptr [4 x i8], [4 x i8]* @.LC10, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb8
+
+bb8:		; preds = %bb7, %bb6
+	br label %UnifiedExitNode
+
+bb9:		; preds = %bb5
+	%reg107-idxcast3 = sext i32 %fd to i64		; <i64> [#uses=1]
+	%idx3 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast3, i32 3		; <i8**> [#uses=1]
+	%reg1601 = load i8*, i8** %idx3		; <i8*> [#uses=1]
+	%reg132-idxcast1 = sext i32 %reg1321 to i64		; <i64> [#uses=1]
+	%idx4 = getelementptr i8, i8* %reg1601, i64 %reg132-idxcast1		; <i8*> [#uses=1]
+	%reg1621 = load i8, i8* %idx4		; <i8> [#uses=2]
+	%cast108 = zext i8 %reg1621 to i64		; <i64> [#uses=0]
+	%reg157 = add i32 %reg1321, 1		; <i32> [#uses=1]
+	%idx5 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2		; <i32*> [#uses=1]
+	store i32 %reg157, i32* %idx5
+	%reg163 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond272 = icmp sle i32 %reg163, 4		; <i1> [#uses=1]
+; CHECK: br label %bb11
+	br i1 %cond272, label %bb11, label %bb10
+
+bb10:		; preds = %bb9
+	%cast279 = getelementptr [4 x i8], [4 x i8]* @.LC11, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb11
+
+bb11:		; preds = %bb10, %bb9
+	%cast291 = zext i8 %reg1621 to i32		; <i32> [#uses=1]
+	br label %UnifiedExitNode
+
+UnifiedExitNode:		; preds = %bb11, %bb8, %bb4
+	%UnifiedRetVal = phi i32 [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ]		; <i32> [#uses=1]
+	ret i32 %UnifiedRetVal
+}
+
+declare i32 @puts(i8*)
+
+declare i32 @printf(i8*, ...)

Added: llvm/trunk/test/Transforms/ADCE/basictest2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/basictest2.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/basictest2.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/basictest2.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,102 @@
+; RUN: opt < %s -adce -disable-output
+; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
+
+	%FILE = type { i32, i8*, i8*, i8, i8, i32, i32, i32 }
+	%spec_fd_t = type { i32, i32, i32, i8* }
+ at __iob = external global [20 x %FILE]		; <[20 x %FILE]*> [#uses=1]
+ at dbglvl = global i32 4		; <i32*> [#uses=3]
+ at spec_fd = external global [3 x %spec_fd_t]		; <[3 x %spec_fd_t]*> [#uses=4]
+ at .LC9 = internal global [34 x i8] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00"		; <[34 x i8]*> [#uses=1]
+ at .LC10 = internal global [4 x i8] c"EOF\00"		; <[4 x i8]*> [#uses=1]
+ at .LC11 = internal global [4 x i8] c"%d\0A\00"		; <[4 x i8]*> [#uses=1]
+ at .LC12 = internal global [17 x i8] c"spec_getc: %d = \00"		; <[17 x i8]*> [#uses=1]
+
+declare i32 @fprintf(%FILE*, i8*, ...)
+
+declare void @exit(i32)
+
+declare i32 @remove(i8*)
+
+declare i32 @fputc(i32, %FILE*)
+
+declare i32 @fwrite(i8*, i32, i32, %FILE*)
+
+declare void @perror(i8*)
+
+define i32 @spec_getc(i32 %fd) {
+	%reg109 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond266 = icmp sle i32 %reg109, 4		; <i1> [#uses=1]
+; CHECK: br label %bb3
+	br i1 %cond266, label %bb3, label %bb2
+
+bb2:		; preds = %0
+	%cast273 = getelementptr [17 x i8], [17 x i8]* @.LC12, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb3
+
+bb3:		; preds = %bb2, %0
+	%cond267 = icmp sle i32 %fd, 3		; <i1> [#uses=0]
+	br label %bb5
+
+bb4:		; No predecessors!
+	%reg111 = getelementptr [20 x %FILE], [20 x %FILE]* @__iob, i64 0, i64 1, i32 3		; <i8*> [#uses=1]
+	%cast274 = getelementptr [34 x i8], [34 x i8]* @.LC9, i64 0, i64 0		; <i8*> [#uses=0]
+	%cast282 = bitcast i8* %reg111 to %FILE*		; <%FILE*> [#uses=0]
+	call void @exit( i32 1 )
+	br label %UnifiedExitNode
+
+bb5:		; preds = %bb3
+	%reg107-idxcast1 = sext i32 %fd to i64		; <i64> [#uses=2]
+	%reg107-idxcast2 = sext i32 %fd to i64		; <i64> [#uses=1]
+	%reg1311 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast2		; <%spec_fd_t*> [#uses=1]
+	%idx1 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2		; <i32*> [#uses=1]
+	%reg1321 = load i32, i32* %idx1		; <i32> [#uses=3]
+	%idx2 = getelementptr %spec_fd_t, %spec_fd_t* %reg1311, i64 0, i32 1		; <i32*> [#uses=1]
+	%reg1331 = load i32, i32* %idx2		; <i32> [#uses=1]
+	%cond270 = icmp slt i32 %reg1321, %reg1331		; <i1> [#uses=1]
+	br i1 %cond270, label %bb9, label %bb6
+
+bb6:		; preds = %bb5
+	%reg134 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond271 = icmp sle i32 %reg134, 4		; <i1> [#uses=1]
+; CHECK: br label %bb8
+	br i1 %cond271, label %bb8, label %bb7
+
+bb7:		; preds = %bb6
+	%cast277 = getelementptr [4 x i8], [4 x i8]* @.LC10, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb8
+
+bb8:		; preds = %bb7, %bb6
+	br label %UnifiedExitNode
+
+bb9:		; preds = %bb5
+	%reg107-idxcast3 = sext i32 %fd to i64		; <i64> [#uses=1]
+	%idx3 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast3, i32 3		; <i8**> [#uses=1]
+	%reg1601 = load i8*, i8** %idx3		; <i8*> [#uses=1]
+	%reg132-idxcast1 = sext i32 %reg1321 to i64		; <i64> [#uses=1]
+	%idx4 = getelementptr i8, i8* %reg1601, i64 %reg132-idxcast1		; <i8*> [#uses=1]
+	%reg1621 = load i8, i8* %idx4		; <i8> [#uses=2]
+	%cast108 = zext i8 %reg1621 to i64		; <i64> [#uses=0]
+	%reg157 = add i32 %reg1321, 1		; <i32> [#uses=1]
+	%idx5 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2		; <i32*> [#uses=1]
+	store i32 %reg157, i32* %idx5
+	%reg163 = load i32, i32* @dbglvl		; <i32> [#uses=1]
+	%cond272 = icmp sle i32 %reg163, 4		; <i1> [#uses=1]
+; CHECK: br label %bb11
+	br i1 %cond272, label %bb11, label %bb10
+
+bb10:		; preds = %bb9
+	%cast279 = getelementptr [4 x i8], [4 x i8]* @.LC11, i64 0, i64 0		; <i8*> [#uses=0]
+	br label %bb11
+
+bb11:		; preds = %bb10, %bb9
+	%cast291 = zext i8 %reg1621 to i32		; <i32> [#uses=1]
+	br label %UnifiedExitNode
+
+UnifiedExitNode:		; preds = %bb11, %bb8, %bb4
+	%UnifiedRetVal = phi i32 [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ]		; <i32> [#uses=1]
+	ret i32 %UnifiedRetVal
+}
+
+declare i32 @puts(i8*)
+
+declare i32 @printf(i8*, ...)

Added: llvm/trunk/test/Transforms/ADCE/dce_pure_call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/dce_pure_call.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/dce_pure_call.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/dce_pure_call.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,8 @@
+; RUN: opt -adce -S < %s | not grep call
+
+declare i32 @strlen(i8*) readonly nounwind
+
+define void @test() {
+	call i32 @strlen( i8* null )		; <i32>:1 [#uses=0]
+	ret void
+}

Added: llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/dce_pure_invoke.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,19 @@
+; RUN: opt < %s -adce -S | grep null
+
+declare i32 @strlen(i8*) readnone
+
+define i32 @test() personality i32 (...)* @__gxx_personality_v0 {
+	; invoke of pure function should not be deleted!
+	invoke i32 @strlen( i8* null ) readnone
+			to label %Cont unwind label %Other		; <i32>:1 [#uses=0]
+
+Cont:		; preds = %0
+	ret i32 0
+
+Other:		; preds = %0
+         %exn = landingpad {i8*, i32}
+                  cleanup
+	ret i32 1
+}
+
+declare i32 @__gxx_personality_v0(...)

Added: llvm/trunk/test/Transforms/ADCE/debug-info-intrinsic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/debug-info-intrinsic.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/debug-info-intrinsic.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/debug-info-intrinsic.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,100 @@
+; RUN: opt -adce -S < %s | FileCheck %s
+; Test that debug info intrinsics in dead scopes get eliminated by -adce.
+
+; Generated with 'clang -g -S -emit-llvm | opt -mem2reg -inline' at r262899
+; (before -adce was augmented) and then hand-reduced.  This was the input:
+;
+;;void sink(void);
+;;
+;;void variable_in_unused_subscope(void) {
+;;  { int i = 0; }
+;;  sink();
+;;}
+;;
+;;void variable_in_parent_scope(void) {
+;;  int i = 0;
+;;  { sink(); }
+;;}
+;;
+;;static int empty_function_with_unused_variable(void) {
+;;  { int i = 0; }
+;;  return 0;
+;;}
+;;
+;;void calls_empty_function_with_unused_variable_in_unused_subscope(void) {
+;;  { empty_function_with_unused_variable(); }
+;;  sink();
+;;}
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+declare void @sink()
+
+; CHECK-LABEL: define void @variable_in_unused_subscope(
+define void @variable_in_unused_subscope() !dbg !4 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT:   call void @sink
+; CHECK-NEXT:   ret void
+entry:
+  call void @llvm.dbg.value(metadata i32 0, metadata !15, metadata !17), !dbg !18
+  call void @sink(), !dbg !19
+  ret void, !dbg !20
+}
+
+; CHECK-LABEL: define void @variable_in_parent_scope(
+define void @variable_in_parent_scope() !dbg !7 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT:   call void @llvm.dbg.value
+; CHECK-NEXT:   call void @sink
+; CHECK-NEXT:   ret void
+entry:
+  call void @llvm.dbg.value(metadata i32 0, metadata !21, metadata !17), !dbg !22
+  call void @sink(), !dbg !23
+  ret void, !dbg !25
+}
+
+; CHECK-LABEL: define void @calls_empty_function_with_unused_variable_in_unused_subscope(
+define void @calls_empty_function_with_unused_variable_in_unused_subscope() !dbg !8 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT:   call void @sink
+; CHECK-NEXT:   ret void
+entry:
+  call void @llvm.dbg.value(metadata i32 0, metadata !26, metadata !17), !dbg !28
+  call void @sink(), !dbg !31
+  ret void, !dbg !32
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!14}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "t.c", directory: "/path/to/test/Transforms/ADCE")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "variable_in_unused_subscope", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null}
+!7 = distinct !DISubprogram(name: "variable_in_parent_scope", scope: !1, file: !1, line: 8, type: !5, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!8 = distinct !DISubprogram(name: "calls_empty_function_with_unused_variable_in_unused_subscope", scope: !1, file: !1, line: 18, type: !5, isLocal: false, isDefinition: true, scopeLine: 18, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!10 = distinct !DISubprogram(name: "empty_function_with_unused_variable", scope: !1, file: !1, line: 13, type: !11, isLocal: true, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!11 = !DISubroutineType(types: !12)
+!12 = !{!13}
+!13 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!14 = !{i32 2, !"Debug Info Version", i32 3}
+!15 = !DILocalVariable(name: "i", scope: !16, file: !1, line: 4, type: !13)
+!16 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 3)
+!17 = !DIExpression()
+!18 = !DILocation(line: 4, column: 9, scope: !16)
+!19 = !DILocation(line: 5, column: 3, scope: !4)
+!20 = !DILocation(line: 6, column: 1, scope: !4)
+!21 = !DILocalVariable(name: "i", scope: !7, file: !1, line: 9, type: !13)
+!22 = !DILocation(line: 9, column: 7, scope: !7)
+!23 = !DILocation(line: 10, column: 5, scope: !24)
+!24 = distinct !DILexicalBlock(scope: !7, file: !1, line: 10, column: 3)
+!25 = !DILocation(line: 11, column: 1, scope: !7)
+!26 = !DILocalVariable(name: "i", scope: !27, file: !1, line: 14, type: !13)
+!27 = distinct !DILexicalBlock(scope: !10, file: !1, line: 14, column: 3)
+!28 = !DILocation(line: 14, column: 9, scope: !27, inlinedAt: !29)
+!29 = distinct !DILocation(line: 19, column: 5, scope: !30)
+!30 = distinct !DILexicalBlock(scope: !8, file: !1, line: 19, column: 3)
+!31 = !DILocation(line: 20, column: 3, scope: !8)
+!32 = !DILocation(line: 21, column: 1, scope: !8)

Added: llvm/trunk/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/delete-profiling-calls-to-constant.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,19 @@
+; RUN: opt < %s -adce -S | FileCheck %s
+; RUN: opt < %s -passes=adce -S | FileCheck %s
+
+; Verify that a call to instrument a constant is deleted.
+
+ at __profc_foo = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
+ at __profd_foo = private global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 6699318081062747564, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc_foo, i32 0, i32 0), i8* bitcast (i32 ()* @foo to i8*), i8* null, i32 1, [1 x i16] [i16 1] }, section "__llvm_prf_data", align 8
+
+define i32 @foo() {
+; CHECK-NOT: call void @__llvm_profile_instrument_target
+entry:
+  tail call void @__llvm_profile_instrument_target(i64 ptrtoint (i32 (i32)* @bar to i64), i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd_foo to i8*), i32 0)
+  %call = tail call i32 @bar(i32 21)
+  ret i32 %call
+}
+
+declare i32 @bar(i32)
+
+declare void @__llvm_profile_instrument_target(i64, i8*, i32)

Added: llvm/trunk/test/Transforms/ADCE/domtree-DoubleDeletion.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/domtree-DoubleDeletion.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/domtree-DoubleDeletion.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/domtree-DoubleDeletion.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,39 @@
+; RUN: opt < %s -gvn -simplifycfg -adce | llvm-dis
+; RUN: opt < %s -gvn -simplifycfg -adce -verify-dom-info | llvm-dis
+
+; This test makes sure that the DominatorTree properly handles
+; deletion of edges that go to forward-unreachable regions.
+; In this case, %land.end is already forward unreachable when
+; the DT gets informed about the deletion of %entry -> %land.end.
+
+ at a = common global i32 0, align 4
+
+define i32 @main() {
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, i32* %retval, align 4
+  %0 = load i32, i32* @a, align 4
+  %cmp = icmp ne i32 %0, 1
+  br i1 %cmp, label %land.rhs, label %land.end4
+
+land.rhs:                                         ; preds = %entry
+  %1 = load i32, i32* @a, align 4
+  %tobool = icmp ne i32 %1, 0
+  br i1 %tobool, label %land.rhs1, label %land.end
+
+land.rhs1:                                        ; preds = %land.rhs
+  br label %land.end
+
+land.end:                                         ; preds = %land.rhs1, %land.rhs
+  %2 = phi i1 [ false, %land.rhs ], [ true, %land.rhs1 ]
+  %land.ext = zext i1 %2 to i32
+  %conv = trunc i32 %land.ext to i16
+  %conv2 = sext i16 %conv to i32
+  %tobool3 = icmp ne i32 %conv2, 0
+  br label %land.end4
+
+land.end4:                                        ; preds = %land.end, %entry
+  %3 = phi i1 [ false, %entry ], [ %tobool3, %land.end ]
+  %land.ext5 = zext i1 %3 to i32
+  ret i32 0
+}

Added: llvm/trunk/test/Transforms/ADCE/unreachable-function.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/unreachable-function.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/unreachable-function.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/unreachable-function.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,5 @@
+; RUN: opt < %s -adce -disable-output
+
+define void @test() {
+	unreachable
+}

Added: llvm/trunk/test/Transforms/ADCE/unreachable.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ADCE/unreachable.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ADCE/unreachable.ll (added)
+++ llvm/trunk/test/Transforms/ADCE/unreachable.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,18 @@
+; RUN: opt < %s -adce -simplifycfg | llvm-dis
+; RUN: opt < %s -passes=adce | llvm-dis
+
+define i32 @Test(i32 %A, i32 %B) {
+BB1:
+        br label %BB4
+
+BB2:            ; No predecessors!
+        br label %BB3
+
+BB3:            ; preds = %BB4, %BB2
+        %ret = phi i32 [ %X, %BB4 ], [ %B, %BB2 ]               ; <i32> [#uses=1]
+        ret i32 %ret
+
+BB4:            ; preds = %BB1
+        %X = phi i32 [ %A, %BB1 ]               ; <i32> [#uses=1]
+        br label %BB3
+}

Added: llvm/trunk/test/Transforms/AddDiscriminators/basic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/basic.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/basic.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/basic.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,62 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Basic DWARF discriminator test. All the instructions in block
+; 'if.then' should have a different discriminator value than
+; the conditional branch at the end of block 'entry'.
+;
+; Original code:
+;
+;       void foo(int i) {
+;         int x;
+;         if (i < 10) x = i;
+;       }
+
+define void @foo(i32 %i) #0 !dbg !4 {
+entry:
+  %i.addr = alloca i32, align 4
+  %x = alloca i32, align 4
+  store i32 %i, i32* %i.addr, align 4
+  %0 = load i32, i32* %i.addr, align 4, !dbg !10
+  %cmp = icmp slt i32 %0, 10, !dbg !10
+  br i1 %cmp, label %if.then, label %if.end, !dbg !10
+
+if.then:                                          ; preds = %entry
+  %1 = load i32, i32* %i.addr, align 4, !dbg !10
+; CHECK:  %1 = load i32, i32* %i.addr, align 4, !dbg ![[THEN:[0-9]+]]
+
+  store i32 %1, i32* %x, align 4, !dbg !10
+; CHECK:  store i32 %1, i32* %x, align 4, !dbg ![[THEN]]
+
+  br label %if.end, !dbg !10
+; CHECK:   br label %if.end, !dbg ![[THEN]]
+
+if.end:                                           ; preds = %if.then, %entry
+  ret void, !dbg !12
+; CHECK:   ret void, !dbg ![[END:[0-9]+]]
+}
+
+attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5 ", isOptimized: false, emissionKind: NoDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
+!1 = !DIFile(filename: "basic.c", directory: ".")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, retainedNodes: !2)
+!5 = !DIFile(filename: "basic.c", directory: ".")
+!6 = !DISubroutineType(types: !2)
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 1, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 3.5 "}
+!10 = !DILocation(line: 3, scope: !11)
+!11 = distinct !DILexicalBlock(line: 3, column: 0, file: !1, scope: !4)
+!12 = !DILocation(line: 4, scope: !4)
+
+; CHECK: ![[FOO:[0-9]+]] = distinct !DISubprogram(name: "foo"
+; CHECK: ![[BLOCK:[0-9]+]] = distinct !DILexicalBlock(scope: ![[FOO]],{{.*}} line: 3)
+; CHECK: ![[THEN]] = !DILocation(line: 3, scope: ![[BLOCKFILE:[0-9]+]])
+; CHECK: ![[BLOCKFILE]] = !DILexicalBlockFile(scope: ![[BLOCK]],{{.*}} discriminator: 2)
+; CHECK: ![[END]] = !DILocation(line: 4, scope: ![[FOO]])

Added: llvm/trunk/test/Transforms/AddDiscriminators/call-nested.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/call-nested.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/call-nested.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/call-nested.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Discriminator support for calls that are defined in one line:
+; #1 int foo(int, int);
+; #2 int bar();
+; #3 int baz() {
+; #4   return foo(bar(),
+; #5              bar());
+; #6 }
+
+; Function Attrs: uwtable
+define i32 @_Z3bazv() #0 !dbg !4 {
+  %1 = call i32 @_Z3barv(), !dbg !11
+; CHECK: %1 = call i32 @_Z3barv(), !dbg ![[CALL0:[0-9]+]]
+  %2 = call i32 @_Z3barv(), !dbg !12
+; CHECK: %2 = call i32 @_Z3barv(), !dbg ![[CALL1:[0-9]+]]
+  %3 = call i32 @_Z3fooii(i32 %1, i32 %2), !dbg !13
+; CHECK: %3 = call i32 @_Z3fooii(i32 %1, i32 %2), !dbg ![[CALL2:[0-9]+]]
+  ret i32 %3, !dbg !14
+}
+
+declare i32 @_Z3fooii(i32, i32) #1
+
+declare i32 @_Z3barv() #1
+
+attributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-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 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-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" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!8, !9}
+!llvm.ident = !{!10}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 (trunk 266269)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "test.cc", directory: "")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "baz", linkageName: "_Z3bazv", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{!7}
+!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!8 = !{i32 2, !"Dwarf Version", i32 4}
+!9 = !{i32 2, !"Debug Info Version", i32 3}
+!10 = !{!"clang version 3.9.0 (trunk 266269)"}
+!11 = !DILocation(line: 4, column: 14, scope: !4)
+!12 = !DILocation(line: 5, column: 14, scope: !4)
+!13 = !DILocation(line: 4, column: 10, scope: !4)
+!14 = !DILocation(line: 4, column: 3, scope: !4)
+
+; CHECK: ![[CALL2]] = !DILocation(line: 4, column: 10, scope: ![[CALL2BLOCK:[0-9]+]])
+; CHECK: ![[CALL2BLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 2)

Added: llvm/trunk/test/Transforms/AddDiscriminators/call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/call.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/call.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/call.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,54 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Discriminator support for calls that are defined in one line:
+; #1 void bar();
+; #2
+; #3 void foo() {
+; #4  bar();bar()/*discriminator 2*/;bar()/*discriminator 4*/;
+; #5 }
+
+; Function Attrs: uwtable
+define void @_Z3foov() #0 !dbg !4 {
+  call void @_Z3barv(), !dbg !10
+; CHECK:  call void @_Z3barv(), !dbg ![[CALL0:[0-9]+]]
+  %a = alloca [100 x i8], align 16
+  %b = bitcast [100 x i8]* %a to i8*
+  call void @llvm.lifetime.start.p0i8(i64 100, i8* %b), !dbg !11
+  call void @llvm.lifetime.end.p0i8(i64 100, i8* %b), !dbg !11
+  call void @_Z3barv(), !dbg !11
+; CHECK:  call void @_Z3barv(), !dbg ![[CALL1:[0-9]+]]
+  call void @_Z3barv(), !dbg !12
+; CHECK:  call void @_Z3barv(), !dbg ![[CALL2:[0-9]+]]
+  ret void, !dbg !13
+}
+
+declare void @_Z3barv() #1
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind argmemonly
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind argmemonly
+
+attributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 250915) (llvm/trunk 251830)", isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, enums: !2)
+!1 = !DIFile(filename: "c.cc", directory: "/tmp")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null}
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 3.8.0 (trunk 250915) (llvm/trunk 251830)"}
+!10 = !DILocation(line: 4, column: 3, scope: !4)
+!11 = !DILocation(line: 4, column: 9, scope: !4)
+!12 = !DILocation(line: 4, column: 15, scope: !4)
+!13 = !DILocation(line: 5, column: 1, scope: !4)
+
+; CHECK: ![[CALL1]] = !DILocation(line: 4, column: 9, scope: ![[CALL1BLOCK:[0-9]+]])
+; CHECK: ![[CALL1BLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 2)
+; CHECK: ![[CALL2]] = !DILocation(line: 4, column: 15, scope: ![[CALL2BLOCK:[0-9]+]])
+; CHECK: ![[CALL2BLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 4)

Added: llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/dbg-declare-discriminator.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,33 @@
+; RUN: opt -S -add-discriminators < %s | FileCheck %s
+; RUN: opt -S -passes=add-discriminators < %s | FileCheck %s
+
+declare void @llvm.dbg.declare(metadata, metadata, metadata)
+
+; This checks whether the add-discriminators pass producess valid metadata on
+; llvm.dbg.declare instructions
+;
+; CHECK-LABEL: @test_valid_metadata
+define void @test_valid_metadata() {
+  %a = alloca i8
+  call void @llvm.dbg.declare(metadata i8* %a, metadata !2, metadata !5), !dbg !6
+  %b = alloca i8
+  call void @llvm.dbg.declare(metadata i8* %b, metadata !9, metadata !5), !dbg !11
+  ret void
+}
+
+!llvm.module.flags = !{!0, !1}
+!llvm.dbg.cu = !{!12}
+
+!0 = !{i32 2, !"Dwarf Version", i32 4}
+!1 = !{i32 2, !"Debug Info Version", i32 3}
+!2 = !DILocalVariable(scope: !3)
+!3 = distinct !DISubprogram(scope: null, file: !4, isLocal: false, isDefinition: true, isOptimized: false, unit: !12)
+!4 = !DIFile(filename: "a.cpp", directory: "/tmp")
+!5 = !DIExpression()
+!6 = !DILocation(line: 0, scope: !3, inlinedAt: !7)
+!7 = distinct !DILocation(line: 0, scope: !8)
+!8 = distinct !DISubprogram(linkageName: "test_valid_metadata", scope: null, isLocal: false, isDefinition: true, isOptimized: false, unit: !12)
+!9 = !DILocalVariable(scope: !10)
+!10 = distinct !DISubprogram(scope: null, file: !4, isLocal: false, isDefinition: true, isOptimized: false, unit: !12)
+!11 = !DILocation(line: 0, scope: !10)
+!12 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5 ", isOptimized: false, emissionKind: FullDebug, file: !4)

Added: llvm/trunk/test/Transforms/AddDiscriminators/diamond.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/diamond.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/diamond.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/diamond.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,72 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Discriminator support for diamond-shaped CFG.:
+; #1 void bar(int);
+; #2 
+; #3 void foo(int i) {
+; #4   if (i > 10)
+; #5     bar(5); else bar(3);
+; #6 }
+
+; bar(5):     discriminator 0
+; bar(3):     discriminator 2
+
+; Function Attrs: uwtable
+define void @_Z3fooi(i32 %i) #0 !dbg !4 {
+  %1 = alloca i32, align 4
+  store i32 %i, i32* %1, align 4
+  call void @llvm.dbg.declare(metadata i32* %1, metadata !11, metadata !12), !dbg !13
+  %2 = load i32, i32* %1, align 4, !dbg !14
+  %3 = icmp sgt i32 %2, 10, !dbg !16
+  br i1 %3, label %4, label %5, !dbg !17
+
+; <label>:4                                       ; preds = %0
+  call void @_Z3bari(i32 5), !dbg !18
+  br label %6, !dbg !18
+
+; <label>:5                                       ; preds = %0
+  call void @_Z3bari(i32 3), !dbg !19
+; CHECK:  call void @_Z3bari(i32 3), !dbg ![[ELSE:[0-9]+]]
+  br label %6
+
+; <label>:6                                       ; preds = %5, %4
+  ret void, !dbg !20
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+declare void @_Z3bari(i32) #2
+
+attributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readnone }
+attributes #2 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!8, !9}
+!llvm.ident = !{!10}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 253273)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "a.cc", directory: "/tmp")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{null, !7}
+!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!8 = !{i32 2, !"Dwarf Version", i32 4}
+!9 = !{i32 2, !"Debug Info Version", i32 3}
+!10 = !{!"clang version 3.8.0 (trunk 253273)"}
+!11 = !DILocalVariable(name: "i", arg: 1, scope: !4, file: !1, line: 3, type: !7)
+!12 = !DIExpression()
+!13 = !DILocation(line: 3, column: 14, scope: !4)
+!14 = !DILocation(line: 4, column: 7, scope: !15)
+!15 = distinct !DILexicalBlock(scope: !4, file: !1, line: 4, column: 7)
+!16 = !DILocation(line: 4, column: 9, scope: !15)
+!17 = !DILocation(line: 4, column: 7, scope: !4)
+!18 = !DILocation(line: 5, column: 5, scope: !15)
+!19 = !DILocation(line: 5, column: 18, scope: !15)
+!20 = !DILocation(line: 6, column: 1, scope: !4)
+
+; CHECK: ![[ELSE]] = !DILocation(line: 5, column: 18, scope: ![[ELSEBLOCK:[0-9]+]])
+; CHECK: ![[ELSEBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 2)

Added: llvm/trunk/test/Transforms/AddDiscriminators/first-only.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/first-only.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/first-only.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/first-only.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,83 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Test that the only instructions that receive a new discriminator in
+; the block 'if.then' are those that share the same line number as
+; the branch in 'entry'.
+;
+; Original code:
+;
+;       void foo(int i) {
+;         int x, y;
+;         if (i < 10) { x = i;
+;             y = -i;
+;         }
+;       }
+
+define void @foo(i32 %i) #0 !dbg !4 {
+entry:
+  %i.addr = alloca i32, align 4
+  %x = alloca i32, align 4
+  %y = alloca i32, align 4
+  store i32 %i, i32* %i.addr, align 4
+  %0 = load i32, i32* %i.addr, align 4, !dbg !10
+  %cmp = icmp slt i32 %0, 10, !dbg !10
+  br i1 %cmp, label %if.then, label %if.end, !dbg !10
+
+if.then:                                          ; preds = %entry
+  %1 = load i32, i32* %i.addr, align 4, !dbg !12
+  store i32 %1, i32* %x, align 4, !dbg !12
+
+  %2 = load i32, i32* %i.addr, align 4, !dbg !14
+; CHECK:  %2 = load i32, i32* %i.addr, align 4, !dbg ![[THEN:[0-9]+]]
+
+  %sub = sub nsw i32 0, %2, !dbg !14
+; CHECK:  %sub = sub nsw i32 0, %2, !dbg ![[THEN]]
+
+  store i32 %sub, i32* %y, align 4, !dbg !14
+; CHECK:  store i32 %sub, i32* %y, align 4, !dbg ![[THEN]]
+
+  br label %if.end, !dbg !15
+; CHECK:  br label %if.end, !dbg ![[BR:[0-9]+]]
+
+if.end:                                           ; preds = %if.then, %entry
+  ret void, !dbg !16
+; CHECK:  ret void, !dbg ![[END:[0-9]+]]
+}
+
+attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5 (trunk 199750) (llvm/trunk 199751)", isOptimized: false, emissionKind: NoDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
+!1 = !DIFile(filename: "first-only.c", directory: ".")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, retainedNodes: !2)
+!5 = !DIFile(filename: "first-only.c", directory: ".")
+!6 = !DISubroutineType(types: !{null})
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 1, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 3.5 (trunk 199750) (llvm/trunk 199751)"}
+!10 = !DILocation(line: 3, scope: !11)
+
+!11 = distinct !DILexicalBlock(line: 3, column: 0, file: !1, scope: !4)
+; CHECK: ![[FOO:[0-9]+]] = distinct !DISubprogram(name: "foo"
+; CHECK: ![[BLOCK1:[0-9]+]] = distinct !DILexicalBlock(scope: ![[FOO]],{{.*}} line: 3)
+
+!12 = !DILocation(line: 3, scope: !13)
+
+!13 = distinct !DILexicalBlock(line: 3, column: 0, file: !1, scope: !11)
+; CHECK: !DILexicalBlockFile(scope: ![[BLOCK2:[0-9]+]],{{.*}} discriminator: 2)
+
+!14 = !DILocation(line: 4, scope: !13)
+; CHECK: ![[BLOCK2]] = distinct !DILexicalBlock(scope: ![[BLOCK1]],{{.*}} line: 3)
+
+!15 = !DILocation(line: 5, scope: !13)
+; CHECK: ![[THEN]] = !DILocation(line: 4, scope: ![[BLOCK2]])
+
+!16 = !DILocation(line: 6, scope: !4)
+; CHECK: ![[BR]] = !DILocation(line: 5, scope: ![[BLOCK2]])
+; CHECK: ![[END]] = !DILocation(line: 6, scope: ![[FOO]])
+

Added: llvm/trunk/test/Transforms/AddDiscriminators/inlined.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/inlined.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/inlined.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/inlined.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,83 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+;
+; Generated at -O3 from:
+; g();f(){for(;;){g();}}g(){__builtin___memset_chk(0,0,0,__builtin_object_size(1,0));}
+; The fact that everything is on one line is significant!
+;
+; This test ensures that inline info isn't dropped even if the call site and the
+; inlined function are defined on the same line.
+source_filename = "t.c"
+target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
+target triple = "arm64-apple-ios"
+
+; Function Attrs: noreturn nounwind ssp
+define i32 @f() local_unnamed_addr #0 !dbg !7 {
+entry:
+  %0 = tail call i64 @llvm.objectsize.i64.p0i8(i8* inttoptr (i64 1 to i8*), i1 false) #2, !dbg !11
+  br label %for.cond, !dbg !18
+
+for.cond:                                         ; preds = %for.cond, %entry
+  ; CHECK: %call.i
+  %call.i = tail call i8* @__memset_chk(i8* null, i32 0, i64 0, i64 %0) #2, !dbg !19 
+  ; CHECK: br label %for.cond, !dbg ![[BR:[0-9]+]]
+  br label %for.cond, !dbg !20, !llvm.loop !21
+}
+
+; Function Attrs: nounwind ssp
+define i32 @g() local_unnamed_addr #1 !dbg !12 {
+entry:
+  %0 = tail call i64 @llvm.objectsize.i64.p0i8(i8* inttoptr (i64 1 to i8*), i1 false), !dbg !22
+  %call = tail call i8* @__memset_chk(i8* null, i32 0, i64 0, i64 %0) #2, !dbg !23
+  ret i32 undef, !dbg !24
+}
+
+; Function Attrs: nounwind
+declare i8* @__memset_chk(i8*, i32, i64, i64) local_unnamed_addr #2
+
+; Function Attrs: nounwind readnone
+declare i64 @llvm.objectsize.i64.p0i8(i8*, i1) #3
+
+attributes #0 = { noreturn nounwind ssp }
+attributes #1 = { nounwind ssp  }
+attributes #2 = { nounwind }
+attributes #3 = { nounwind readnone }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5}
+!llvm.ident = !{!6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM version 4.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "t.c", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"PIC Level", i32 2}
+!6 = !{!"LLVM version 4.0.0"}
+; CHECK: ![[F:.*]] = distinct !DISubprogram(name: "f",
+!7 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !2)
+!8 = !DISubroutineType(types: !9)
+!9 = !{!10}
+!10 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!11 = !DILocation(line: 1, column: 56, scope: !12, inlinedAt: !13)
+!12 = distinct !DISubprogram(name: "g", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !2)
+!13 = distinct !DILocation(line: 1, column: 17, scope: !14)
+; CHECK: ![[BF:.*]] = !DILexicalBlockFile(scope: ![[LB1:[0-9]+]],
+; CHECK-SAME:                             discriminator: 2)
+!14 = !DILexicalBlockFile(scope: !15, file: !1, discriminator: 2)
+; CHECK: ![[LB1]] = distinct !DILexicalBlock(scope: ![[LB2:[0-9]+]],
+; CHECK-SAME:                                line: 1, column: 16)
+!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 1, column: 16)
+; CHECK: ![[LB2]] = distinct !DILexicalBlock(scope: ![[LB3:[0-9]+]],
+; CHECK-SAME:                                line: 1, column: 9)
+!16 = distinct !DILexicalBlock(scope: !17, file: !1, line: 1, column: 9)
+; CHECK: ![[LB3]] = distinct !DILexicalBlock(scope: ![[F]],
+; CHECK-SAME:                                line: 1, column: 9)
+!17 = distinct !DILexicalBlock(scope: !7, file: !1, line: 1, column: 9)
+!18 = !DILocation(line: 1, column: 9, scope: !7)
+!19 = !DILocation(line: 1, column: 27, scope: !12, inlinedAt: !13)
+; CHECK: ![[BR]] =  !DILocation(line: 1, column: 9, scope: !14)
+!20 = !DILocation(line: 1, column: 9, scope: !14)
+!21 = distinct !{!21, !18}
+!22 = !DILocation(line: 1, column: 56, scope: !12)
+!23 = !DILocation(line: 1, column: 27, scope: !12)
+!24 = !DILocation(line: 1, column: 84, scope: !12)

Added: llvm/trunk/test/Transforms/AddDiscriminators/invoke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/invoke.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/invoke.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/invoke.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,134 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; ModuleID = 'invoke.bc'
+source_filename = "invoke.cpp"
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.14.0"
+
+; Function Attrs: ssp uwtable
+define void @_Z3foov() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !dbg !8 {
+entry:
+  %exn.slot = alloca i8*
+  %ehselector.slot = alloca i32
+  ; CHECK: call void @_Z12bar_noexceptv({{.*}} !dbg ![[CALL1:[0-9]+]]
+  call void @_Z12bar_noexceptv() #4, !dbg !11
+  ; CHECK: call void @_Z12bar_noexceptv({{.*}} !dbg ![[CALL2:[0-9]+]]
+  call void @_Z12bar_noexceptv() #4, !dbg !13
+  invoke void @_Z3barv()
+  ; CHECK: unwind label {{.*}} !dbg ![[INVOKE:[0-9]+]]
+          to label %invoke.cont unwind label %lpad, !dbg !14
+
+invoke.cont:                                      ; preds = %entry
+  br label %try.cont, !dbg !15
+
+lpad:                                             ; preds = %entry
+  %0 = landingpad { i8*, i32 }
+          catch i8* null, !dbg !16
+  %1 = extractvalue { i8*, i32 } %0, 0, !dbg !16
+  store i8* %1, i8** %exn.slot, align 8, !dbg !16
+  %2 = extractvalue { i8*, i32 } %0, 1, !dbg !16
+  store i32 %2, i32* %ehselector.slot, align 4, !dbg !16
+  br label %catch, !dbg !16
+
+catch:                                            ; preds = %lpad
+  %exn = load i8*, i8** %exn.slot, align 8, !dbg !15
+  %3 = call i8* @__cxa_begin_catch(i8* %exn) #4, !dbg !15
+  invoke void @__cxa_rethrow() #5
+          to label %unreachable unwind label %lpad1, !dbg !17
+
+lpad1:                                            ; preds = %catch
+  %4 = landingpad { i8*, i32 }
+          cleanup, !dbg !19
+  %5 = extractvalue { i8*, i32 } %4, 0, !dbg !19
+  store i8* %5, i8** %exn.slot, align 8, !dbg !19
+  %6 = extractvalue { i8*, i32 } %4, 1, !dbg !19
+  store i32 %6, i32* %ehselector.slot, align 4, !dbg !19
+  invoke void @__cxa_end_catch()
+          to label %invoke.cont2 unwind label %terminate.lpad, !dbg !20
+
+invoke.cont2:                                     ; preds = %lpad1
+  br label %eh.resume, !dbg !20
+
+try.cont:                                         ; preds = %invoke.cont
+  ret void, !dbg !21
+
+eh.resume:                                        ; preds = %invoke.cont2
+  %exn3 = load i8*, i8** %exn.slot, align 8, !dbg !20
+  %sel = load i32, i32* %ehselector.slot, align 4, !dbg !20
+  %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn3, 0, !dbg !20
+  %lpad.val4 = insertvalue { i8*, i32 } %lpad.val, i32 %sel, 1, !dbg !20
+  resume { i8*, i32 } %lpad.val4, !dbg !20
+
+terminate.lpad:                                   ; preds = %lpad1
+  %7 = landingpad { i8*, i32 }
+          catch i8* null, !dbg !20
+  %8 = extractvalue { i8*, i32 } %7, 0, !dbg !20
+  call void @__clang_call_terminate(i8* %8) #6, !dbg !20
+  unreachable, !dbg !20
+
+unreachable:                                      ; preds = %catch
+  unreachable
+}
+
+; Function Attrs: nounwind
+declare void @_Z12bar_noexceptv() #1
+
+declare void @_Z3barv() #2
+
+declare i32 @__gxx_personality_v0(...)
+
+declare i8* @__cxa_begin_catch(i8*)
+
+declare void @__cxa_rethrow()
+
+declare void @__cxa_end_catch()
+
+; Function Attrs: noinline noreturn nounwind
+define linkonce_odr hidden void @__clang_call_terminate(i8*) #3 {
+  %2 = call i8* @__cxa_begin_catch(i8* %0) #4
+  call void @_ZSt9terminatev() #6
+  unreachable
+}
+
+declare void @_ZSt9terminatev()
+
+attributes #0 = { ssp uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #2 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #3 = { noinline noreturn nounwind }
+attributes #4 = { nounwind }
+attributes #5 = { noreturn }
+attributes #6 = { noreturn nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5, !6}
+!llvm.ident = !{!7}
+
+; CHECK: ![[CALL1]] = !DILocation(line: 7, column: 5, scope: ![[SCOPE1:[0-9]+]])
+; CHECK: ![[SCOPE1]] = distinct !DILexicalBlock(scope: !8, file: !1, line: 6, column: 7)
+; CHECK: ![[CALL2]] = !DILocation(line: 7, column: 21, scope: ![[SCOPE2:[0-9]+]])
+; CHECK: ![[SCOPE2]] = !DILexicalBlockFile(scope: ![[SCOPE1]], file: !1, discriminator: 2)
+; CHECK: ![[INVOKE]] = !DILocation(line: 7, column: 37, scope: ![[SCOPE3:[0-9]+]])
+; CHECK: ![[SCOPE3]] = !DILexicalBlockFile(scope: ![[SCOPE1]], file: !1, discriminator: 4)
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 8.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: GNU)
+!1 = !DIFile(filename: "invoke.cpp", directory: "examples")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 4}
+!6 = !{i32 7, !"PIC Level", i32 2}
+!7 = !{!"clang version 8.0.0"}
+!8 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
+!9 = !DISubroutineType(types: !10)
+!10 = !{null}
+!11 = !DILocation(line: 7, column: 5, scope: !12)
+!12 = distinct !DILexicalBlock(scope: !8, file: !1, line: 6, column: 7)
+!13 = !DILocation(line: 7, column: 21, scope: !12)
+!14 = !DILocation(line: 7, column: 37, scope: !12)
+!15 = !DILocation(line: 8, column: 3, scope: !12)
+!16 = !DILocation(line: 12, column: 1, scope: !12)
+!17 = !DILocation(line: 10, column: 5, scope: !18)
+!18 = distinct !DILexicalBlock(scope: !8, file: !1, line: 9, column: 15)
+!19 = !DILocation(line: 12, column: 1, scope: !18)
+!20 = !DILocation(line: 11, column: 3, scope: !18)
+!21 = !DILocation(line: 12, column: 1, scope: !8)

Added: llvm/trunk/test/Transforms/AddDiscriminators/memcpy-discriminator.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/memcpy-discriminator.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/memcpy-discriminator.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/memcpy-discriminator.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,104 @@
+; RUN: opt < %s -add-discriminators -sroa -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+; Test case obtained from the following C code:
+
+; struct A {
+;  int field1;
+;  short field2;
+; };
+;
+; struct B {
+;   struct A field1;
+;   int field2;
+; };
+;
+;
+; extern struct B g_b;
+; extern int bar(struct B b, int c);
+;
+; int foo(int cond) {
+;   int result = cond ? bar(g_b, 33) : 42;
+;   return result;
+; }
+
+; In this test, global variable g_b is passed by copy to function bar. That
+; copy is located on the stack (see alloca %g_b.coerce), and it is initialized
+; by a memcpy call.
+;
+; SROA would split alloca %g_b.coerce into two (smaller disjoint) slices:
+; slice [0,8) and slice [8, 12). Users of the original alloca are rewritten
+; as users of the new alloca slices.
+; In particular, the memcpy is rewritten by SROA as two load/store pairs.
+;
+; Later on, mem2reg successfully promotes the new alloca slices to registers,
+; and loads %3 and %5 are made redundant by the loads obtained from the memcpy
+; intrinsic expansion.
+;
+; If pass AddDiscriminators doesn't assign a discriminator to the intrinsic
+; memcpy call, then the loads obtained from the memcpy expansion would not have
+; a correct discriminator.
+;
+; This test checks that the two new loads inserted by SROA in %cond.true
+; correctly reference a debug location with a non-zero discriminator. This test
+; also checks that the same discriminator is used by all instructions from
+; basic block %cond.true.
+
+%struct.B = type { %struct.A, i32 }
+%struct.A = type { i32, i16 }
+
+ at g_b = external global %struct.B, align 4
+
+define i32 @foo(i32 %cond) #0 !dbg !5 {
+entry:
+  %g_b.coerce = alloca { i64, i32 }, align 4
+  %tobool = icmp ne i32 %cond, 0, !dbg !7
+  br i1 %tobool, label %cond.true, label %cond.end, !dbg !7
+
+cond.true:
+; CHECK-LABEL: cond.true:
+; CHECK:       load i64, {{.*}}, !dbg ![[LOC:[0-9]+]]
+; CHECK-NEXT:  load i32, {{.*}}, !dbg ![[LOC]]
+; CHECK-NEXT:  %call = call i32 @bar({{.*}}), !dbg ![[LOC]]
+; CHECK-NEXT:  br label %cond.end, !dbg ![[BR_LOC:[0-9]+]]
+
+; CHECK-DAG: ![[LOC]] = !DILocation(line: 16, column: 23, scope: ![[SCOPE:[0-9]+]])
+; CHECK-DAG: ![[SCOPE]] = !DILexicalBlockFile({{.*}}, discriminator: 2)
+; CHECK-DAG: ![[BR_LOC]] = !DILocation(line: 16, column: 16, scope: ![[SCOPE]])
+
+  %0 = bitcast { i64, i32 }* %g_b.coerce to i8*, !dbg !8
+  %1 = bitcast %struct.B* @g_b to i8*, !dbg !8
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 12, i1 false), !dbg !8
+  %2 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %g_b.coerce, i32 0, i32 0, !dbg !8
+  %3 = load i64, i64* %2, align 4, !dbg !8
+  %4 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %g_b.coerce, i32 0, i32 1, !dbg !8
+  %5 = load i32, i32* %4, align 4, !dbg !8
+  %call = call i32 @bar(i64 %3, i32 %5, i32 33), !dbg !8
+  br label %cond.end, !dbg !7
+
+cond.end:                                         ; preds = %entry, %cond.true
+  %cond1 = phi i32 [ %call, %cond.true ], [ 42, %entry ], !dbg !7
+  ret i32 %cond1, !dbg !9
+}
+
+declare i32 @bar(i64, i32, i32)
+
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #1
+
+attributes #0 = { noinline nounwind uwtable }
+attributes #1 = { argmemonly nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
+!1 = !DIFile(filename: "test.c", directory: ".")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 15, type: !6, isLocal: false, isDefinition: true, scopeLine: 15, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
+!6 = !DISubroutineType(types: !2)
+!7 = !DILocation(line: 16, column: 16, scope: !5)
+!8 = !DILocation(line: 16, column: 23, scope: !5)
+!9 = !DILocation(line: 17, column: 3, scope: !5)

Added: llvm/trunk/test/Transforms/AddDiscriminators/multiple.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/multiple.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/multiple.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/multiple.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,72 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Discriminator support for multiple CFG paths on the same line.
+;
+;       void foo(int i) {
+;         int x;
+;         if (i < 10) x = i; else x = -i;
+;       }
+;
+; The two stores inside the if-then-else line must have different discriminator
+; values.
+
+define void @foo(i32 %i) #0 !dbg !4 {
+entry:
+  %i.addr = alloca i32, align 4
+  %x = alloca i32, align 4
+  store i32 %i, i32* %i.addr, align 4
+  %0 = load i32, i32* %i.addr, align 4, !dbg !10
+  %cmp = icmp slt i32 %0, 10, !dbg !10
+  br i1 %cmp, label %if.then, label %if.else, !dbg !10
+
+if.then:                                          ; preds = %entry
+  %1 = load i32, i32* %i.addr, align 4, !dbg !10
+; CHECK:  %1 = load i32, i32* %i.addr, align 4, !dbg ![[THEN:[0-9]+]]
+
+  store i32 %1, i32* %x, align 4, !dbg !10
+; CHECK:  store i32 %1, i32* %x, align 4, !dbg ![[THEN]]
+
+  br label %if.end, !dbg !10
+; CHECK:  br label %if.end, !dbg ![[THEN]]
+
+if.else:                                          ; preds = %entry
+  %2 = load i32, i32* %i.addr, align 4, !dbg !10
+; CHECK:  %2 = load i32, i32* %i.addr, align 4, !dbg ![[ELSE:[0-9]+]]
+
+  %sub = sub nsw i32 0, %2, !dbg !10
+; CHECK:  %sub = sub nsw i32 0, %2, !dbg ![[ELSE]]
+
+  store i32 %sub, i32* %x, align 4, !dbg !10
+; CHECK:  store i32 %sub, i32* %x, align 4, !dbg ![[ELSE]]
+
+  br label %if.end
+
+if.end:                                           ; preds = %if.else, %if.then
+  ret void, !dbg !12
+}
+
+attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5 (trunk 199750) (llvm/trunk 199751)", isOptimized: false, emissionKind: NoDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
+!1 = !DIFile(filename: "multiple.c", directory: ".")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, retainedNodes: !2)
+!5 = !DIFile(filename: "multiple.c", directory: ".")
+!6 = !DISubroutineType(types: !{null, !13})
+!13 = !DIBasicType(encoding: DW_ATE_signed, name: "int", size: 32, align: 32)
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 1, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 3.5 (trunk 199750) (llvm/trunk 199751)"}
+!10 = !DILocation(line: 3, scope: !11)
+!11 = distinct !DILexicalBlock(line: 3, column: 0, file: !1, scope: !4)
+!12 = !DILocation(line: 4, scope: !4)
+
+; CHECK: ![[THEN]] = !DILocation(line: 3, scope: ![[THENBLOCK:[0-9]+]])
+; CHECK: ![[THENBLOCK]] = !DILexicalBlockFile(scope: ![[SCOPE:[0-9]+]],{{.*}} discriminator: 2)
+; CHECK: ![[ELSE]] = !DILocation(line: 3, scope: ![[ELSEBLOCK:[0-9]+]])
+; CHECK: ![[ELSEBLOCK]] = !DILexicalBlockFile(scope: ![[SCOPE]],{{.*}} discriminator: 4)

Added: llvm/trunk/test/Transforms/AddDiscriminators/no-discriminators.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/no-discriminators.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/no-discriminators.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/no-discriminators.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,76 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; We should not generate discriminators for DWARF versions prior to 4.
+;
+; Original code:
+;
+; int foo(long i) {
+;   if (i < 5) return 2; else return 90;
+; }
+;
+; None of the !dbg nodes associated with the if() statement should be
+; altered. If they are, it means that the discriminators pass added a
+; new lexical scope.
+
+define i32 @foo(i64 %i) #0 !dbg !4 {
+entry:
+  %retval = alloca i32, align 4
+  %i.addr = alloca i64, align 8
+  store i64 %i, i64* %i.addr, align 8
+  call void @llvm.dbg.declare(metadata i64* %i.addr, metadata !13, metadata !DIExpression()), !dbg !14
+  %0 = load i64, i64* %i.addr, align 8, !dbg !15
+; CHECK:  %0 = load i64, i64* %i.addr, align 8, !dbg ![[ENTRY:[0-9]+]]
+  %cmp = icmp slt i64 %0, 5, !dbg !15
+; CHECK:  %cmp = icmp slt i64 %0, 5, !dbg ![[ENTRY:[0-9]+]]
+  br i1 %cmp, label %if.then, label %if.else, !dbg !15
+; CHECK:  br i1 %cmp, label %if.then, label %if.else, !dbg ![[ENTRY:[0-9]+]]
+
+if.then:                                          ; preds = %entry
+  store i32 2, i32* %retval, !dbg !15
+  br label %return, !dbg !15
+
+if.else:                                          ; preds = %entry
+  store i32 90, i32* %retval, !dbg !15
+  br label %return, !dbg !15
+
+return:                                           ; preds = %if.else, %if.then
+  %1 = load i32, i32* %retval, !dbg !17
+  ret i32 %1, !dbg !17
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readnone }
+
+; We should be able to add discriminators even in the absence of llvm.dbg.cu.
+; When using sample profiles, the front end will generate line tables but it
+; does not generate llvm.dbg.cu to prevent codegen from emitting debug info
+; to the final binary.
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!10, !11}
+!llvm.ident = !{!12}
+
+; CHECK: !{i32 2, !"Dwarf Version", i32 2}
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
+!1 = !DIFile(filename: "no-discriminators", directory: ".")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !1, scope: !5, type: !6, retainedNodes: !2)
+; CHECK: ![[FOO:[0-9]+]] = distinct !DISubprogram(name: "foo"
+!5 = !DIFile(filename: "no-discriminators", directory: ".")
+!6 = !DISubroutineType(types: !7)
+!7 = !{!8, !9}
+!8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!9 = !DIBasicType(tag: DW_TAG_base_type, name: "long int", size: 64, align: 64, encoding: DW_ATE_signed)
+!10 = !{i32 2, !"Dwarf Version", i32 2}
+!11 = !{i32 1, !"Debug Info Version", i32 3}
+!12 = !{!"clang version 3.5.0 "}
+!13 = !DILocalVariable(name: "i", line: 1, arg: 1, scope: !4, file: !5, type: !9)
+!14 = !DILocation(line: 1, scope: !4)
+!15 = !DILocation(line: 2, scope: !16)
+; CHECK: ![[ENTRY]] = !DILocation(line: 2, scope: ![[BLOCK:[0-9]+]])
+!16 = distinct !DILexicalBlock(line: 2, column: 0, file: !1, scope: !4)
+; CHECK: ![[BLOCK]] = distinct !DILexicalBlock(scope: ![[FOO]],{{.*}} line: 2)
+!17 = !DILocation(line: 3, scope: !4)

Added: llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll (added)
+++ llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,101 @@
+; RUN: opt < %s -add-discriminators -S | FileCheck %s
+; RUN: opt < %s -passes=add-discriminators -S | FileCheck %s
+
+; Discriminator support for code that is written in one line:
+; #1 int foo(int i) {
+; #2   if (i == 3 || i == 5) return 100; else return 99;
+; #3 }
+
+; i == 3:     discriminator 0
+; i == 5:     discriminator 2
+; return 100: discriminator 4
+; return 99:  discriminator 6
+
+define i32 @_Z3fooi(i32 %i) #0 !dbg !4 {
+  %1 = alloca i32, align 4
+  %2 = alloca i32, align 4
+  store i32 %i, i32* %2, align 4, !tbaa !13
+  call void @llvm.dbg.declare(metadata i32* %2, metadata !9, metadata !17), !dbg !18
+  %3 = load i32, i32* %2, align 4, !dbg !19, !tbaa !13
+  %4 = icmp eq i32 %3, 3, !dbg !21
+  br i1 %4, label %8, label %5, !dbg !22
+
+; <label>:5                                       ; preds = %0
+  %6 = load i32, i32* %2, align 4, !dbg !23, !tbaa !13
+; CHECK:  %6 = load i32, i32* %2, align 4, !dbg ![[THEN1:[0-9]+]],{{.*}}
+
+  %7 = icmp eq i32 %6, 5, !dbg !24
+; CHECK:  %7 = icmp eq i32 %6, 5, !dbg ![[THEN2:[0-9]+]]
+
+  br i1 %7, label %8, label %9, !dbg !25
+; CHECK:  br i1 %7, label %8, label %9, !dbg ![[THEN3:[0-9]+]]
+
+; <label>:8                                       ; preds = %5, %0
+  store i32 100, i32* %1, align 4, !dbg !26
+; CHECK: store i32 100, i32* %1, align 4, !dbg ![[ELSE:[0-9]+]]
+
+  br label %10, !dbg !26
+; CHECK: br label %10, !dbg ![[ELSE]]
+
+; <label>:9                                       ; preds = %5
+  store i32 99, i32* %1, align 4, !dbg !27
+; CHECK: store i32 99, i32* %1, align 4, !dbg ![[COMBINE:[0-9]+]]
+
+  br label %10, !dbg !27
+; CHECK: br label %10, !dbg ![[COMBINE]]
+
+; <label>:10                                      ; preds = %9, %8
+  %11 = load i32, i32* %1, align 4, !dbg !28
+  ret i32 %11, !dbg !28
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readnone }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!10, !11}
+!llvm.ident = !{!12}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 250915)", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug, enums: !2)
+!1 = !DIFile(filename: "a.cc", directory: "/usr/local/google/home/dehao/discr")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !8)
+!5 = !DISubroutineType(types: !6)
+!6 = !{!7, !7}
+!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!8 = !{!9}
+!9 = !DILocalVariable(name: "i", arg: 1, scope: !4, file: !1, line: 1, type: !7)
+!10 = !{i32 2, !"Dwarf Version", i32 4}
+!11 = !{i32 2, !"Debug Info Version", i32 3}
+!12 = !{!"clang version 3.8.0 (trunk 250915)"}
+!13 = !{!14, !14, i64 0}
+!14 = !{!"int", !15, i64 0}
+!15 = !{!"omnipotent char", !16, i64 0}
+!16 = !{!"Simple C/C++ TBAA"}
+!17 = !DIExpression()
+!18 = !DILocation(line: 1, column: 13, scope: !4)
+!19 = !DILocation(line: 2, column: 7, scope: !20)
+!20 = distinct !DILexicalBlock(scope: !4, file: !1, line: 2, column: 7)
+!21 = !DILocation(line: 2, column: 9, scope: !20)
+!22 = !DILocation(line: 2, column: 14, scope: !20)
+!23 = !DILocation(line: 2, column: 17, scope: !20)
+!24 = !DILocation(line: 2, column: 19, scope: !20)
+!25 = !DILocation(line: 2, column: 7, scope: !4)
+!26 = !DILocation(line: 2, column: 25, scope: !20)
+!27 = !DILocation(line: 2, column: 42, scope: !20)
+!28 = !DILocation(line: 3, column: 1, scope: !4)
+
+; CHECK: ![[F:.*]] = distinct !DISubprogram(name: "foo",
+; CHECK: ![[IF:.*]] = distinct !DILexicalBlock(scope: ![[F]],{{.*}}line: 2, column: 7)
+; CHECK: ![[THEN1]] = !DILocation(line: 2, column: 17, scope: ![[THENBLOCK:[0-9]+]])
+; CHECK: ![[THENBLOCK]] = !DILexicalBlockFile(scope: ![[IF]],{{.*}} discriminator: 2)
+; CHECK: ![[THEN2]] = !DILocation(line: 2, column: 19, scope: ![[THENBLOCK]])
+; CHECK: ![[THEN3]] = !DILocation(line: 2, column: 7, scope: ![[BRBLOCK:[0-9]+]])
+; CHECK: ![[BRBLOCK]] = !DILexicalBlockFile(scope: ![[F]],{{.*}} discriminator: 2)
+; CHECK: ![[ELSE]] = !DILocation(line: 2, column: 25, scope: ![[ELSEBLOCK:[0-9]+]])
+; CHECK: ![[ELSEBLOCK]] = !DILexicalBlockFile(scope: ![[IF]],{{.*}} discriminator: 4)
+; CHECK: ![[COMBINE]] = !DILocation(line: 2, column: 42, scope: ![[COMBINEBLOCK:[0-9]+]])
+; CHECK: ![[COMBINEBLOCK]] = !DILexicalBlockFile(scope: ![[IF]],{{.*}} discriminator: 6)

Added: llvm/trunk/test/Transforms/AggressiveInstCombine/masked-cmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AggressiveInstCombine/masked-cmp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AggressiveInstCombine/masked-cmp.ll (added)
+++ llvm/trunk/test/Transforms/AggressiveInstCombine/masked-cmp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,235 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
+
+; PR37098 - https://bugs.llvm.org/show_bug.cgi?id=37098
+
+define i32 @anyset_two_bit_mask(i32 %x) {
+; CHECK-LABEL: @anyset_two_bit_mask(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 9
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i32
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %s = lshr i32 %x, 3
+  %o = or i32 %s, %x
+  %r = and i32 %o, 1
+  ret i32 %r
+}
+
+define i32 @anyset_four_bit_mask(i32 %x) {
+; CHECK-LABEL: @anyset_four_bit_mask(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 297
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i32
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %t1 = lshr i32 %x, 3
+  %t2 = lshr i32 %x, 5
+  %t3 = lshr i32 %x, 8
+  %o1 = or i32 %t1, %x
+  %o2 = or i32 %t2, %t3
+  %o3 = or i32 %o1, %o2
+  %r = and i32 %o3, 1
+  ret i32 %r
+}
+
+; We're not testing the LSB here, so all of the 'or' operands are shifts.
+
+define i32 @anyset_three_bit_mask_all_shifted_bits(i32 %x) {
+; CHECK-LABEL: @anyset_three_bit_mask_all_shifted_bits(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 296
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i32
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %t1 = lshr i32 %x, 3
+  %t2 = lshr i32 %x, 5
+  %t3 = lshr i32 %x, 8
+  %o2 = or i32 %t2, %t3
+  %o3 = or i32 %t1, %o2
+  %r = and i32 %o3, 1
+  ret i32 %r
+}
+
+; Recognize the 'and' sibling pattern (all-bits-set). The 'and 1' may not be at the end.
+
+define i32 @allset_two_bit_mask(i32 %x) {
+; CHECK-LABEL: @allset_two_bit_mask(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 129
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 129
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i32
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %s = lshr i32 %x, 7
+  %o = and i32 %s, %x
+  %r = and i32 %o, 1
+  ret i32 %r
+}
+
+define i64 @allset_four_bit_mask(i64 %x) {
+; CHECK-LABEL: @allset_four_bit_mask(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[X:%.*]], 30
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 30
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i64
+; CHECK-NEXT:    ret i64 [[TMP3]]
+;
+  %t1 = lshr i64 %x, 1
+  %t2 = lshr i64 %x, 2
+  %t3 = lshr i64 %x, 3
+  %t4 = lshr i64 %x, 4
+  %a1 = and i64 %t4, 1
+  %a2 = and i64 %t2, %a1
+  %a3 = and i64 %a2, %t1
+  %r = and i64 %a3, %t3
+  ret i64 %r
+}
+
+declare void @use(i32)
+
+; negative test - extra use means the transform would increase instruction count
+
+define i32 @allset_two_bit_mask_multiuse(i32 %x) {
+; CHECK-LABEL: @allset_two_bit_mask_multiuse(
+; CHECK-NEXT:    [[S:%.*]] = lshr i32 [[X:%.*]], 7
+; CHECK-NEXT:    [[O:%.*]] = and i32 [[S]], [[X]]
+; CHECK-NEXT:    [[R:%.*]] = and i32 [[O]], 1
+; CHECK-NEXT:    call void @use(i32 [[O]])
+; CHECK-NEXT:    ret i32 [[R]]
+;
+  %s = lshr i32 %x, 7
+  %o = and i32 %s, %x
+  %r = and i32 %o, 1
+  call void @use(i32 %o)
+  ret i32 %r
+}
+
+; negative test - missing 'and 1' mask, so more than the low bit is used here
+
+define i8 @allset_three_bit_mask_no_and1(i8 %x) {
+; CHECK-LABEL: @allset_three_bit_mask_no_and1(
+; CHECK-NEXT:    [[T1:%.*]] = lshr i8 [[X:%.*]], 1
+; CHECK-NEXT:    [[T2:%.*]] = lshr i8 [[X]], 2
+; CHECK-NEXT:    [[T3:%.*]] = lshr i8 [[X]], 3
+; CHECK-NEXT:    [[A2:%.*]] = and i8 [[T1]], [[T2]]
+; CHECK-NEXT:    [[R:%.*]] = and i8 [[A2]], [[T3]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+  %t1 = lshr i8 %x, 1
+  %t2 = lshr i8 %x, 2
+  %t3 = lshr i8 %x, 3
+  %a2 = and i8 %t1, %t2
+  %r = and i8 %a2, %t3
+  ret i8 %r
+}
+
+; This test demonstrates that the transform can be large. If the implementation
+; is slow or explosive (stack overflow due to recursion), it should be made efficient.
+
+define i64 @allset_40_bit_mask(i64 %x) {
+; CHECK-LABEL: @allset_40_bit_mask(
+; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[X:%.*]], 2199023255550
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 2199023255550
+; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP2]] to i64
+; CHECK-NEXT:    ret i64 [[TMP3]]
+;
+  %t1 = lshr i64 %x, 1
+  %t2 = lshr i64 %x, 2
+  %t3 = lshr i64 %x, 3
+  %t4 = lshr i64 %x, 4
+  %t5 = lshr i64 %x, 5
+  %t6 = lshr i64 %x, 6
+  %t7 = lshr i64 %x, 7
+  %t8 = lshr i64 %x, 8
+  %t9 = lshr i64 %x, 9
+  %t10 = lshr i64 %x, 10
+  %t11 = lshr i64 %x, 11
+  %t12 = lshr i64 %x, 12
+  %t13 = lshr i64 %x, 13
+  %t14 = lshr i64 %x, 14
+  %t15 = lshr i64 %x, 15
+  %t16 = lshr i64 %x, 16
+  %t17 = lshr i64 %x, 17
+  %t18 = lshr i64 %x, 18
+  %t19 = lshr i64 %x, 19
+  %t20 = lshr i64 %x, 20
+  %t21 = lshr i64 %x, 21
+  %t22 = lshr i64 %x, 22
+  %t23 = lshr i64 %x, 23
+  %t24 = lshr i64 %x, 24
+  %t25 = lshr i64 %x, 25
+  %t26 = lshr i64 %x, 26
+  %t27 = lshr i64 %x, 27
+  %t28 = lshr i64 %x, 28
+  %t29 = lshr i64 %x, 29
+  %t30 = lshr i64 %x, 30
+  %t31 = lshr i64 %x, 31
+  %t32 = lshr i64 %x, 32
+  %t33 = lshr i64 %x, 33
+  %t34 = lshr i64 %x, 34
+  %t35 = lshr i64 %x, 35
+  %t36 = lshr i64 %x, 36
+  %t37 = lshr i64 %x, 37
+  %t38 = lshr i64 %x, 38
+  %t39 = lshr i64 %x, 39
+  %t40 = lshr i64 %x, 40
+
+  %a1 = and i64 %t1, 1
+  %a2 = and i64 %t2, %a1
+  %a3 = and i64 %t3, %a2
+  %a4 = and i64 %t4, %a3
+  %a5 = and i64 %t5, %a4
+  %a6 = and i64 %t6, %a5
+  %a7 = and i64 %t7, %a6
+  %a8 = and i64 %t8, %a7
+  %a9 = and i64 %t9, %a8
+  %a10 = and i64 %t10, %a9
+  %a11 = and i64 %t11, %a10
+  %a12 = and i64 %t12, %a11
+  %a13 = and i64 %t13, %a12
+  %a14 = and i64 %t14, %a13
+  %a15 = and i64 %t15, %a14
+  %a16 = and i64 %t16, %a15
+  %a17 = and i64 %t17, %a16
+  %a18 = and i64 %t18, %a17
+  %a19 = and i64 %t19, %a18
+  %a20 = and i64 %t20, %a19
+  %a21 = and i64 %t21, %a20
+  %a22 = and i64 %t22, %a21
+  %a23 = and i64 %t23, %a22
+  %a24 = and i64 %t24, %a23
+  %a25 = and i64 %t25, %a24
+  %a26 = and i64 %t26, %a25
+  %a27 = and i64 %t27, %a26
+  %a28 = and i64 %t28, %a27
+  %a29 = and i64 %t29, %a28
+  %a30 = and i64 %t30, %a29
+  %a31 = and i64 %t31, %a30
+  %a32 = and i64 %t32, %a31
+  %a33 = and i64 %t33, %a32
+  %a34 = and i64 %t34, %a33
+  %a35 = and i64 %t35, %a34
+  %a36 = and i64 %t36, %a35
+  %a37 = and i64 %t37, %a36
+  %a38 = and i64 %t38, %a37
+  %a39 = and i64 %t39, %a38
+  %a40 = and i64 %t40, %a39
+
+  ret i64 %a40
+}
+
+; Verify that unsimplified code doesn't crash:
+; https://bugs.llvm.org/show_bug.cgi?id=37446
+
+define i32 @PR37446(i32 %x) {
+; CHECK-LABEL: @PR37446(
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 1, 33
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[SHR]], 15
+; CHECK-NEXT:    [[AND1:%.*]] = and i32 [[AND]], [[X:%.*]]
+; CHECK-NEXT:    ret i32 [[AND1]]
+;
+  %shr = lshr i32 1, 33
+  %and = and i32 %shr, 15
+  %and1 = and i32 %and, %x
+  ret i32 %and1
+}
+

Added: llvm/trunk/test/Transforms/AggressiveInstCombine/rotate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AggressiveInstCombine/rotate.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AggressiveInstCombine/rotate.ll (added)
+++ llvm/trunk/test/Transforms/AggressiveInstCombine/rotate.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,476 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
+
+; https://bugs.llvm.org/show_bug.cgi?id=34924
+
+define i32 @rotl(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotl(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshl.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shr = lshr i32 %a, %sub
+  %shl = shl i32 %a, %b
+  %or = or i32 %shr, %shl
+  br label %end
+
+end:
+  %cond = phi i32 [ %or, %rotbb ], [ %a, %entry ]
+  ret i32 %cond
+}
+
+define i32 @rotl_commute_phi(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotl_commute_phi(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshl.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shr = lshr i32 %a, %sub
+  %shl = shl i32 %a, %b
+  %or = or i32 %shr, %shl
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+define i32 @rotl_commute_or(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotl_commute_or(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshl.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shr = lshr i32 %a, %sub
+  %shl = shl i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Verify that the intrinsic is inserted into a valid position.
+
+define i32 @rotl_insert_valid_location(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotl_insert_valid_location(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[OTHER:%.*]] = phi i32 [ 1, [[ROTBB]] ], [ 2, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshl.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    [[RES:%.*]] = or i32 [[TMP0]], [[OTHER]]
+; CHECK-NEXT:    ret i32 [[RES]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shr = lshr i32 %a, %sub
+  %shl = shl i32 %a, %b
+  %or = or i32 %shr, %shl
+  br label %end
+
+end:
+  %cond = phi i32 [ %or, %rotbb ], [ %a, %entry ]
+  %other = phi i32 [ 1, %rotbb ], [ 2, %entry ]
+  %res = or i32 %cond, %other
+  ret i32 %res
+}
+
+define i32 @rotr(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotr(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshr.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shr, %shl
+  br label %end
+
+end:
+  %cond = phi i32 [ %or, %rotbb ], [ %a, %entry ]
+  ret i32 %cond
+}
+
+define i32 @rotr_commute_phi(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotr_commute_phi(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshr.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shr, %shl
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+define i32 @rotr_commute_or(i32 %a, i32 %b) {
+; CHECK-LABEL: @rotr_commute_or(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.fshr.i32(i32 [[A:%.*]], i32 [[A]], i32 [[B]])
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - non-power-of-2 might require urem expansion in the backend.
+
+define i12 @could_be_rotr_weird_type(i12 %a, i12 %b) {
+; CHECK-LABEL: @could_be_rotr_weird_type(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i12 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i12 12, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i12 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i12 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i12 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i12 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i12 [[COND]]
+;
+entry:
+  %cmp = icmp eq i12 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i12 12, %b
+  %shl = shl i12 %a, %sub
+  %shr = lshr i12 %a, %b
+  %or = or i12 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i12 [ %a, %entry ], [ %or, %rotbb ]
+  ret i12 %cond
+}
+
+; Negative test - wrong phi ops.
+
+define i32 @not_rotr_1(i32 %a, i32 %b) {
+; CHECK-LABEL: @not_rotr_1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[B]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %b, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - too many phi ops.
+
+define i32 @not_rotr_2(i32 %a, i32 %b, i32 %c) {
+; CHECK-LABEL: @not_rotr_2(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    [[CMP42:%.*]] = icmp ugt i32 [[OR]], 42
+; CHECK-NEXT:    br i1 [[CMP42]], label [[END]], label [[BOGUS:%.*]]
+; CHECK:       bogus:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ], [ [[C:%.*]], [[BOGUS]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  %cmp42 = icmp ugt i32 %or, 42
+  br i1 %cmp42, label %end, label %bogus
+
+bogus:
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ], [ %c, %bogus ]
+  ret i32 %cond
+}
+
+; Negative test - wrong cmp (but this should match?).
+
+define i32 @not_rotr_3(i32 %a, i32 %b) {
+; CHECK-LABEL: @not_rotr_3(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp sle i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - wrong shift.
+
+define i32 @not_rotr_4(i32 %a, i32 %b) {
+; CHECK-LABEL: @not_rotr_4(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = ashr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = ashr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - wrong shift.
+
+define i32 @not_rotr_5(i32 %a, i32 %b) {
+; CHECK-LABEL: @not_rotr_5(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[B]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A:%.*]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %b, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - wrong sub.
+
+define i32 @not_rotr_6(i32 %a, i32 %b) {
+; CHECK-LABEL: @not_rotr_6(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 8, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 8, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+
+; Negative test - extra use. Technically, we could transform this
+; because it doesn't increase the instruction count, but we're
+; being cautious not to cause a potential perf pessimization for
+; targets that do not have a rotate instruction.
+
+define i32 @could_be_rotr(i32 %a, i32 %b, i32* %p) {
+; CHECK-LABEL: @could_be_rotr(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[B:%.*]], 0
+; CHECK-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[ROTBB:%.*]]
+; CHECK:       rotbb:
+; CHECK-NEXT:    [[SUB:%.*]] = sub i32 32, [[B]]
+; CHECK-NEXT:    [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
+; CHECK-NEXT:    [[SHR:%.*]] = lshr i32 [[A]], [[B]]
+; CHECK-NEXT:    [[OR:%.*]] = or i32 [[SHL]], [[SHR]]
+; CHECK-NEXT:    store i32 [[OR]], i32* [[P:%.*]]
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[A]], [[ENTRY:%.*]] ], [ [[OR]], [[ROTBB]] ]
+; CHECK-NEXT:    ret i32 [[COND]]
+;
+entry:
+  %cmp = icmp eq i32 %b, 0
+  br i1 %cmp, label %end, label %rotbb
+
+rotbb:
+  %sub = sub i32 32, %b
+  %shl = shl i32 %a, %sub
+  %shr = lshr i32 %a, %b
+  %or = or i32 %shl, %shr
+  store i32 %or, i32* %p
+  br label %end
+
+end:
+  %cond = phi i32 [ %a, %entry ], [ %or, %rotbb ]
+  ret i32 %cond
+}
+

Added: llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_const_expr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_const_expr.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_const_expr.ll (added)
+++ llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_const_expr.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,110 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
+; RUN: opt < %s -passes=aggressive-instcombine -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"
+
+; Aggressive Instcombine should be able to reduce width of these constant
+; expressions, without crashing.
+
+declare i32 @use32(i32)
+declare <2 x i32> @use32_vec(<2 x i32>)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; These tests check cases where expression dag post-dominated by TruncInst
+;; contains instruction, which has more than one usage.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+define void @const_expression_mul() {
+; CHECK-LABEL: @const_expression_mul(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 242)
+; CHECK-NEXT:    ret void
+;
+  %A = mul i64 11, 22
+  %T = trunc i64 %A to i32
+  call i32 @use32(i32 %T)
+  ret void
+}
+
+define void @const_expression_zext() {
+; CHECK-LABEL: @const_expression_zext(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 33)
+; CHECK-NEXT:    ret void
+;
+  %A = zext i32 33 to i64
+  %T = trunc i64 %A to i32
+  call i32 @use32(i32 %T)
+  ret void
+}
+
+define void @const_expression_trunc() {
+; CHECK-LABEL: @const_expression_trunc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 44)
+; CHECK-NEXT:    ret void
+;
+  %T = trunc i64 44 to i32
+  call i32 @use32(i32 %T)
+  ret void
+}
+
+; Check that we handle constant expression trunc instruction, when it is a leaf
+; of other trunc expression pattern:
+; 1. %T1 is the constant expression trunc instruction.
+; 2. %T2->%T1 is the trunc expression pattern we want to reduce.
+define void @const_expression_trunc_leaf() {
+; CHECK-LABEL: @const_expression_trunc_leaf(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 44)
+; CHECK-NEXT:    ret void
+;
+  %T1 = trunc i64 44 to i48
+  %T2 = trunc i48 %T1 to i32
+  call i32 @use32(i32 %T2)
+  ret void
+}
+
+; Check that we handle zext instruction, which turns into trunc instruction.
+; Notice that there are two expression patterns below:
+; 1. %T2->%T1
+; 2. %T1`->%A (where %T1` is the reduced node of %T1 into trunc instruction)
+define void @const_expression_zext_to_trunc() {
+; CHECK-LABEL: @const_expression_zext_to_trunc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 44)
+; CHECK-NEXT:    ret void
+;
+  %A = add i64 11, 33
+  %T1 = zext i64 %A to i128
+  %T2 = trunc i128 %T1 to i32
+  call i32 @use32(i32 %T2)
+  ret void
+}
+
+define void @const_expression_mul_vec() {
+; CHECK-LABEL: @const_expression_mul_vec(
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> <i32 24531, i32 24864>)
+; CHECK-NEXT:    ret void
+;
+  %A = mul <2 x i64> <i64 111, i64 112>, <i64 221, i64 222>
+  %T = trunc <2 x i64> %A to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T)
+  ret void
+}
+
+define void @const_expression_zext_vec() {
+; CHECK-LABEL: @const_expression_zext_vec(
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> <i32 331, i32 332>)
+; CHECK-NEXT:    ret void
+;
+  %A = zext <2 x i32> <i32 331, i32 332> to <2 x i64>
+  %T = trunc <2 x i64> %A to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T)
+  ret void
+}
+
+define void @const_expression_trunc_vec() {
+; CHECK-LABEL: @const_expression_trunc_vec(
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> <i32 551, i32 552>)
+; CHECK-NEXT:    ret void
+;
+  %T = trunc <2 x i64> <i64 551, i64 552> to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T)
+  ret void
+}

Added: llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_multi_uses.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_multi_uses.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_multi_uses.ll (added)
+++ llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_multi_uses.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,270 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
+; RUN: opt < %s -passes=aggressive-instcombine -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"
+
+; Aggressive Instcombine should be able to reduce width of these expressions.
+
+declare i32 @use32(i32)
+declare i32 @use64(i64)
+declare <2 x i32> @use32_vec(<2 x i32>)
+declare <2 x i32> @use64_vec(<2 x i64>)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; These tests check cases where expression dag post-dominated by TruncInst
+;; contains instruction, which has more than one usage.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+define void @multi_uses_add(i32 %X) {
+; CHECK-LABEL: @multi_uses_add(
+; CHECK-NEXT:    [[A1:%.*]] = zext i32 [[X:%.*]] to i64
+; CHECK-NEXT:    [[B1:%.*]] = add i32 [[X]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @use64(i64 [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %B1 = add i64 %A1, 15
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i32
+  call i32 @use32(i32 %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call i32 @use64(i64 %A1)
+  ret void
+}
+
+define void @multi_uses_or(i32 %X) {
+; CHECK-LABEL: @multi_uses_or(
+; CHECK-NEXT:    [[A1:%.*]] = zext i32 [[X:%.*]] to i64
+; CHECK-NEXT:    [[B1:%.*]] = or i32 [[X]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @use64(i64 [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %B1 = or i64 %A1, 15
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i32
+  call i32 @use32(i32 %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call i32 @use64(i64 %A1)
+  ret void
+}
+
+define void @multi_uses_xor(i32 %X) {
+; CHECK-LABEL: @multi_uses_xor(
+; CHECK-NEXT:    [[A1:%.*]] = zext i32 [[X:%.*]] to i64
+; CHECK-NEXT:    [[B1:%.*]] = xor i32 [[X]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @use64(i64 [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %B1 = xor i64 %A1, 15
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i32
+  call i32 @use32(i32 %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call i32 @use64(i64 %A1)
+  ret void
+}
+
+define void @multi_uses_and(i32 %X) {
+; CHECK-LABEL: @multi_uses_and(
+; CHECK-NEXT:    [[A1:%.*]] = zext i32 [[X:%.*]] to i64
+; CHECK-NEXT:    [[B1:%.*]] = and i32 [[X]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @use64(i64 [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %B1 = and i64 %A1, 15
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i32
+  call i32 @use32(i32 %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call i32 @use64(i64 %A1)
+  ret void
+}
+
+define void @multi_uses_sub(i32 %X, i32 %Y) {
+; CHECK-LABEL: @multi_uses_sub(
+; CHECK-NEXT:    [[A1:%.*]] = zext i32 [[X:%.*]] to i64
+; CHECK-NEXT:    [[A2:%.*]] = zext i32 [[Y:%.*]] to i64
+; CHECK-NEXT:    [[B1:%.*]] = sub i32 [[X]], [[Y]]
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @use64(i64 [[A1]])
+; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @use64(i64 [[A2]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %A2 = zext i32 %Y to i64
+  %B1 = sub i64 %A1, %A2
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i32
+  call i32 @use32(i32 %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call i32 @use64(i64 %A1)
+  call i32 @use64(i64 %A2)
+  ret void
+}
+
+define void @multi_use_vec_add(<2 x i32> %X) {
+; CHECK-LABEL: @multi_use_vec_add(
+; CHECK-NEXT:    [[A1:%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[B1:%.*]] = add <2 x i32> [[X]], <i32 15, i32 15>
+; CHECK-NEXT:    [[C1:%.*]] = mul <2 x i32> [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext <2 x i32> %X to <2 x i64>
+  %B1 = add <2 x i64> %A1, <i64 15, i64 15>
+  %C1 = mul <2 x i64> %B1, %B1
+  %T1 = trunc <2 x i64> %C1 to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call <2 x i32> @use64_vec(<2 x i64> %A1)
+  ret void
+}
+
+define void @multi_use_vec_or(<2 x i32> %X) {
+; CHECK-LABEL: @multi_use_vec_or(
+; CHECK-NEXT:    [[A1:%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[B1:%.*]] = or <2 x i32> [[X]], <i32 15, i32 15>
+; CHECK-NEXT:    [[C1:%.*]] = mul <2 x i32> [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext <2 x i32> %X to <2 x i64>
+  %B1 = or <2 x i64> %A1, <i64 15, i64 15>
+  %C1 = mul <2 x i64> %B1, %B1
+  %T1 = trunc <2 x i64> %C1 to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call <2 x i32> @use64_vec(<2 x i64> %A1)
+  ret void
+}
+
+define void @multi_use_vec_xor(<2 x i32> %X) {
+; CHECK-LABEL: @multi_use_vec_xor(
+; CHECK-NEXT:    [[A1:%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[B1:%.*]] = xor <2 x i32> [[X]], <i32 15, i32 15>
+; CHECK-NEXT:    [[C1:%.*]] = mul <2 x i32> [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext <2 x i32> %X to <2 x i64>
+  %B1 = xor <2 x i64> %A1, <i64 15, i64 15>
+  %C1 = mul <2 x i64> %B1, %B1
+  %T1 = trunc <2 x i64> %C1 to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call <2 x i32> @use64_vec(<2 x i64> %A1)
+  ret void
+}
+
+define void @multi_use_vec_and(<2 x i32> %X) {
+; CHECK-LABEL: @multi_use_vec_and(
+; CHECK-NEXT:    [[A1:%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[B1:%.*]] = and <2 x i32> [[X]], <i32 15, i32 15>
+; CHECK-NEXT:    [[C1:%.*]] = mul <2 x i32> [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A1]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext <2 x i32> %X to <2 x i64>
+  %B1 = and <2 x i64> %A1, <i64 15, i64 15>
+  %C1 = mul <2 x i64> %B1, %B1
+  %T1 = trunc <2 x i64> %C1 to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call <2 x i32> @use64_vec(<2 x i64> %A1)
+  ret void
+}
+
+define void @multi_use_vec_sub(<2 x i32> %X, <2 x i32> %Y) {
+; CHECK-LABEL: @multi_use_vec_sub(
+; CHECK-NEXT:    [[A1:%.*]] = zext <2 x i32> [[X:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[A2:%.*]] = zext <2 x i32> [[Y:%.*]] to <2 x i64>
+; CHECK-NEXT:    [[B1:%.*]] = sub <2 x i32> [[X]], [[Y]]
+; CHECK-NEXT:    [[C1:%.*]] = mul <2 x i32> [[B1]], [[B1]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i32> @use32_vec(<2 x i32> [[C1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A1]])
+; CHECK-NEXT:    [[TMP3:%.*]] = call <2 x i32> @use64_vec(<2 x i64> [[A2]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext <2 x i32> %X to <2 x i64>
+  %A2 = zext <2 x i32> %Y to <2 x i64>
+  %B1 = sub <2 x i64> %A1, %A2
+  %C1 = mul <2 x i64> %B1, %B1
+  %T1 = trunc <2 x i64> %C1 to <2 x i32>
+  call <2 x i32> @use32_vec(<2 x i32> %T1)
+  ; make sure zext have another use that is not post-dominated by the TruncInst.
+  call <2 x i32> @use64_vec(<2 x i64> %A1)
+  call <2 x i32> @use64_vec(<2 x i64> %A2)
+  ret void
+}
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; These tests check cases where expression dag post-dominated by TruncInst
+;; contains TruncInst leaf or ZEXT/SEXT leafs which turn into TruncInst leaves.
+;; Check that both expressions are reduced and no TruncInst remains or (was
+;; generated).
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; Notice that there are two expression patterns below:
+; 1. %T2->%C2->(%B2->(%T1, 15), %B2->(%T1, 15))
+; 2. %T1`->%C1->(%B1->(%A1, 15), %B1->(%A1, 15))
+;    (where %T1` is the reduced node of %T1 into trunc instruction)
+define void @trunc_as_a_leaf(i32 %X) {
+; CHECK-LABEL: @trunc_as_a_leaf(
+; CHECK-NEXT:    [[B1:%.*]] = add i32 [[X:%.*]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[B2:%.*]] = add i32 [[C1]], 15
+; CHECK-NEXT:    [[C2:%.*]] = mul i32 [[B2]], [[B2]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C2]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i32 %X to i64
+  %B1 = add i64 %A1, 15
+  %C1 = mul i64 %B1, %B1
+  %T1 = trunc i64 %C1 to i48 ; leaf trunc
+  %B2 = add i48 %T1, 15
+  %C2 = mul i48 %B2, %B2
+  %T2 = trunc i48 %C2 to i32
+  call i32 @use32(i32 %T2)
+  ret void
+}
+
+; Notice that there are two expression patterns below:
+; 1. %T2->%C2->(%B2->(%T1, 15), %B2->(%T1, 15))
+; 2. %T1`->%C1->(%B1->(%A1, 15), %B1->(%A1, 15))
+;    (where %T1` is the reduced node of %T1 into trunc instruction)
+define void @zext_as_a_leaf(i16 %X) {
+; CHECK-LABEL: @zext_as_a_leaf(
+; CHECK-NEXT:    [[A1:%.*]] = zext i16 [[X:%.*]] to i32
+; CHECK-NEXT:    [[B1:%.*]] = add i32 [[A1]], 15
+; CHECK-NEXT:    [[C1:%.*]] = mul i32 [[B1]], [[B1]]
+; CHECK-NEXT:    [[B2:%.*]] = add i32 [[C1]], 15
+; CHECK-NEXT:    [[C2:%.*]] = mul i32 [[B2]], [[B2]]
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @use32(i32 [[C2]])
+; CHECK-NEXT:    ret void
+;
+  %A1 = zext i16 %X to i48
+  %B1 = add i48 %A1, 15
+  %C1 = mul i48 %B1, %B1
+  %T1 = zext i48 %C1 to i64 ; leaf zext, which will turn into trunc
+  %B2 = add i64 %T1, 15
+  %C2 = mul i64 %B2, %B2
+  %T2 = trunc i64 %C2 to i32
+  call i32 @use32(i32 %T2)
+  ret void
+}

Added: llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_unreachable_bb.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_unreachable_bb.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_unreachable_bb.ll (added)
+++ llvm/trunk/test/Transforms/AggressiveInstCombine/trunc_unreachable_bb.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,48 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
+; RUN: opt < %s -passes=aggressive-instcombine -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"
+
+; Aggressive Instcombine should be able ignore unreachable basic block.
+
+define void @func_20() {
+; CHECK-LABEL: @func_20(
+; CHECK-NEXT:  for.body94:
+; CHECK-NEXT:    unreachable
+; CHECK:       for.cond641:
+; CHECK-NEXT:    [[OR722:%.*]] = or i32 [[OR722]], undef
+; CHECK-NEXT:    [[OR723:%.*]] = or i32 [[OR722]], 1
+; CHECK-NEXT:    [[CONV724:%.*]] = trunc i32 [[OR723]] to i16
+; CHECK-NEXT:    br label [[FOR_COND641:%.*]]
+;
+for.body94:
+  unreachable
+
+for.cond641:
+  %or722 = or i32 %or722, undef
+  %or723 = or i32 %or722, 1
+  %conv724 = trunc i32 %or723 to i16
+  br label %for.cond641
+}
+
+define void @func_21() {
+; CHECK-LABEL: @func_21(
+; CHECK-NEXT:  for.body94:
+; CHECK-NEXT:    unreachable
+; CHECK:       for.cond641:
+; CHECK-NEXT:    [[OR722:%.*]] = or i32 [[A:%.*]], undef
+; CHECK-NEXT:    [[A]] = or i32 [[OR722]], undef
+; CHECK-NEXT:    [[OR723:%.*]] = or i32 [[OR722]], 1
+; CHECK-NEXT:    [[CONV724:%.*]] = trunc i32 [[OR723]] to i16
+; CHECK-NEXT:    br label [[FOR_COND641:%.*]]
+;
+for.body94:
+  unreachable
+
+for.cond641:
+  %or722 = or i32 %a, undef
+  %a = or i32 %or722, undef
+  %or723 = or i32 %or722, 1
+  %conv724 = trunc i32 %or723 to i16
+  br label %for.cond641
+}

Added: llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll (added)
+++ llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,216 @@
+target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
+; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s
+; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s
+
+define i32 @foo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = load i32, i32* %a, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %offsetptr = add i64 %ptrint, 24
+  %maskedptr = and i64 %offsetptr, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 2
+  %0 = load i32, i32* %arrayidx, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo2
+; CHECK: load i32, i32* {{[^,]+}}, align 16
+; CHECK: ret i32
+}
+
+define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %offsetptr = add i64 %ptrint, 28
+  %maskedptr = and i64 %offsetptr, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1
+  %0 = load i32, i32* %arrayidx, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo2a
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @goo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = load i32, i32* %a, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @goo
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 8
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @hoo
+; CHECK: load i32, i32* %arrayidx, align 32
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 8
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @joo
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @koo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 4
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @koo
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 4
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @koo2
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @moo(i32* nocapture %a) nounwind uwtable {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = bitcast i32* %a to i8*
+  tail call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 64, i1 false)
+  ret i32 undef
+
+; CHECK-LABEL: @moo
+; CHECK: @llvm.memset.p0i8.i64(i8* align 32 %0, i8 0, i64 64, i1 false)
+; CHECK: ret i32 undef
+}
+
+define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %ptrint1 = ptrtoint i32* %b to i64
+  %maskedptr3 = and i64 %ptrint1, 127
+  %maskcond4 = icmp eq i64 %maskedptr3, 0
+  tail call void @llvm.assume(i1 %maskcond4)
+  %0 = bitcast i32* %a to i8*
+  %1 = bitcast i32* %b to i8*
+  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 64, i1 false)
+  ret i32 undef
+
+; CHECK-LABEL: @moo2
+; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 128 %1, i64 64, i1 false)
+; CHECK: ret i32 undef
+}
+
+declare void @llvm.assume(i1) nounwind
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+

Added: llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll (added)
+++ llvm/trunk/test/Transforms/AlignmentFromAssumptions/simple32.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,216 @@
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64"
+; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s
+; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s
+
+define i32 @foo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = load i32, i32* %a, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %offsetptr = add i64 %ptrint, 24
+  %maskedptr = and i64 %offsetptr, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 2
+  %0 = load i32, i32* %arrayidx, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo2
+; CHECK: load i32, i32* {{[^,]+}}, align 16
+; CHECK: ret i32
+}
+
+define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %offsetptr = add i64 %ptrint, 28
+  %maskedptr = and i64 %offsetptr, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1
+  %0 = load i32, i32* %arrayidx, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @foo2a
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @goo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = load i32, i32* %a, align 4
+  ret i32 %0
+
+; CHECK-LABEL: @goo
+; CHECK: load i32, i32* {{[^,]+}}, align 32
+; CHECK: ret i32
+}
+
+define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 8
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @hoo
+; CHECK: load i32, i32* %arrayidx, align 32
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 8
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @joo
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @koo(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 4
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @koo
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ]
+  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %r.06
+  %indvars.iv.next = add i64 %indvars.iv, 4
+  %1 = trunc i64 %indvars.iv.next to i32
+  %cmp = icmp slt i32 %1, 2048
+  br i1 %cmp, label %for.body, label %for.end
+
+for.end:                                          ; preds = %for.body
+  %add.lcssa = phi i32 [ %add, %for.body ]
+  ret i32 %add.lcssa
+
+; CHECK-LABEL: @koo2
+; CHECK: load i32, i32* %arrayidx, align 16
+; CHECK: ret i32 %add.lcssa
+}
+
+define i32 @moo(i32* nocapture %a) nounwind uwtable {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %0 = bitcast i32* %a to i8*
+  tail call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 64, i1 false)
+  ret i32 undef
+
+; CHECK-LABEL: @moo
+; CHECK: @llvm.memset.p0i8.i64(i8* align 32 %0, i8 0, i64 64, i1 false)
+; CHECK: ret i32 undef
+}
+
+define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable {
+entry:
+  %ptrint = ptrtoint i32* %a to i64
+  %maskedptr = and i64 %ptrint, 31
+  %maskcond = icmp eq i64 %maskedptr, 0
+  tail call void @llvm.assume(i1 %maskcond)
+  %ptrint1 = ptrtoint i32* %b to i64
+  %maskedptr3 = and i64 %ptrint1, 127
+  %maskcond4 = icmp eq i64 %maskedptr3, 0
+  tail call void @llvm.assume(i1 %maskcond4)
+  %0 = bitcast i32* %a to i8*
+  %1 = bitcast i32* %b to i8*
+  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 64, i1 false)
+  ret i32 undef
+
+; CHECK-LABEL: @moo2
+; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 128 %1, i64 64, i1 false)
+; CHECK: ret i32 undef
+}
+
+declare void @llvm.assume(i1) nounwind
+
+declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind
+

Added: llvm/trunk/test/Transforms/AlignmentFromAssumptions/start-unk.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AlignmentFromAssumptions/start-unk.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AlignmentFromAssumptions/start-unk.ll (added)
+++ llvm/trunk/test/Transforms/AlignmentFromAssumptions/start-unk.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,155 @@
+; RUN: opt -alignment-from-assumptions -S < %s | FileCheck %s
+; RUN: opt -passes=alignment-from-assumptions -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"
+
+%type1 = type { %type2 }
+%type2 = type { [4 x i8] }
+
+; Function Attrs: nounwind
+declare void @llvm.assume(i1) #0
+
+; Function Attrs: nounwind readnone
+declare i32 @llvm.bswap.i32(i32) #1
+
+; Function Attrs: nounwind uwtable
+define void @test1() unnamed_addr #2 align 2 {
+
+; CHECK-LABEL: @test1
+
+entry:
+  br i1 undef, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry
+  unreachable
+
+if.end:                                           ; preds = %entry
+  br i1 undef, label %return, label %if.end8
+
+if.end8:                                          ; preds = %if.end
+  br i1 undef, label %if.then13, label %if.end14
+
+if.then13:                                        ; preds = %if.end8
+  unreachable
+
+if.end14:                                         ; preds = %if.end8
+  br i1 undef, label %cond.false.i129, label %cond.end.i136
+
+cond.false.i129:                                  ; preds = %if.end14
+  unreachable
+
+cond.end.i136:                                    ; preds = %if.end14
+  br i1 undef, label %land.lhs.true.i, label %if.end.i145
+
+land.lhs.true.i:                                  ; preds = %cond.end.i136
+  br i1 undef, label %if.end.i145, label %if.then.i137
+
+if.then.i137:                                     ; preds = %land.lhs.true.i
+  br i1 undef, label %cond.false8.i, label %cond.end9.i
+
+cond.false8.i:                                    ; preds = %if.then.i137
+  unreachable
+
+cond.end9.i:                                      ; preds = %if.then.i137
+  br i1 undef, label %if.then23, label %if.end24
+
+if.end.i145:                                      ; preds = %land.lhs.true.i, %cond.end.i136
+  unreachable
+
+if.then23:                                        ; preds = %cond.end9.i
+  unreachable
+
+if.end24:                                         ; preds = %cond.end9.i
+  br i1 undef, label %for.end, label %for.body.lr.ph
+
+for.body.lr.ph:                                   ; preds = %if.end24
+  unreachable
+
+for.end:                                          ; preds = %if.end24
+  br i1 undef, label %if.end123, label %if.then121
+
+if.then121:                                       ; preds = %for.end
+  unreachable
+
+if.end123:                                        ; preds = %for.end
+  br i1 undef, label %if.end150, label %if.then126
+
+if.then126:                                       ; preds = %if.end123
+  %ptrint.i.i185 = ptrtoint %type1* undef to i64
+  %maskedptr.i.i186 = and i64 %ptrint.i.i185, 1
+  %maskcond.i.i187 = icmp eq i64 %maskedptr.i.i186, 0
+  tail call void @llvm.assume(i1 %maskcond.i.i187) #0
+  %ret.0..sroa_cast.i.i188 = bitcast %type1* undef to i32*
+  %ret.0.copyload.i.i189 = load i32, i32* %ret.0..sroa_cast.i.i188, align 2
+
+; CHECK: load {{.*}} align 2
+
+  %0 = tail call i32 @llvm.bswap.i32(i32 %ret.0.copyload.i.i189) #0
+  %conv131 = zext i32 %0 to i64
+  %add.ptr132 = getelementptr inbounds i8, i8* undef, i64 %conv131
+  %1 = bitcast i8* %add.ptr132 to %type1*
+  br i1 undef, label %if.end150, label %if.end.i173
+
+if.end.i173:                                      ; preds = %if.then126
+  br i1 undef, label %test1.exit, label %cond.false.i.i.i.i174
+
+cond.false.i.i.i.i174:                            ; preds = %if.end.i173
+  unreachable
+
+test1.exit: ; preds = %if.end.i173
+  br i1 undef, label %test1a.exit, label %if.end.i124
+
+if.end.i124:                                      ; preds = %test1.exit
+  unreachable
+
+test1a.exit: ; preds = %test1.exit
+  br i1 undef, label %if.end150, label %for.body137.lr.ph
+
+for.body137.lr.ph:                                ; preds = %test1a.exit
+  br label %for.body137
+
+for.body137:                                      ; preds = %test1b.exit, %for.body137.lr.ph
+  %ShndxTable.0309 = phi %type1* [ %1, %for.body137.lr.ph ], [ %incdec.ptr, %test1b.exit ]
+  %ret.0..sroa_cast.i.i106 = bitcast %type1* %ShndxTable.0309 to i32*
+  br i1 undef, label %for.body137.if.end146_crit_edge, label %if.then140
+
+for.body137.if.end146_crit_edge:                  ; preds = %for.body137
+  %incdec.ptr = getelementptr inbounds %type1, %type1* %ShndxTable.0309, i64 1
+  br i1 undef, label %cond.false.i70, label %cond.end.i
+
+if.then140:                                       ; preds = %for.body137
+  %ret.0.copyload.i.i102 = load i32, i32* %ret.0..sroa_cast.i.i106, align 2
+
+; CHECK: load {{.*}} align 2
+
+  unreachable
+
+cond.false.i70:                                   ; preds = %for.body137.if.end146_crit_edge
+  unreachable
+
+cond.end.i:                                       ; preds = %for.body137.if.end146_crit_edge
+  br i1 undef, label %test1b.exit, label %cond.false.i.i
+
+cond.false.i.i:                                   ; preds = %cond.end.i
+  unreachable
+
+test1b.exit: ; preds = %cond.end.i
+  br i1 undef, label %if.end150, label %for.body137
+
+if.end150:                                        ; preds = %test1b.exit, %test1a.exit, %if.then126, %if.end123
+  br i1 undef, label %for.end176, label %for.body155.lr.ph
+
+for.body155.lr.ph:                                ; preds = %if.end150
+  unreachable
+
+for.end176:                                       ; preds = %if.end150
+  unreachable
+
+return:                                           ; preds = %if.end
+  ret void
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { nounwind readnone }
+attributes #2 = { nounwind uwtable }
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,19 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+
+; CHECK: define internal i32 @deref(i32 %x.val) #0 {
+define internal i32 @deref(i32* %x) nounwind {
+entry:
+  %tmp2 = load i32, i32* %x, align 4
+  ret i32 %tmp2
+}
+
+define i32 @f(i32 %x) {
+entry:
+  %x_addr = alloca i32
+  store i32 %x, i32* %x_addr, align 4
+; CHECK: %tmp1 = call i32 @deref(i32 %x_addr.val) [[NUW:#[0-9]+]]
+  %tmp1 = call i32 @deref( i32* %x_addr ) nounwind
+  ret i32 %tmp1
+}
+
+; CHECK: attributes [[NUW]] = { nounwind }

Added: llvm/trunk/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,30 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; PR2498
+
+; This test tries to convince argpromotion about promoting the load from %A + 2,
+; because there is a load of %A in the entry block
+define internal i32 @callee(i1 %C, i32* %A) {
+; CHECK-LABEL: define internal i32 @callee(
+; CHECK: i1 %C, i32* %A)
+entry:
+  ; Unconditonally load the element at %A
+  %A.0 = load i32, i32* %A
+  br i1 %C, label %T, label %F
+
+T:
+  ret i32 %A.0
+
+F:
+  ; Load the element at offset two from %A. This should not be promoted!
+  %A.2 = getelementptr i32, i32* %A, i32 2
+  %R = load i32, i32* %A.2
+  ret i32 %R
+}
+
+define i32 @foo() {
+; CHECK-LABEL: define i32 @foo
+        %X = call i32 @callee(i1 false, i32* null)             ; <i32> [#uses=1]
+; CHECK: call i32 @callee(i1 false, i32* null)
+        ret i32 %X
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,12 @@
+; RUN: opt < %s -inline -argpromotion -disable-output
+
+define internal fastcc i32 @hash(i32* %ts, i32 %mod) nounwind {
+entry:
+	unreachable
+}
+
+define void @encode(i32* %m, i32* %ts, i32* %new) nounwind {
+entry:
+	%0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind		; <i32> [#uses=0]
+	unreachable
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,25 @@
+; RUN: opt < %s -argpromotion -disable-output
+
+define internal fastcc i32 @term_SharingList(i32* %Term, i32* %List) nounwind {
+entry:
+	br i1 false, label %bb, label %bb5
+
+bb:		; preds = %entry
+	%0 = call fastcc i32 @term_SharingList( i32* null, i32* %List ) nounwind		; <i32> [#uses=0]
+	unreachable
+
+bb5:		; preds = %entry
+	ret i32 0
+}
+
+define i32 @term_Sharing(i32* %Term) nounwind {
+entry:
+	br i1 false, label %bb.i, label %bb14
+
+bb.i:		; preds = %entry
+	%0 = call fastcc i32 @term_SharingList( i32* null, i32* null ) nounwind		; <i32> [#uses=0]
+	ret i32 1
+
+bb14:		; preds = %entry
+	ret i32 0
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/X86/attributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/X86/attributes.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/X86/attributes.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/X86/attributes.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,53 @@
+; RUN: opt -S -argpromotion < %s | FileCheck %s
+; RUN: opt -S -passes=argpromotion < %s | FileCheck %s
+; Test that we only promote arguments when the caller/callee have compatible
+; function attrubtes.
+
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: @no_promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1)
+define internal fastcc void @no_promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 {
+bb:
+  %tmp = load <4 x i64>, <4 x i64>* %arg1
+  store <4 x i64> %tmp, <4 x i64>* %arg
+  ret void
+}
+
+define void @no_promote(<4 x i64>* %arg) #1 {
+bb:
+  %tmp = alloca <4 x i64>, align 32
+  %tmp2 = alloca <4 x i64>, align 32
+  %tmp3 = bitcast <4 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @no_promote_avx2(<4 x i64>* %tmp2, <4 x i64>* %tmp)
+  %tmp4 = load <4 x i64>, <4 x i64>* %tmp2, align 32
+  store <4 x i64> %tmp4, <4 x i64>* %arg, align 2
+  ret void
+}
+
+; CHECK-LABEL: @promote_avx2(<4 x i64>* %arg, <4 x i64> %
+define internal fastcc void @promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 {
+bb:
+  %tmp = load <4 x i64>, <4 x i64>* %arg1
+  store <4 x i64> %tmp, <4 x i64>* %arg
+  ret void
+}
+
+define void @promote(<4 x i64>* %arg) #0 {
+bb:
+  %tmp = alloca <4 x i64>, align 32
+  %tmp2 = alloca <4 x i64>, align 32
+  %tmp3 = bitcast <4 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @promote_avx2(<4 x i64>* %tmp2, <4 x i64>* %tmp)
+  %tmp4 = load <4 x i64>, <4 x i64>* %tmp2, align 32
+  store <4 x i64> %tmp4, <4 x i64>* %arg, align 2
+  ret void
+}
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #2
+
+attributes #0 = { inlinehint norecurse nounwind uwtable "target-features"="+avx2" }
+attributes #1 = { nounwind uwtable }
+attributes #2 = { argmemonly nounwind }

Added: llvm/trunk/test/Transforms/ArgumentPromotion/X86/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/X86/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/X86/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/X86/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,3 @@
+if not 'X86' in config.root.targets:
+    config.unsupported = True
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,184 @@
+; RUN: opt -S -argpromotion < %s | FileCheck %s
+; RUN: opt -S -passes=argpromotion < %s | FileCheck %s
+; Test that we only promote arguments when the caller/callee have compatible
+; function attrubtes.
+
+target triple = "x86_64-unknown-linux-gnu"
+
+; This should promote
+; CHECK-LABEL: @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg) #0 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should promote
+; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #1 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should promote
+; CHECK-LABEL: @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg) #0 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should promote
+; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg) #1 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should not promote
+; CHECK-LABEL: @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1)
+define internal fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #2 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should not promote
+; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1)
+define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #2 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg) #1 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should promote
+; CHECK-LABEL: @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #3 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg) #4 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; This should promote
+; CHECK-LABEL: @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val)
+define internal fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #4 {
+bb:
+  %tmp = load <8 x i64>, <8 x i64>* %arg1
+  store <8 x i64> %tmp, <8 x i64>* %arg
+  ret void
+}
+
+define void @avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg) #3 {
+bb:
+  %tmp = alloca <8 x i64>, align 32
+  %tmp2 = alloca <8 x i64>, align 32
+  %tmp3 = bitcast <8 x i64>* %tmp to i8*
+  call void @llvm.memset.p0i8.i64(i8* align 32 %tmp3, i8 0, i64 32, i1 false)
+  call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %tmp2, <8 x i64>* %tmp)
+  %tmp4 = load <8 x i64>, <8 x i64>* %tmp2, align 32
+  store <8 x i64> %tmp4, <8 x i64>* %arg, align 2
+  ret void
+}
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #5
+
+attributes #0 = { inlinehint norecurse nounwind uwtable "target-features"="+avx512vl" "min-legal-vector-width"="512" "prefer-vector-width"="512" }
+attributes #1 = { inlinehint norecurse nounwind uwtable "target-features"="+avx512vl" "min-legal-vector-width"="512" "prefer-vector-width"="256" }
+attributes #2 = { inlinehint norecurse nounwind uwtable "target-features"="+avx512vl" "min-legal-vector-width"="256" "prefer-vector-width"="256" }
+attributes #3 = { inlinehint norecurse nounwind uwtable "target-features"="+avx2" "min-legal-vector-width"="512" "prefer-vector-width"="256" }
+attributes #4 = { inlinehint norecurse nounwind uwtable "target-features"="+avx2" "min-legal-vector-width"="256" "prefer-vector-width"="256" }
+attributes #5 = { argmemonly nounwind }

Added: llvm/trunk/test/Transforms/ArgumentPromotion/aggregate-promote.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/aggregate-promote.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/aggregate-promote.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/aggregate-promote.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,31 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+%T = type { i32, i32, i32, i32 }
+ at G = constant %T { i32 0, i32 0, i32 17, i32 25 }
+
+define internal i32 @test(%T* %p) {
+; CHECK-LABEL: define internal i32 @test(
+; CHECK: i32 %{{.*}}, i32 %{{.*}})
+entry:
+  %a.gep = getelementptr %T, %T* %p, i64 0, i32 3
+  %b.gep = getelementptr %T, %T* %p, i64 0, i32 2
+  %a = load i32, i32* %a.gep
+  %b = load i32, i32* %b.gep
+; CHECK-NOT: load
+  %v = add i32 %a, %b
+  ret i32 %v
+; CHECK: ret i32
+}
+
+define i32 @caller() {
+; CHECK-LABEL: define i32 @caller(
+entry:
+  %v = call i32 @test(%T* @G)
+; CHECK: %[[B_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 2
+; CHECK: %[[B:.*]] = load i32, i32* %[[B_GEP]]
+; CHECK: %[[A_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 3
+; CHECK: %[[A:.*]] = load i32, i32* %[[A_GEP]]
+; CHECK: call i32 @test(i32 %[[B]], i32 %[[A]])
+  ret i32 %v
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/attrs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/attrs.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/attrs.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/attrs.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,52 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+%struct.ss = type { i32, i64 }
+
+; Don't drop 'byval' on %X here.
+define internal void @f(%struct.ss* byval %b, i32* byval %X, i32 %i) nounwind {
+; CHECK-LABEL: define internal void @f(
+; CHECK: i32 %[[B0:.*]], i64 %[[B1:.*]], i32* byval %X, i32 %i)
+entry:
+; CHECK: %[[B:.*]] = alloca %struct.ss
+; CHECK: %[[B_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0
+; CHECK: store i32 %[[B0]], i32* %[[B_GEP0]]
+; CHECK: %[[B_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 1
+; CHECK: store i64 %[[B1]], i64* %[[B_GEP1]]
+
+  %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
+; CHECK: %[[TMP:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0
+  %tmp1 = load i32, i32* %tmp, align 4
+; CHECK: %[[TMP1:.*]] = load i32, i32* %[[TMP]]
+  %tmp2 = add i32 %tmp1, 1
+; CHECK: %[[TMP2:.*]] = add i32 %[[TMP1]], 1
+  store i32 %tmp2, i32* %tmp, align 4
+; CHECK: store i32 %[[TMP2]], i32* %[[TMP]]
+
+  store i32 0, i32* %X
+; CHECK: store i32 0, i32* %X
+  ret void
+}
+
+; Also make sure we don't drop the call zeroext attribute.
+define i32 @test(i32* %X) {
+; CHECK-LABEL: define i32 @test(
+entry:
+  %S = alloca %struct.ss
+; CHECK: %[[S:.*]] = alloca %struct.ss
+  %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
+  store i32 1, i32* %tmp1, align 8
+; CHECK: store i32 1
+  %tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
+  store i64 2, i64* %tmp4, align 4
+; CHECK: store i64 2
+
+  call void @f( %struct.ss* byval %S, i32* byval %X, i32 zeroext 0)
+; CHECK: %[[S_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 0
+; CHECK: %[[S0:.*]] = load i32, i32* %[[S_GEP0]]
+; CHECK: %[[S_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 1
+; CHECK: %[[S1:.*]] = load i64, i64* %[[S_GEP1]]
+; CHECK: call void @f(i32 %[[S0]], i64 %[[S1]], i32* byval %X, i32 zeroext 0)
+
+  ret i32 0
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/basictest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/basictest.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/basictest.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/basictest.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,29 @@
+; RUN: opt < %s -basicaa -argpromotion -mem2reg -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"
+
+define internal i32 @test(i32* %X, i32* %Y) {
+; CHECK-LABEL: define internal i32 @test(i32 %X.val, i32 %Y.val)
+  %A = load i32, i32* %X
+  %B = load i32, i32* %Y
+  %C = add i32 %A, %B
+  ret i32 %C
+}
+
+define internal i32 @caller(i32* %B) {
+; CHECK-LABEL: define internal i32 @caller(i32 %B.val1)
+  %A = alloca i32
+  store i32 1, i32* %A
+  %C = call i32 @test(i32* %A, i32* %B)
+; CHECK: call i32 @test(i32 1, i32 %B.val1)
+  ret i32 %C
+}
+
+define i32 @callercaller() {
+; CHECK-LABEL: define i32 @callercaller()
+  %B = alloca i32
+  store i32 2, i32* %B
+  %X = call i32 @caller(i32* %B)
+; CHECK: call i32 @caller(i32 2)
+  ret i32 %X
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/byval-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/byval-2.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/byval-2.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/byval-2.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,32 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; Arg promotion eliminates the struct argument.
+; FIXME: Should it eliminate the i32* argument?
+
+%struct.ss = type { i32, i64 }
+
+define internal void @f(%struct.ss* byval  %b, i32* byval %X) nounwind  {
+; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1, i32* byval %X)
+entry:
+  %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
+  %tmp1 = load i32, i32* %tmp, align 4
+  %tmp2 = add i32 %tmp1, 1
+  store i32 %tmp2, i32* %tmp, align 4
+
+  store i32 0, i32* %X
+  ret void
+}
+
+define i32 @test(i32* %X) {
+; CHECK-LABEL: define i32 @test
+entry:
+  %S = alloca %struct.ss
+  %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
+  store i32 1, i32* %tmp1, align 8
+  %tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
+  store i64 2, i64* %tmp4, align 4
+  call void @f( %struct.ss* byval %S, i32* byval %X)
+; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}}, i32* byval %{{.*}})
+  ret i32 0
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/byval.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/byval.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/byval.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/byval.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -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"
+
+%struct.ss = type { i32, i64 }
+
+define internal void @f(%struct.ss* byval  %b) nounwind  {
+entry:
+  %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
+  %tmp1 = load i32, i32* %tmp, align 4
+  %tmp2 = add i32 %tmp1, 1
+  store i32 %tmp2, i32* %tmp, align 4
+  ret void
+}
+
+; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1)
+; CHECK: alloca %struct.ss{{$}}
+; CHECK: store i32 %b.0
+; CHECK: store i64 %b.1
+
+define internal void @g(%struct.ss* byval align 32 %b) nounwind {
+entry:
+  %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0
+  %tmp1 = load i32, i32* %tmp, align 4
+  %tmp2 = add i32 %tmp1, 1
+  store i32 %tmp2, i32* %tmp, align 4
+  ret void
+}
+
+; CHECK-LABEL: define internal void @g(i32 %b.0, i64 %b.1)
+; CHECK: alloca %struct.ss, align 32
+; CHECK: store i32 %b.0
+; CHECK: store i64 %b.1
+
+define i32 @main() nounwind  {
+entry:
+  %S = alloca %struct.ss
+  %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
+  store i32 1, i32* %tmp1, align 8
+  %tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
+  store i64 2, i64* %tmp4, align 4
+  call void @f(%struct.ss* byval %S) nounwind
+  call void @g(%struct.ss* byval %S) nounwind
+  ret i32 0
+}
+
+; CHECK-LABEL: define i32 @main
+; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}})
+; CHECK: call void @g(i32 %{{.*}}, i64 %{{.*}})

Added: llvm/trunk/test/Transforms/ArgumentPromotion/chained.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/chained.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/chained.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/chained.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,27 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+ at G1 = constant i32 0
+ at G2 = constant i32* @G1
+
+define internal i32 @test(i32** %x) {
+; CHECK-LABEL: define internal i32 @test(
+; CHECK: i32 %{{.*}})
+entry:
+  %y = load i32*, i32** %x
+  %z = load i32, i32* %y
+; CHECK-NOT: load
+  ret i32 %z
+; CHECK: ret i32
+}
+
+define i32 @caller() {
+; CHECK-LABEL: define i32 @caller()
+entry:
+  %x = call i32 @test(i32** @G2)
+; CHECK: %[[Y:.*]] = load i32*, i32** @G2
+; CHECK: %[[Z:.*]] = load i32, i32* %[[Y]]
+; CHECK: call i32 @test(i32 %[[Z]])
+  ret i32 %x
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/control-flow.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/control-flow.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/control-flow.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/control-flow.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,27 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; Don't promote around control flow.
+define internal i32 @callee(i1 %C, i32* %P) {
+; CHECK-LABEL: define internal i32 @callee(
+; CHECK: i1 %C, i32* %P)
+entry:
+  br i1 %C, label %T, label %F
+
+T:
+  ret i32 17
+
+F:
+  %X = load i32, i32* %P
+  ret i32 %X
+}
+
+define i32 @foo() {
+; CHECK-LABEL: define i32 @foo(
+entry:
+; CHECK-NOT: load i32, i32* null
+  %X = call i32 @callee(i1 true, i32* null)
+; CHECK: call i32 @callee(i1 true, i32* null)
+  ret i32 %X
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/control-flow2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/control-flow2.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/control-flow2.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/control-flow2.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,24 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; CHECK: load i32, i32* %A
+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"
+
+define internal i32 @callee(i1 %C, i32* %P) {
+        br i1 %C, label %T, label %F
+
+T:              ; preds = %0
+        ret i32 17
+
+F:              ; preds = %0
+        %X = load i32, i32* %P               ; <i32> [#uses=1]
+        ret i32 %X
+}
+
+define i32 @foo() {
+        %A = alloca i32         ; <i32*> [#uses=2]
+        store i32 17, i32* %A
+        %X = call i32 @callee( i1 false, i32* %A )              ; <i32> [#uses=1]
+        ret i32 %X
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/crash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,73 @@
+; RUN: opt -S < %s -inline -argpromotion | FileCheck %s
+; RUN: opt -S < %s -passes=inline,argpromotion | FileCheck %s
+
+%S = type { %S* }
+
+; Inlining should nuke the invoke (and any inlined calls) here even with
+; argument promotion running along with it.
+define void @zot() personality i32 (...)* @wibble {
+; CHECK-LABEL: define void @zot() personality i32 (...)* @wibble
+; CHECK-NOT: call
+; CHECK-NOT: invoke
+bb:
+  invoke void @hoge()
+          to label %bb1 unwind label %bb2
+
+bb1:
+  unreachable
+
+bb2:
+  %tmp = landingpad { i8*, i32 }
+          cleanup
+  unreachable
+}
+
+define internal void @hoge() {
+bb:
+  %tmp = call fastcc i8* @spam(i1 (i8*)* @eggs)
+  %tmp1 = call fastcc i8* @spam(i1 (i8*)* @barney)
+  unreachable
+}
+
+define internal fastcc i8* @spam(i1 (i8*)* %arg) {
+bb:
+  unreachable
+}
+
+define internal i1 @eggs(i8* %arg) {
+bb:
+  %tmp = call zeroext i1 @barney(i8* %arg)
+  unreachable
+}
+
+define internal i1 @barney(i8* %arg) {
+bb:
+  ret i1 undef
+}
+
+define i32 @test_inf_promote_caller(i32 %arg) {
+; CHECK-LABEL: define i32 @test_inf_promote_caller(
+bb:
+  %tmp = alloca %S
+  %tmp1 = alloca %S
+  %tmp2 = call i32 @test_inf_promote_callee(%S* %tmp, %S* %tmp1)
+; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}})
+
+  ret i32 0
+}
+
+define internal i32 @test_inf_promote_callee(%S* %arg, %S* %arg1) {
+; CHECK-LABEL: define internal i32 @test_inf_promote_callee(
+; CHECK: %S* %{{.*}}, %S* %{{.*}})
+bb:
+  %tmp = getelementptr %S, %S* %arg1, i32 0, i32 0
+  %tmp2 = load %S*, %S** %tmp
+  %tmp3 = getelementptr %S, %S* %arg, i32 0, i32 0
+  %tmp4 = load %S*, %S** %tmp3
+  %tmp5 = call i32 @test_inf_promote_callee(%S* %tmp4, %S* %tmp2)
+; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}})
+
+  ret i32 0
+}
+
+declare i32 @wibble(...)

Added: llvm/trunk/test/Transforms/ArgumentPromotion/dbg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/dbg.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/dbg.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/dbg.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,49 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+declare void @sink(i32)
+
+; CHECK: define internal void @test({{.*}} !dbg [[SP:![0-9]+]]
+define internal void @test(i32** %X) !dbg !2 {
+  %1 = load i32*, i32** %X, align 8
+  %2 = load i32, i32* %1, align 8
+  call void @sink(i32 %2)
+  ret void
+}
+
+%struct.pair = type { i32, i32 }
+
+; CHECK: define internal void @test_byval(i32 %{{.*}}, i32 %{{.*}})
+define internal void @test_byval(%struct.pair* byval %P) {
+  ret void
+}
+
+; CHECK-LABEL: define {{.*}} @caller(
+define void @caller(i32** %Y, %struct.pair* %P) {
+; CHECK:  load i32*, {{.*}} !dbg [[LOC_1:![0-9]+]]
+; CHECK-NEXT:  load i32, {{.*}} !dbg [[LOC_1]]
+; CHECK-NEXT: call void @test(i32 %{{.*}}), !dbg [[LOC_1]]
+  call void @test(i32** %Y), !dbg !1
+
+; CHECK: getelementptr %struct.pair, {{.*}} !dbg [[LOC_2:![0-9]+]]
+; CHECK-NEXT: load i32, i32* {{.*}} !dbg [[LOC_2]]
+; CHECK-NEXT: getelementptr %struct.pair, {{.*}} !dbg [[LOC_2]]
+; CHECK-NEXT: load i32, i32* {{.*}} !dbg [[LOC_2]]
+; CHECK-NEXT: call void @test_byval(i32 %{{.*}}, i32 %{{.*}}), !dbg [[LOC_2]]
+  call void @test_byval(%struct.pair* %P), !dbg !6
+  ret void
+}
+
+; CHECK: [[SP]] = distinct !DISubprogram(name: "test",
+; CHECK: [[LOC_1]] = !DILocation(line: 8
+; CHECK: [[LOC_2]] = !DILocation(line: 9
+
+!llvm.module.flags = !{!0}
+!llvm.dbg.cu = !{!3}
+
+!0 = !{i32 2, !"Debug Info Version", i32 3}
+!1 = !DILocation(line: 8, scope: !2)
+!2 = distinct !DISubprogram(name: "test", file: !5, line: 3, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !3, scopeLine: 3, scope: null)
+!3 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: LineTablesOnly, file: !5)
+!5 = !DIFile(filename: "test.c", directory: "")
+!6 = !DILocation(line: 9, scope: !2)

Added: llvm/trunk/test/Transforms/ArgumentPromotion/fp80.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/fp80.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/fp80.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/fp80.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,59 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+%union.u = type { x86_fp80 }
+%struct.s = type { double, i16, i8, [5 x i8] }
+
+ at b = internal global %struct.s { double 3.14, i16 9439, i8 25, [5 x i8] undef }, align 16
+
+%struct.Foo = type { i32, i64 }
+ at a = internal global %struct.Foo { i32 1, i64 2 }, align 8
+
+define void @run() {
+entry:
+  tail call i8 @UseLongDoubleUnsafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*))
+  tail call x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*))
+  call i64 @AccessPaddingOfStruct(%struct.Foo* @a)
+  call i64 @CaptureAStruct(%struct.Foo* @a)
+  ret void
+}
+
+; CHECK: internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) {
+define internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) {
+entry:
+  %bitcast = bitcast %union.u* %arg to %struct.s*
+  %gep = getelementptr inbounds %struct.s, %struct.s* %bitcast, i64 0, i32 2
+  %result = load i8, i8* %gep
+  ret i8 %result
+}
+
+; CHECK: internal x86_fp80 @UseLongDoubleSafely(x86_fp80 {{%.*}}) {
+define internal x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 %arg) {
+  %gep = getelementptr inbounds %union.u, %union.u* %arg, i64 0, i32 0
+  %fp80 = load x86_fp80, x86_fp80* %gep
+  ret x86_fp80 %fp80
+}
+
+; CHECK: define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) {
+define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) {
+  %p = bitcast %struct.Foo* %a to i64*
+  %v = load i64, i64* %p
+  ret i64 %v
+}
+
+; CHECK: define internal i64 @CaptureAStruct(%struct.Foo* byval %a) {
+define internal i64 @CaptureAStruct(%struct.Foo* byval %a) {
+entry:
+  %a_ptr = alloca %struct.Foo*
+  br label %loop
+
+loop:
+  %phi = phi %struct.Foo* [ null, %entry ], [ %gep, %loop ]
+  %0   = phi %struct.Foo* [ %a, %entry ],   [ %0, %loop ]
+  store %struct.Foo* %phi, %struct.Foo** %a_ptr
+  %gep = getelementptr %struct.Foo, %struct.Foo* %a, i64 0
+  br label %loop
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/inalloca.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/inalloca.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/inalloca.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/inalloca.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; RUN: opt %s -argpromotion -sroa -S | FileCheck %s
+; RUN: opt %s -passes='argpromotion,function(sroa)' -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"
+
+%struct.ss = type { i32, i32 }
+
+; Argpromote + sroa should change this to passing the two integers by value.
+define internal i32 @f(%struct.ss* inalloca  %s) {
+entry:
+  %f0 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 0
+  %f1 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 1
+  %a = load i32, i32* %f0, align 4
+  %b = load i32, i32* %f1, align 4
+  %r = add i32 %a, %b
+  ret i32 %r
+}
+; CHECK-LABEL: define internal i32 @f
+; CHECK-NOT: load
+; CHECK: ret
+
+define i32 @main() {
+entry:
+  %S = alloca inalloca %struct.ss
+  %f0 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0
+  %f1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1
+  store i32 1, i32* %f0, align 4
+  store i32 2, i32* %f1, align 4
+  %r = call i32 @f(%struct.ss* inalloca %S)
+  ret i32 %r
+}
+; CHECK-LABEL: define i32 @main
+; CHECK-NOT: load
+; CHECK: ret
+
+; Argpromote can't promote %a because of the icmp use.
+define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b) nounwind  {
+; CHECK: define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b)
+entry:
+  %c = icmp eq %struct.ss* %a, %b
+  ret i1 %c
+}
+
+define i32 @test() {
+entry:
+  %S = alloca inalloca %struct.ss
+  %c = call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
+; CHECK: call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S)
+  ret i32 0
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/invalidation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/invalidation.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/invalidation.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/invalidation.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; Check that when argument promotion changes a function in some parent node of
+; the call graph, any analyses that happened to be cached for that function are
+; actually invalidated. We are using `demanded-bits` here because when printed
+; it will end up caching a value for every instruction, making it easy to
+; detect the instruction-level changes that will fail here. With improper
+; invalidation this will crash in the second printer as it tries to reuse
+; now-invalid demanded bits.
+;
+; RUN: opt < %s -passes='function(print<demanded-bits>),cgscc(argpromotion,function(print<demanded-bits>))' -S | FileCheck %s
+
+ at G = constant i32 0
+
+define internal i32 @a(i32* %x) {
+; CHECK-LABEL: define internal i32 @a(
+; CHECK-SAME:                         i32 %[[V:.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    ret i32 %[[V]]
+; CHECK-NEXT:  }
+entry:
+  %v = load i32, i32* %x
+  ret i32 %v
+}
+
+define i32 @b() {
+; CHECK-LABEL: define i32 @b()
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    %[[L:.*]] = load i32, i32* @G
+; CHECK-NEXT:    %[[V:.*]] = call i32 @a(i32 %[[L]])
+; CHECK-NEXT:    ret i32 %[[V]]
+; CHECK-NEXT:  }
+entry:
+  %v = call i32 @a(i32* @G)
+  ret i32 %v
+}
+
+define i32 @c() {
+; CHECK-LABEL: define i32 @c()
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    %[[L:.*]] = load i32, i32* @G
+; CHECK-NEXT:    %[[V1:.*]] = call i32 @a(i32 %[[L]])
+; CHECK-NEXT:    %[[V2:.*]] = call i32 @b()
+; CHECK-NEXT:    %[[RESULT:.*]] = add i32 %[[V1]], %[[V2]]
+; CHECK-NEXT:    ret i32 %[[RESULT]]
+; CHECK-NEXT:  }
+entry:
+  %v1 = call i32 @a(i32* @G)
+  %v2 = call i32 @b()
+  %result = add i32 %v1, %v2
+  ret i32 %result
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/musttail.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/musttail.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/musttail.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/musttail.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,45 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; PR36543
+
+; Don't promote arguments of musttail callee
+
+%T = type { i32, i32, i32, i32 }
+
+; CHECK-LABEL: define internal i32 @test(%T* %p)
+define internal i32 @test(%T* %p) {
+  %a.gep = getelementptr %T, %T* %p, i64 0, i32 3
+  %b.gep = getelementptr %T, %T* %p, i64 0, i32 2
+  %a = load i32, i32* %a.gep
+  %b = load i32, i32* %b.gep
+  %v = add i32 %a, %b
+  ret i32 %v
+}
+
+; CHECK-LABEL: define i32 @caller(%T* %p)
+define i32 @caller(%T* %p) {
+  %v = musttail call i32 @test(%T* %p)
+  ret i32 %v
+}
+
+; Don't promote arguments of musttail caller
+
+define i32 @foo(%T* %p, i32 %v) {
+  ret i32 0
+}
+
+; CHECK-LABEL: define internal i32 @test2(%T* %p, i32 %p2)
+define internal i32 @test2(%T* %p, i32 %p2) {
+  %a.gep = getelementptr %T, %T* %p, i64 0, i32 3
+  %b.gep = getelementptr %T, %T* %p, i64 0, i32 2
+  %a = load i32, i32* %a.gep
+  %b = load i32, i32* %b.gep
+  %v = add i32 %a, %b
+  %ca = musttail call i32 @foo(%T* undef, i32 %v)
+  ret i32 %ca
+}
+
+; CHECK-LABEL: define i32 @caller2(%T* %g)
+define i32 @caller2(%T* %g) {
+  %v = call i32 @test2(%T* %g, i32 0)
+  ret i32 %v
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/naked_functions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/naked_functions.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/naked_functions.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/naked_functions.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+
+; Don't promote paramaters of/arguments to naked functions
+
+ at g = common global i32 0, align 4
+
+define i32 @bar() {
+entry:
+  %call = call i32 @foo(i32* @g)
+; CHECK: %call = call i32 @foo(i32* @g)
+  ret i32 %call
+}
+
+define internal i32 @foo(i32*) #0 {
+entry:
+  %retval = alloca i32, align 4
+  call void asm sideeffect "ldr r0, [r0] \0Abx lr        \0A", ""()
+  unreachable
+}
+
+; CHECK: define internal i32 @foo(i32*)
+
+attributes #0 = { naked }

Added: llvm/trunk/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,24 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+
+; ArgumentPromotion should preserve the default function address space
+; from the data layout.
+
+target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
+
+ at g = common global i32 0, align 4
+
+define i32 @bar() {
+entry:
+  %call = call i32 @foo(i32* @g)
+; CHECK: %call = call addrspace(1) i32 @foo()
+  ret i32 %call
+}
+
+; CHECK: define internal i32 @foo() addrspace(1)
+define internal i32 @foo(i32*) {
+entry:
+  %retval = alloca i32, align 4
+  call void asm sideeffect "ldr r0, [r0] \0Abx lr        \0A", ""()
+  unreachable
+}
+

Added: llvm/trunk/test/Transforms/ArgumentPromotion/pr27568.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/pr27568.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/pr27568.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/pr27568.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,33 @@
+; RUN: opt -S -argpromotion < %s | FileCheck %s
+; RUN: opt -S -passes=argpromotion < %s | FileCheck %s
+; RUN: opt -S -debugify -o /dev/null < %s
+target triple = "x86_64-pc-windows-msvc"
+
+define internal void @callee(i8*) {
+entry:
+  call void @thunk()
+  ret void
+}
+
+define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
+entry:
+  invoke void @thunk()
+          to label %out unwind label %cpad
+
+out:
+  ret void
+
+cpad:
+  %pad = cleanuppad within none []
+  call void @callee(i8* null) [ "funclet"(token %pad) ]
+  cleanupret from %pad unwind to caller
+}
+
+; CHECK-LABEL: define void @test1(
+; CHECK:      %[[pad:.*]] = cleanuppad within none []
+; CHECK-NEXT: call void @callee() [ "funclet"(token %[[pad]]) ]
+; CHECK-NEXT: cleanupret from %[[pad]] unwind to caller
+
+declare void @thunk()
+
+declare i32 @__CxxFrameHandler3(...)

Added: llvm/trunk/test/Transforms/ArgumentPromotion/pr3085.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/pr3085.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/pr3085.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/pr3085.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,1944 @@
+; RUN: opt < %s -disable-output -loop-extract-single -loop-rotate -loop-reduce -argpromotion
+; PR 3085
+
+	%struct.Lit = type { i8 }
+
+define fastcc %struct.Lit* @import_lit(i32 %lit) nounwind {
+entry:
+	br i1 false, label %bb, label %bb1
+
+bb:		; preds = %entry
+	unreachable
+
+bb1:		; preds = %entry
+	br label %bb3
+
+bb2:		; preds = %bb3
+	br label %bb3
+
+bb3:		; preds = %bb2, %bb1
+	br i1 false, label %bb2, label %bb6
+
+bb6:		; preds = %bb3
+	br i1 false, label %bb.i.i, label %bb1.i.i
+
+bb.i.i:		; preds = %bb6
+	br label %int2lit.exit
+
+bb1.i.i:		; preds = %bb6
+	br label %int2lit.exit
+
+int2lit.exit:		; preds = %bb1.i.i, %bb.i.i
+	ret %struct.Lit* null
+}
+
+define fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind {
+entry:
+	br i1 false, label %bb.i, label %picosat_time_stamp.exit
+
+bb.i:		; preds = %entry
+	br label %picosat_time_stamp.exit
+
+picosat_time_stamp.exit:		; preds = %bb.i, %entry
+	br label %bb108
+
+bb:		; preds = %bb108
+	br i1 false, label %bb1, label %bb2
+
+bb1:		; preds = %bb
+	br label %bb106
+
+bb2:		; preds = %bb
+	br i1 false, label %bb3, label %bb4
+
+bb3:		; preds = %bb2
+	br label %bb106
+
+bb4:		; preds = %bb2
+	br i1 false, label %bb5, label %bb6
+
+bb5:		; preds = %bb4
+	br label %bb106
+
+bb6:		; preds = %bb4
+	br i1 false, label %bb7, label %bb8
+
+bb7:		; preds = %bb6
+	br label %bb106
+
+bb8:		; preds = %bb6
+	br i1 false, label %bb106, label %bb10
+
+bb10:		; preds = %bb8
+	br i1 false, label %bb106, label %bb12
+
+bb12:		; preds = %bb10
+	br i1 false, label %bb106, label %bb14
+
+bb14:		; preds = %bb12
+	br i1 false, label %bb15, label %bb19
+
+bb15:		; preds = %bb14
+	br i1 false, label %bb16, label %bb17
+
+bb16:		; preds = %bb15
+	br label %bb106
+
+bb17:		; preds = %bb15
+	br label %bb106
+
+bb19:		; preds = %bb14
+	br i1 false, label %bb20, label %bb28
+
+bb20:		; preds = %bb19
+	br i1 false, label %bb21, label %bb22
+
+bb21:		; preds = %bb20
+	br label %bb106
+
+bb22:		; preds = %bb20
+	br i1 false, label %bb106, label %bb24
+
+bb24:		; preds = %bb22
+	br i1 false, label %bb106, label %bb26
+
+bb26:		; preds = %bb24
+	br label %bb106
+
+bb28:		; preds = %bb19
+	br i1 false, label %bb29, label %bb35
+
+bb29:		; preds = %bb28
+	br i1 false, label %bb30, label %bb31
+
+bb30:		; preds = %bb29
+	br label %bb106
+
+bb31:		; preds = %bb29
+	br i1 false, label %bb32, label %bb33
+
+bb32:		; preds = %bb31
+	br label %bb106
+
+bb33:		; preds = %bb31
+	br label %bb106
+
+bb35:		; preds = %bb28
+	br i1 false, label %bb36, label %bb40
+
+bb36:		; preds = %bb35
+	br i1 false, label %bb37, label %bb38
+
+bb37:		; preds = %bb36
+	br label %bb106
+
+bb38:		; preds = %bb36
+	br label %bb106
+
+bb40:		; preds = %bb35
+	br i1 false, label %bb41, label %bb49
+
+bb41:		; preds = %bb40
+	br i1 false, label %bb43, label %bb42
+
+bb42:		; preds = %bb41
+	br label %bb106
+
+bb43:		; preds = %bb41
+	br i1 false, label %bb44, label %bb45
+
+bb44:		; preds = %bb43
+	br label %bb106
+
+bb45:		; preds = %bb43
+	br i1 false, label %bb46, label %bb47
+
+bb46:		; preds = %bb45
+	br label %bb106
+
+bb47:		; preds = %bb45
+	br label %bb106
+
+bb49:		; preds = %bb40
+	br i1 false, label %bb50, label %bb56
+
+bb50:		; preds = %bb49
+	br i1 false, label %bb52, label %bb51
+
+bb51:		; preds = %bb50
+	br label %bb106
+
+bb52:		; preds = %bb50
+	br i1 false, label %bb53, label %bb54
+
+bb53:		; preds = %bb52
+	br label %bb106
+
+bb54:		; preds = %bb52
+	br label %bb106
+
+bb56:		; preds = %bb49
+	br i1 false, label %bb57, label %bb63
+
+bb57:		; preds = %bb56
+	br i1 false, label %bb59, label %bb58
+
+bb58:		; preds = %bb57
+	br label %bb106
+
+bb59:		; preds = %bb57
+	br i1 false, label %bb60, label %bb61
+
+bb60:		; preds = %bb59
+	br label %bb106
+
+bb61:		; preds = %bb59
+	br label %bb106
+
+bb63:		; preds = %bb56
+	br i1 false, label %bb64, label %bb70
+
+bb64:		; preds = %bb63
+	br i1 false, label %bb66, label %bb65
+
+bb65:		; preds = %bb64
+	br label %bb106
+
+bb66:		; preds = %bb64
+	br i1 false, label %bb67, label %bb68
+
+bb67:		; preds = %bb66
+	br label %bb106
+
+bb68:		; preds = %bb66
+	br label %bb106
+
+bb70:		; preds = %bb63
+	br i1 false, label %bb71, label %bb79
+
+bb71:		; preds = %bb70
+	br i1 false, label %bb73, label %bb72
+
+bb72:		; preds = %bb71
+	br label %bb106
+
+bb73:		; preds = %bb71
+	br i1 false, label %bb74, label %bb75
+
+bb74:		; preds = %bb73
+	br label %bb106
+
+bb75:		; preds = %bb73
+	br i1 false, label %bb76, label %bb77
+
+bb76:		; preds = %bb75
+	br label %bb106
+
+bb77:		; preds = %bb75
+	br label %bb106
+
+bb79:		; preds = %bb70
+	br i1 false, label %bb80, label %bb86
+
+bb80:		; preds = %bb79
+	br i1 false, label %bb82, label %bb81
+
+bb81:		; preds = %bb80
+	br label %bb106
+
+bb82:		; preds = %bb80
+	br i1 false, label %bb83, label %bb84
+
+bb83:		; preds = %bb82
+	br label %bb106
+
+bb84:		; preds = %bb82
+	br label %bb106
+
+bb86:		; preds = %bb79
+	br i1 false, label %bb87, label %bb93
+
+bb87:		; preds = %bb86
+	br i1 false, label %bb89, label %bb88
+
+bb88:		; preds = %bb87
+	br label %bb106
+
+bb89:		; preds = %bb87
+	br i1 false, label %bb90, label %bb91
+
+bb90:		; preds = %bb89
+	br label %bb106
+
+bb91:		; preds = %bb89
+	br label %bb106
+
+bb93:		; preds = %bb86
+	br i1 false, label %bb94, label %bb95
+
+bb94:		; preds = %bb93
+	br label %bb106
+
+bb95:		; preds = %bb93
+	br i1 false, label %bb98, label %bb97
+
+bb97:		; preds = %bb95
+	br label %bb106
+
+bb98:		; preds = %bb95
+	br i1 false, label %bb103, label %bb1.i24
+
+bb1.i24:		; preds = %bb98
+	br i1 false, label %bb99, label %bb103
+
+bb99:		; preds = %bb1.i24
+	br i1 false, label %bb101, label %bb100
+
+bb100:		; preds = %bb99
+	br label %bb102
+
+bb101:		; preds = %bb99
+	br label %bb102
+
+bb102:		; preds = %bb101, %bb100
+	br label %bb106
+
+bb103:		; preds = %bb1.i24, %bb98
+	br i1 false, label %bb104, label %bb105
+
+bb104:		; preds = %bb103
+	br label %bb106
+
+bb105:		; preds = %bb103
+	br label %bb106
+
+bb106:		; preds = %bb105, %bb104, %bb102, %bb97, %bb94, %bb91, %bb90, %bb88, %bb84, %bb83, %bb81, %bb77, %bb76, %bb74, %bb72, %bb68, %bb67, %bb65, %bb61, %bb60, %bb58, %bb54, %bb53, %bb51, %bb47, %bb46, %bb44, %bb42, %bb38, %bb37, %bb33, %bb32, %bb30, %bb26, %bb24, %bb22, %bb21, %bb17, %bb16, %bb12, %bb10, %bb8, %bb7, %bb5, %bb3, %bb1
+	br i1 false, label %bb108, label %bb110
+
+bb108:		; preds = %bb106, %picosat_time_stamp.exit
+	br i1 false, label %bb, label %bb110
+
+bb110:		; preds = %bb108, %bb106
+	br i1 false, label %bb112, label %bb171
+
+bb112:		; preds = %bb110
+	br i1 false, label %bb114, label %bb113
+
+bb113:		; preds = %bb112
+	br label %bb114
+
+bb114:		; preds = %bb113, %bb112
+	br i1 false, label %bb.i.i35, label %bb1.i.i36
+
+bb.i.i35:		; preds = %bb114
+	unreachable
+
+bb1.i.i36:		; preds = %bb114
+	br i1 false, label %bb5.i.i.i41, label %bb6.i.i.i42
+
+bb5.i.i.i41:		; preds = %bb1.i.i36
+	unreachable
+
+bb6.i.i.i42:		; preds = %bb1.i.i36
+	br i1 false, label %bb7.i.i.i43, label %bb8.i.i.i44
+
+bb7.i.i.i43:		; preds = %bb6.i.i.i42
+	br label %bb8.i.i.i44
+
+bb8.i.i.i44:		; preds = %bb7.i.i.i43, %bb6.i.i.i42
+	br i1 false, label %picosat_init.exit, label %bb14.i.i
+
+bb14.i.i:		; preds = %bb8.i.i.i44
+	br label %picosat_init.exit
+
+picosat_init.exit:		; preds = %bb14.i.i, %bb8.i.i.i44
+	br i1 false, label %bb116, label %bb115
+
+bb115:		; preds = %picosat_init.exit
+	br label %bb116
+
+bb116:		; preds = %bb115, %picosat_init.exit
+	br i1 false, label %bb119, label %bb118
+
+bb118:		; preds = %bb116
+	br label %bb119
+
+bb119:		; preds = %bb118, %bb116
+	br i1 false, label %bb121, label %bb120
+
+bb120:		; preds = %bb119
+	br label %bb121
+
+bb121:		; preds = %bb120, %bb119
+	br i1 false, label %bb126, label %bb122
+
+bb122:		; preds = %bb121
+	br label %bb126
+
+bb126:		; preds = %bb122, %bb121
+	br i1 false, label %bb128, label %bb127
+
+bb127:		; preds = %bb126
+	br label %bb128
+
+bb128:		; preds = %bb127, %bb126
+	br label %SKIP_COMMENTS.i
+
+SKIP_COMMENTS.i.loopexit:		; preds = %bb.i149, %bb.i149
+	br label %SKIP_COMMENTS.i.backedge
+
+SKIP_COMMENTS.i:		; preds = %SKIP_COMMENTS.i.backedge, %bb128
+	br i1 false, label %bb.i149.preheader, label %bb3.i152
+
+bb.i149.preheader:		; preds = %SKIP_COMMENTS.i
+	br label %bb.i149
+
+bb.i149:		; preds = %bb.i149, %bb.i149.preheader
+	switch i32 0, label %bb.i149 [
+		i32 -1, label %SKIP_COMMENTS.i.loopexit
+		i32 10, label %SKIP_COMMENTS.i.loopexit
+	]
+
+bb3.i152:		; preds = %SKIP_COMMENTS.i
+	br i1 false, label %bb4.i153, label %SKIP_COMMENTS.i.backedge
+
+SKIP_COMMENTS.i.backedge:		; preds = %bb3.i152, %SKIP_COMMENTS.i.loopexit
+	br label %SKIP_COMMENTS.i
+
+bb4.i153:		; preds = %bb3.i152
+	br i1 false, label %bb5.i154, label %bb129
+
+bb5.i154:		; preds = %bb4.i153
+	br i1 false, label %bb129, label %bb6.i155.preheader
+
+bb6.i155.preheader:		; preds = %bb5.i154
+	br label %bb6.i155
+
+bb6.i155:		; preds = %bb6.i155, %bb6.i155.preheader
+	br i1 false, label %bb7.i156, label %bb6.i155
+
+bb7.i156:		; preds = %bb6.i155
+	br i1 false, label %bb8.i157, label %bb129
+
+bb8.i157:		; preds = %bb7.i156
+	br i1 false, label %bb9.i158, label %bb129
+
+bb9.i158:		; preds = %bb8.i157
+	br i1 false, label %bb10.i159, label %bb129
+
+bb10.i159:		; preds = %bb9.i158
+	br i1 false, label %bb129, label %bb11.i160.preheader
+
+bb11.i160.preheader:		; preds = %bb10.i159
+	br label %bb11.i160
+
+bb11.i160:		; preds = %bb11.i160, %bb11.i160.preheader
+	br i1 false, label %bb12.i161, label %bb11.i160
+
+bb12.i161:		; preds = %bb11.i160
+	br i1 false, label %bb129, label %bb15.i165.preheader
+
+bb15.i165.preheader:		; preds = %bb12.i161
+	br label %bb15.i165
+
+bb14.i163:		; preds = %bb15.i165
+	br label %bb15.i165
+
+bb15.i165:		; preds = %bb14.i163, %bb15.i165.preheader
+	br i1 false, label %bb16.i166, label %bb14.i163
+
+bb16.i166:		; preds = %bb15.i165
+	br i1 false, label %bb129, label %bb17.i167.preheader
+
+bb17.i167.preheader:		; preds = %bb16.i166
+	br label %bb17.i167
+
+bb17.i167:		; preds = %bb17.i167, %bb17.i167.preheader
+	br i1 false, label %bb18.i168, label %bb17.i167
+
+bb18.i168:		; preds = %bb17.i167
+	br i1 false, label %bb129, label %bb21.i172.preheader
+
+bb21.i172.preheader:		; preds = %bb18.i168
+	br label %bb21.i172
+
+bb20.i170:		; preds = %bb21.i172
+	br label %bb21.i172
+
+bb21.i172:		; preds = %bb20.i170, %bb21.i172.preheader
+	br i1 false, label %bb22.i173, label %bb20.i170
+
+bb22.i173:		; preds = %bb21.i172
+	br i1 false, label %bb24.i175, label %bb129
+
+bb24.i175:		; preds = %bb22.i173
+	br i1 false, label %bb26.i180, label %bb25.i176
+
+bb25.i176:		; preds = %bb24.i175
+	br label %bb26.i180
+
+bb26.i180:		; preds = %bb25.i176, %bb24.i175
+	br i1 false, label %bb.i.i181, label %bb3.i.i184.preheader
+
+bb.i.i181:		; preds = %bb26.i180
+	br label %bb3.i.i184.preheader
+
+bb3.i.i184.preheader:		; preds = %bb.i.i181, %bb26.i180
+	br label %bb3.i.i184
+
+bb2.i.i183:		; preds = %bb3.i.i184
+	br label %bb3.i.i184
+
+bb3.i.i184:		; preds = %bb2.i.i183, %bb3.i.i184.preheader
+	br i1 false, label %bb2.i.i183, label %bb4.i.i185
+
+bb4.i.i185:		; preds = %bb3.i.i184
+	br i1 false, label %bb.i.i.i186, label %picosat_adjust.exit.i
+
+bb.i.i.i186:		; preds = %bb4.i.i185
+	br label %picosat_adjust.exit.i
+
+picosat_adjust.exit.i:		; preds = %bb.i.i.i186, %bb4.i.i185
+	br i1 false, label %bb28.i188, label %bb27.i187
+
+bb27.i187:		; preds = %picosat_adjust.exit.i
+	br label %bb28.i188
+
+bb28.i188:		; preds = %bb27.i187, %picosat_adjust.exit.i
+	br label %READ_LITERAL.i.outer
+
+READ_LITERAL.i.outer:		; preds = %READ_LITERAL.i.outer.backedge, %bb28.i188
+	br label %READ_LITERAL.i
+
+READ_LITERAL.i.loopexit:		; preds = %bb29.i189, %bb29.i189
+	br label %READ_LITERAL.i.backedge
+
+READ_LITERAL.i:		; preds = %READ_LITERAL.i.backedge, %READ_LITERAL.i.outer
+	switch i32 0, label %bb39.i199 [
+		i32 99, label %bb29.i189.preheader
+		i32 -1, label %bb33.i193
+	]
+
+bb29.i189.preheader:		; preds = %READ_LITERAL.i
+	br label %bb29.i189
+
+bb29.i189:		; preds = %bb29.i189, %bb29.i189.preheader
+	switch i32 0, label %bb29.i189 [
+		i32 -1, label %READ_LITERAL.i.loopexit
+		i32 10, label %READ_LITERAL.i.loopexit
+	]
+
+bb33.i193:		; preds = %READ_LITERAL.i
+	br i1 false, label %bb35.i195, label %parse.exit
+
+bb35.i195:		; preds = %bb33.i193
+	br i1 false, label %bb38.i198, label %parse.exit
+
+bb38.i198:		; preds = %bb35.i195
+	br label %parse.exit
+
+bb39.i199:		; preds = %READ_LITERAL.i
+	br i1 false, label %bb40.i200, label %READ_LITERAL.i.backedge
+
+READ_LITERAL.i.backedge:		; preds = %bb39.i199, %READ_LITERAL.i.loopexit
+	br label %READ_LITERAL.i
+
+bb40.i200:		; preds = %bb39.i199
+	br i1 false, label %bb41.i201, label %bb42.i202
+
+bb41.i201:		; preds = %bb40.i200
+	br label %bb42.i202
+
+bb42.i202:		; preds = %bb41.i201, %bb40.i200
+	br i1 false, label %parse.exit.loopexit, label %bb46.i.preheader
+
+bb46.i.preheader:		; preds = %bb42.i202
+	br label %bb46.i
+
+bb45.i:		; preds = %bb46.i
+	br label %bb46.i
+
+bb46.i:		; preds = %bb45.i, %bb46.i.preheader
+	br i1 false, label %bb47.i, label %bb45.i
+
+bb47.i:		; preds = %bb46.i
+	br i1 false, label %parse.exit.loopexit, label %bb50.i
+
+bb50.i:		; preds = %bb47.i
+	br i1 false, label %bb55.i, label %bb51.i
+
+bb51.i:		; preds = %bb50.i
+	br i1 false, label %parse.exit.loopexit, label %bb54.i
+
+bb54.i:		; preds = %bb51.i
+	br label %bb56.i
+
+bb55.i:		; preds = %bb50.i
+	br label %bb56.i
+
+bb56.i:		; preds = %bb55.i, %bb54.i
+	br i1 false, label %bb3.i11.i, label %bb.i8.i
+
+bb.i8.i:		; preds = %bb56.i
+	br i1 false, label %bb1.i9.i, label %bb3.i11.i
+
+bb1.i9.i:		; preds = %bb.i8.i
+	br i1 false, label %bb3.i11.i, label %bb2.i10.i
+
+bb2.i10.i:		; preds = %bb1.i9.i
+	unreachable
+
+bb3.i11.i:		; preds = %bb1.i9.i, %bb.i8.i, %bb56.i
+	br i1 false, label %bb7.i.i208, label %bb6.i.i207
+
+bb6.i.i207:		; preds = %bb3.i11.i
+	br label %READ_LITERAL.i.outer.backedge
+
+bb7.i.i208:		; preds = %bb3.i11.i
+	br i1 false, label %bb53.i.i.i.i.preheader, label %bb.i.i.i.i210.preheader
+
+bb.i.i.i.i210.preheader:		; preds = %bb7.i.i208
+	br label %bb.i.i.i.i210
+
+bb.i.i.i.i210:		; preds = %bb.i.i.i.i210.backedge, %bb.i.i.i.i210.preheader
+	br i1 false, label %bb17.i.i.i.i, label %bb18.i.i.i.i
+
+bb17.i.i.i.i:		; preds = %bb.i.i.i.i210
+	br label %bb18.i.i.i.i
+
+bb18.i.i.i.i:		; preds = %bb17.i.i.i.i, %bb.i.i.i.i210
+	br i1 false, label %bb19.i.i.i.i, label %bb20.i.i.i.i
+
+bb19.i.i.i.i:		; preds = %bb18.i.i.i.i
+	br label %bb20.i.i.i.i
+
+bb20.i.i.i.i:		; preds = %bb19.i.i.i.i, %bb18.i.i.i.i
+	br i1 false, label %bb21.i.i.i.i, label %bb22.i.i.i.i
+
+bb21.i.i.i.i:		; preds = %bb20.i.i.i.i
+	br label %bb22.i.i.i.i
+
+bb22.i.i.i.i:		; preds = %bb21.i.i.i.i, %bb20.i.i.i.i
+	br label %bb23.i.i.i.i.outer
+
+bb23.i.i.i.i.outer:		; preds = %bb28.i.i.i.i, %bb22.i.i.i.i
+	br label %bb23.i.i.i.i
+
+bb23.i.i.i.i:		; preds = %bb23.i.i.i.i, %bb23.i.i.i.i.outer
+	br i1 false, label %bb23.i.i.i.i, label %bb26.i.i.i.i.preheader
+
+bb26.i.i.i.i.preheader:		; preds = %bb23.i.i.i.i
+	br label %bb26.i.i.i.i
+
+bb26.i.i.i.i:		; preds = %bb26.i.i.i.i, %bb26.i.i.i.i.preheader
+	br i1 false, label %bb27.i.i.i.i, label %bb26.i.i.i.i
+
+bb27.i.i.i.i:		; preds = %bb26.i.i.i.i
+	br i1 false, label %bb28.i.i.i.i, label %bb29.i.i.i.i
+
+bb28.i.i.i.i:		; preds = %bb27.i.i.i.i
+	br label %bb23.i.i.i.i.outer
+
+bb29.i.i.i.i:		; preds = %bb27.i.i.i.i
+	br i1 false, label %bb33.i.i.i.i, label %bb44.i.i.i.i
+
+bb33.i.i.i.i:		; preds = %bb29.i.i.i.i
+	br i1 false, label %bb34.i.i.i.i, label %bb38.i.i.i.i
+
+bb34.i.i.i.i:		; preds = %bb33.i.i.i.i
+	br i1 false, label %bb37.i.i.i.i, label %bb35.i.i.i.i
+
+bb35.i.i.i.i:		; preds = %bb34.i.i.i.i
+	br label %bb37.i.i.i.i
+
+bb37.i.i.i.i:		; preds = %bb35.i.i.i.i, %bb34.i.i.i.i
+	br label %bb38.i.i.i.i
+
+bb38.i.i.i.i:		; preds = %bb37.i.i.i.i, %bb33.i.i.i.i
+	br i1 false, label %bb39.i.i.i.i, label %bb43.i.i.i.i
+
+bb39.i.i.i.i:		; preds = %bb38.i.i.i.i
+	br i1 false, label %bb42.i.i.i.i, label %bb40.i.i.i.i
+
+bb40.i.i.i.i:		; preds = %bb39.i.i.i.i
+	br label %bb42.i.i.i.i
+
+bb42.i.i.i.i:		; preds = %bb40.i.i.i.i, %bb39.i.i.i.i
+	br label %bb43.i.i.i.i
+
+bb43.i.i.i.i:		; preds = %bb42.i.i.i.i, %bb38.i.i.i.i
+	br label %bb.i.i.i.i210.backedge
+
+bb.i.i.i.i210.backedge:		; preds = %bb47.i.i.i.i, %bb44.i.i.i.i, %bb43.i.i.i.i
+	br label %bb.i.i.i.i210
+
+bb44.i.i.i.i:		; preds = %bb29.i.i.i.i
+	br i1 false, label %bb.i.i.i.i210.backedge, label %bb46.i.i.i.i
+
+bb46.i.i.i.i:		; preds = %bb44.i.i.i.i
+	br i1 false, label %bb47.i.i.i.i, label %bb53.i.i.i.i.preheader.loopexit
+
+bb53.i.i.i.i.preheader.loopexit:		; preds = %bb46.i.i.i.i
+	br label %bb53.i.i.i.i.preheader
+
+bb53.i.i.i.i.preheader:		; preds = %bb53.i.i.i.i.preheader.loopexit, %bb7.i.i208
+	br label %bb53.i.i.i.i
+
+bb47.i.i.i.i:		; preds = %bb46.i.i.i.i
+	br label %bb.i.i.i.i210.backedge
+
+bb50.i.i.i.i:		; preds = %bb53.i.i.i.i
+	br i1 false, label %bb51.i.i.i.i, label %bb52.i.i.i.i
+
+bb51.i.i.i.i:		; preds = %bb50.i.i.i.i
+	br label %bb52.i.i.i.i
+
+bb52.i.i.i.i:		; preds = %bb51.i.i.i.i, %bb50.i.i.i.i
+	br label %bb53.i.i.i.i
+
+bb53.i.i.i.i:		; preds = %bb52.i.i.i.i, %bb53.i.i.i.i.preheader
+	br i1 false, label %bb50.i.i.i.i, label %bb59.i.i.i.i.preheader
+
+bb59.i.i.i.i.preheader:		; preds = %bb53.i.i.i.i
+	br label %bb59.i.i.i.i
+
+bb55.i.i.i.i:		; preds = %bb59.i.i.i.i
+	br label %bb57.i.i.i.i
+
+bb56.i.i.i.i:		; preds = %bb57.i.i.i.i
+	br label %bb57.i.i.i.i
+
+bb57.i.i.i.i:		; preds = %bb56.i.i.i.i, %bb55.i.i.i.i
+	br i1 false, label %bb56.i.i.i.i, label %bb58.i.i.i.i
+
+bb58.i.i.i.i:		; preds = %bb57.i.i.i.i
+	br label %bb59.i.i.i.i
+
+bb59.i.i.i.i:		; preds = %bb58.i.i.i.i, %bb59.i.i.i.i.preheader
+	br i1 false, label %bb60.i.i.i.i, label %bb55.i.i.i.i
+
+bb60.i.i.i.i:		; preds = %bb59.i.i.i.i
+	br label %bb69.i.i.i.i
+
+bb61.i.i.i.i:		; preds = %bb69.i.i.i.i
+	br i1 false, label %bb68.i.i.i.i, label %bb62.i.i.i.i
+
+bb62.i.i.i.i:		; preds = %bb61.i.i.i.i
+	br i1 false, label %bb63.i.i.i.i, label %bb65.i.i.i.i
+
+bb63.i.i.i.i:		; preds = %bb62.i.i.i.i
+	br i1 false, label %bb.i.i12.i, label %bb65.i.i.i.i
+
+bb65.i.i.i.i:		; preds = %bb63.i.i.i.i, %bb62.i.i.i.i
+	br i1 false, label %bb.i.i12.i, label %bb67.i.i.i.i
+
+bb67.i.i.i.i:		; preds = %bb65.i.i.i.i
+	br label %bb68.i.i.i.i
+
+bb68.i.i.i.i:		; preds = %bb67.i.i.i.i, %bb61.i.i.i.i
+	br label %bb69.i.i.i.i
+
+bb69.i.i.i.i:		; preds = %bb68.i.i.i.i, %bb60.i.i.i.i
+	br i1 false, label %bb61.i.i.i.i, label %bb70.i.i.i.i
+
+bb70.i.i.i.i:		; preds = %bb69.i.i.i.i
+	br label %READ_LITERAL.i.outer.backedge
+
+bb.i.i12.i:		; preds = %bb65.i.i.i.i, %bb63.i.i.i.i
+	br i1 false, label %bb1.i.i.i213, label %bb5.i.i.i218
+
+bb1.i.i.i213:		; preds = %bb.i.i12.i
+	br i1 false, label %bb4.i.i.i217, label %bb2.i.i.i214
+
+bb2.i.i.i214:		; preds = %bb1.i.i.i213
+	br label %bb4.i.i.i217
+
+bb4.i.i.i217:		; preds = %bb2.i.i.i214, %bb1.i.i.i213
+	br label %bb5.i.i.i218
+
+bb5.i.i.i218:		; preds = %bb4.i.i.i217, %bb.i.i12.i
+	br label %READ_LITERAL.i.outer.backedge
+
+READ_LITERAL.i.outer.backedge:		; preds = %bb5.i.i.i218, %bb70.i.i.i.i, %bb6.i.i207
+	br label %READ_LITERAL.i.outer
+
+parse.exit.loopexit:		; preds = %bb51.i, %bb47.i, %bb42.i202
+	br label %parse.exit
+
+parse.exit:		; preds = %parse.exit.loopexit, %bb38.i198, %bb35.i195, %bb33.i193
+	br i1 false, label %bb130, label %bb129
+
+bb129:		; preds = %parse.exit, %bb22.i173, %bb18.i168, %bb16.i166, %bb12.i161, %bb10.i159, %bb9.i158, %bb8.i157, %bb7.i156, %bb5.i154, %bb4.i153
+	br label %bb170
+
+bb130:		; preds = %parse.exit
+	br i1 false, label %bb143, label %bb142.preheader
+
+bb142.preheader:		; preds = %bb130
+	br label %bb142
+
+bb132:		; preds = %bb142
+	br i1 false, label %bb137, label %bb133
+
+bb133:		; preds = %bb132
+	br i1 false, label %bb137, label %bb134
+
+bb134:		; preds = %bb133
+	br i1 false, label %bb137, label %bb135
+
+bb135:		; preds = %bb134
+	br i1 false, label %bb137, label %bb136
+
+bb136:		; preds = %bb135
+	br i1 false, label %bb137, label %bb138
+
+bb137:		; preds = %bb136, %bb135, %bb134, %bb133, %bb132
+	br label %bb141
+
+bb138:		; preds = %bb136
+	br i1 false, label %bb139, label %bb141
+
+bb139:		; preds = %bb138
+	br i1 false, label %bb2.i126, label %picosat_assume.exit
+
+bb2.i126:		; preds = %bb139
+	br i1 false, label %bb5.i130, label %bb3.i127
+
+bb3.i127:		; preds = %bb2.i126
+	br label %bb5.i130
+
+bb5.i130:		; preds = %bb3.i127, %bb2.i126
+	br label %picosat_assume.exit
+
+picosat_assume.exit:		; preds = %bb5.i130, %bb139
+	br i1 false, label %bb141, label %bb140
+
+bb140:		; preds = %picosat_assume.exit
+	br label %bb141
+
+bb141:		; preds = %bb140, %picosat_assume.exit, %bb138, %bb137
+	br label %bb142
+
+bb142:		; preds = %bb141, %bb142.preheader
+	br i1 false, label %bb132, label %bb143.loopexit
+
+bb143.loopexit:		; preds = %bb142
+	br label %bb143
+
+bb143:		; preds = %bb143.loopexit, %bb130
+	br i1 false, label %bb145, label %bb144
+
+bb144:		; preds = %bb143
+	br label %bb11.i
+
+bb5.i114:		; preds = %bb11.i
+	br label %bb11.i
+
+bb11.i:		; preds = %bb5.i114, %bb144
+	br i1 false, label %bb12.i, label %bb5.i114
+
+bb12.i:		; preds = %bb11.i
+	br i1 false, label %bb.i.i.i118, label %bb1.i.i.i119
+
+bb.i.i.i118:		; preds = %bb12.i
+	br label %int2lit.exit.i
+
+bb1.i.i.i119:		; preds = %bb12.i
+	br label %int2lit.exit.i
+
+int2lit.exit.i:		; preds = %bb1.i.i.i119, %bb.i.i.i118
+	br label %bb19.i
+
+bb13.i:		; preds = %bb19.i
+	br label %bb17.i
+
+bb14.i:		; preds = %bb17.i
+	br label %bb17.i
+
+bb17.i:		; preds = %bb14.i, %bb13.i
+	br i1 false, label %bb14.i, label %bb18.i
+
+bb18.i:		; preds = %bb17.i
+	br label %bb19.i
+
+bb19.i:		; preds = %bb18.i, %int2lit.exit.i
+	br i1 false, label %bb20.i, label %bb13.i
+
+bb20.i:		; preds = %bb19.i
+	br label %bb33.i
+
+bb24.i:		; preds = %bb33.i
+	br i1 false, label %bb29.i, label %bb25.i
+
+bb25.i:		; preds = %bb24.i
+	br label %bb27.i
+
+bb26.i:		; preds = %bb27.i
+	br label %bb27.i
+
+bb27.i:		; preds = %bb26.i, %bb25.i
+	br i1 false, label %bb26.i, label %bb28.i
+
+bb28.i:		; preds = %bb27.i
+	br label %bb29.i
+
+bb29.i:		; preds = %bb28.i, %bb24.i
+	br label %bb33.i
+
+bb33.i:		; preds = %bb29.i, %bb20.i
+	br i1 false, label %bb34.i, label %bb24.i
+
+bb34.i:		; preds = %bb33.i
+	br i1 false, label %bb.i.i58.i, label %bb1.i.i59.i
+
+bb.i.i58.i:		; preds = %bb34.i
+	br label %int2lit.exit63.i
+
+bb1.i.i59.i:		; preds = %bb34.i
+	br label %int2lit.exit63.i
+
+int2lit.exit63.i:		; preds = %bb1.i.i59.i, %bb.i.i58.i
+	br label %bb41.i
+
+bb35.i:		; preds = %bb41.i
+	br label %bb39.i
+
+bb36.i:		; preds = %bb39.i
+	br i1 false, label %bb38.i, label %bb37.i
+
+bb37.i:		; preds = %bb36.i
+	br label %bb38.i
+
+bb38.i:		; preds = %bb37.i, %bb36.i
+	br label %bb39.i
+
+bb39.i:		; preds = %bb38.i, %bb35.i
+	br i1 false, label %bb36.i, label %bb40.i
+
+bb40.i:		; preds = %bb39.i
+	br label %bb41.i
+
+bb41.i:		; preds = %bb40.i, %int2lit.exit63.i
+	br i1 false, label %bb42.i, label %bb35.i
+
+bb42.i:		; preds = %bb41.i
+	br label %bb44.i
+
+bb43.i:		; preds = %bb44.i
+	br label %bb44.i
+
+bb44.i:		; preds = %bb43.i, %bb42.i
+	br i1 false, label %bb43.i, label %picosat_print.exit
+
+picosat_print.exit:		; preds = %bb44.i
+	br label %bb167
+
+bb145:		; preds = %bb143
+	br i1 false, label %bb147, label %bb146
+
+bb146:		; preds = %bb145
+	br label %bb147
+
+bb147:		; preds = %bb146, %bb145
+	br i1 false, label %bb149, label %bb148
+
+bb148:		; preds = %bb147
+	br label %bb149
+
+bb149:		; preds = %bb148, %bb147
+	br i1 false, label %bb.i54, label %bb1.i55
+
+bb.i54:		; preds = %bb149
+	unreachable
+
+bb1.i55:		; preds = %bb149
+	br i1 false, label %bb.i.i56, label %bb1.i.i57
+
+bb.i.i56:		; preds = %bb1.i55
+	br label %bb1.i.i57
+
+bb1.i.i57:		; preds = %bb.i.i56, %bb1.i55
+	br i1 false, label %bb3.i.i59, label %bb2.i.i58
+
+bb2.i.i58:		; preds = %bb1.i.i57
+	br label %bb3.i.i59
+
+bb3.i.i59:		; preds = %bb2.i.i58, %bb1.i.i57
+	br i1 false, label %bb5.i.i61, label %sat.exit.i
+
+bb5.i.i61:		; preds = %bb3.i.i59
+	br i1 false, label %bb6.i.i65, label %bb1.i.i.i63
+
+bb1.i.i.i63:		; preds = %bb5.i.i61
+	br i1 false, label %sat.exit.i, label %bb6.i.i65
+
+bb6.i.i65:		; preds = %bb1.i.i.i63, %bb5.i.i61
+	br i1 false, label %bb8.i.i67, label %bb7.i.i66
+
+bb7.i.i66:		; preds = %bb6.i.i65
+	br label %bb8.i.i67
+
+bb8.i.i67:		; preds = %bb7.i.i66, %bb6.i.i65
+	br i1 false, label %bb10.i.i69, label %sat.exit.i
+
+bb10.i.i69:		; preds = %bb8.i.i67
+	br i1 false, label %bb11.i.i70, label %bb1.i61.i.i
+
+bb1.i61.i.i:		; preds = %bb10.i.i69
+	br i1 false, label %sat.exit.i, label %bb11.i.i70
+
+bb11.i.i70:		; preds = %bb1.i61.i.i, %bb10.i.i69
+	br label %bb13.i.i71.outer
+
+bb13.i.i71.outer:		; preds = %bb42.i.i, %bb11.i.i70
+	br label %bb13.i.i71
+
+bb13.i.i71:		; preds = %bb13.i.i71.backedge, %bb13.i.i71.outer
+	br i1 false, label %bb14.i.i72, label %bb15.i.i73
+
+bb14.i.i72:		; preds = %bb13.i.i71
+	br label %bb15.i.i73
+
+bb15.i.i73:		; preds = %bb14.i.i72, %bb13.i.i71
+	br i1 false, label %bb19.i.i, label %bb16.i.i
+
+bb16.i.i:		; preds = %bb15.i.i73
+	br i1 false, label %bb.i.i79.i.i, label %incincs.exit.i.i
+
+bb.i.i79.i.i:		; preds = %bb16.i.i
+	br label %bb4.i.i.i85.i.i
+
+bb.i.i.i80.i.i:		; preds = %bb4.i.i.i85.i.i
+	br i1 false, label %bb3.i.i.i83.i.i, label %bb1.i.i.i81.i.i
+
+bb1.i.i.i81.i.i:		; preds = %bb.i.i.i80.i.i
+	br i1 false, label %bb2.i.i.i82.i.i, label %bb3.i.i.i83.i.i
+
+bb2.i.i.i82.i.i:		; preds = %bb1.i.i.i81.i.i
+	br label %bb3.i.i.i83.i.i
+
+bb3.i.i.i83.i.i:		; preds = %bb2.i.i.i82.i.i, %bb1.i.i.i81.i.i, %bb.i.i.i80.i.i
+	br label %bb4.i.i.i85.i.i
+
+bb4.i.i.i85.i.i:		; preds = %bb3.i.i.i83.i.i, %bb.i.i79.i.i
+	br i1 false, label %crescore.exit.i.i.i.i, label %bb.i.i.i80.i.i
+
+crescore.exit.i.i.i.i:		; preds = %bb4.i.i.i85.i.i
+	br label %incincs.exit.i.i
+
+incincs.exit.i.i:		; preds = %crescore.exit.i.i.i.i, %bb16.i.i
+	br i1 false, label %bb13.i.i71.backedge, label %sat.exit.i.loopexit.loopexit
+
+bb13.i.i71.backedge:		; preds = %bb1.i55.i.i, %bb28.i.i, %incincs.exit.i.i
+	br label %bb13.i.i71
+
+bb19.i.i:		; preds = %bb15.i.i73
+	br i1 false, label %bb20.i.i, label %bb1.i68.i.i
+
+bb1.i68.i.i:		; preds = %bb19.i.i
+	br i1 false, label %sat.exit.i.loopexit.loopexit, label %bb20.i.i
+
+bb20.i.i:		; preds = %bb1.i68.i.i, %bb19.i.i
+	br i1 false, label %bb24.i.i, label %bb21.i.i
+
+bb21.i.i:		; preds = %bb20.i.i
+	br i1 false, label %bb22.i.i, label %bb24.i.i
+
+bb22.i.i:		; preds = %bb21.i.i
+	br i1 false, label %bb23.i.i, label %bb24.i.i
+
+bb23.i.i:		; preds = %bb22.i.i
+	br label %bb24.i.i
+
+bb24.i.i:		; preds = %bb23.i.i, %bb22.i.i, %bb21.i.i, %bb20.i.i
+	br i1 false, label %bb26.i.i, label %sat.exit.i.loopexit.loopexit
+
+bb26.i.i:		; preds = %bb24.i.i
+	br i1 false, label %bb27.i.i, label %bb33.i.i.loopexit
+
+bb27.i.i:		; preds = %bb26.i.i
+	br i1 false, label %bb33.i.i.loopexit, label %bb28.i.i
+
+bb28.i.i:		; preds = %bb27.i.i
+	br i1 false, label %bb1.i55.i.i, label %bb13.i.i71.backedge
+
+bb1.i55.i.i:		; preds = %bb28.i.i
+	br i1 false, label %bb29.i.i, label %bb13.i.i71.backedge
+
+bb29.i.i:		; preds = %bb1.i55.i.i
+	br i1 false, label %bb31.i.i, label %sat.exit.i.loopexit.loopexit2
+
+bb31.i.i:		; preds = %bb29.i.i
+	br i1 false, label %bb33.i.i, label %bb1.i48.i.i
+
+bb1.i48.i.i:		; preds = %bb31.i.i
+	br i1 false, label %sat.exit.i.loopexit.loopexit2, label %bb33.i.i
+
+bb33.i.i.loopexit:		; preds = %bb27.i.i, %bb26.i.i
+	br label %bb33.i.i
+
+bb33.i.i:		; preds = %bb33.i.i.loopexit, %bb1.i48.i.i, %bb31.i.i
+	br i1 false, label %bb34.i.i, label %bb35.i.i
+
+bb34.i.i:		; preds = %bb33.i.i
+	br i1 false, label %bb35.i.i, label %bb2.i44.i.i76
+
+bb2.i44.i.i76:		; preds = %bb34.i.i
+	br label %bb35.i.i
+
+bb35.i.i:		; preds = %bb2.i44.i.i76, %bb34.i.i, %bb33.i.i
+	br i1 false, label %bb1.i37.i.i, label %bb.i35.i.i
+
+bb.i35.i.i:		; preds = %bb35.i.i
+	br label %bb36.i.i
+
+bb1.i37.i.i:		; preds = %bb35.i.i
+	br i1 false, label %bb37.i.i, label %bb36.i.i
+
+bb36.i.i:		; preds = %bb1.i37.i.i, %bb.i35.i.i
+	br label %bb25.i23.i.i
+
+bb.i18.i.i:		; preds = %bb25.i23.i.i
+	br i1 false, label %bb24.i22.i.i, label %bb22.i19.i.i
+
+bb22.i19.i.i:		; preds = %bb.i18.i.i
+	br label %bb24.i22.i.i
+
+bb24.i22.i.i:		; preds = %bb22.i19.i.i, %bb.i18.i.i
+	br label %bb25.i23.i.i
+
+bb25.i23.i.i:		; preds = %bb24.i22.i.i, %bb36.i.i
+	br i1 false, label %bb.i18.i.i, label %bb26.i24.i.i
+
+bb26.i24.i.i:		; preds = %bb25.i23.i.i
+	br i1 false, label %bb27.i25.i.i, label %bb32.i.i.i
+
+bb27.i25.i.i:		; preds = %bb26.i24.i.i
+	br label %bb32.i.i.i
+
+bb32.i.i.i:		; preds = %bb27.i25.i.i, %bb26.i24.i.i
+	br label %bb64.i.i.i
+
+bb33.i.i.i:		; preds = %bb64.i.i.i
+	br i1 false, label %bb60.i.i.i, label %bb34.i.i.i
+
+bb34.i.i.i:		; preds = %bb33.i.i.i
+	br i1 false, label %bb38.i.i.i, label %bb60.i.i.i
+
+bb38.i.i.i:		; preds = %bb34.i.i.i
+	br i1 false, label %bb39.i.i.i, label %bb48.i.i.i
+
+bb39.i.i.i:		; preds = %bb38.i.i.i
+	br i1 false, label %bb48.i.i.i, label %bb40.i.i.i
+
+bb40.i.i.i:		; preds = %bb39.i.i.i
+	br i1 false, label %bb60.i.i.i, label %bb45.i.i.i
+
+bb45.i.i.i:		; preds = %bb40.i.i.i
+	br label %bb60.i.i.i
+
+bb48.i.i.i:		; preds = %bb39.i.i.i, %bb38.i.i.i
+	br i1 false, label %bb53.i.i.i, label %bb60.i.i.i
+
+bb53.i.i.i:		; preds = %bb48.i.i.i
+	br i1 false, label %bb60.i.i.i, label %bb58.i.i.i
+
+bb58.i.i.i:		; preds = %bb53.i.i.i
+	br i1 false, label %bb59.i.i.i, label %bb60.i.i.i
+
+bb59.i.i.i:		; preds = %bb58.i.i.i
+	br label %bb60.i.i.i
+
+bb60.i.i.i:		; preds = %bb59.i.i.i, %bb58.i.i.i, %bb53.i.i.i, %bb48.i.i.i, %bb45.i.i.i, %bb40.i.i.i, %bb34.i.i.i, %bb33.i.i.i
+	%lcollect.i.i.i.1 = phi i32 [ %lcollect.i.i.i.2, %bb34.i.i.i ], [ %lcollect.i.i.i.2, %bb48.i.i.i ], [ %lcollect.i.i.i.2, %bb58.i.i.i ], [ %lcollect.i.i.i.2, %bb59.i.i.i ], [ %lcollect.i.i.i.2, %bb53.i.i.i ], [ %lcollect.i.i.i.2, %bb33.i.i.i ], [ %lcollect.i.i.i.2, %bb40.i.i.i ], [ 0, %bb45.i.i.i ]		; <i32> [#uses=1]
+	br label %bb64.i.i.i
+
+bb64.i.i.i:		; preds = %bb60.i.i.i, %bb32.i.i.i
+	%lcollect.i.i.i.2 = phi i32 [ 0, %bb32.i.i.i ], [ %lcollect.i.i.i.1, %bb60.i.i.i ]		; <i32> [#uses=8]
+	br i1 false, label %bb65.i.i.i, label %bb33.i.i.i
+
+bb65.i.i.i:		; preds = %bb64.i.i.i
+	br i1 false, label %bb103.i.i.i.preheader, label %bb66.i.i.i.preheader
+
+bb66.i.i.i.preheader:		; preds = %bb65.i.i.i
+	br label %bb66.i.i.i
+
+bb66.i.i.i:		; preds = %bb66.i.i.i.backedge, %bb66.i.i.i.preheader
+	br i1 false, label %bb67.i.i.i, label %bb68.i.i.i
+
+bb67.i.i.i:		; preds = %bb66.i.i.i
+	br label %bb68.i.i.i
+
+bb68.i.i.i:		; preds = %bb67.i.i.i, %bb66.i.i.i
+	br i1 false, label %bb69.i.i.i, label %bb70.i.i.i
+
+bb69.i.i.i:		; preds = %bb68.i.i.i
+	br label %bb70.i.i.i
+
+bb70.i.i.i:		; preds = %bb69.i.i.i, %bb68.i.i.i
+	br i1 false, label %bb71.i.i.i, label %bb72.i.i.i
+
+bb71.i.i.i:		; preds = %bb70.i.i.i
+	br label %bb72.i.i.i
+
+bb72.i.i.i:		; preds = %bb71.i.i.i, %bb70.i.i.i
+	br label %bb73.i.i.i.outer
+
+bb73.i.i.i.outer:		; preds = %bb78.i.i.i, %bb72.i.i.i
+	br label %bb73.i.i.i
+
+bb73.i.i.i:		; preds = %bb73.i.i.i, %bb73.i.i.i.outer
+	br i1 false, label %bb73.i.i.i, label %bb76.i.i.i.preheader
+
+bb76.i.i.i.preheader:		; preds = %bb73.i.i.i
+	br label %bb76.i.i.i
+
+bb76.i.i.i:		; preds = %bb76.i.i.i, %bb76.i.i.i.preheader
+	br i1 false, label %bb77.i.i.i, label %bb76.i.i.i
+
+bb77.i.i.i:		; preds = %bb76.i.i.i
+	br i1 false, label %bb78.i.i.i, label %bb79.i.i.i
+
+bb78.i.i.i:		; preds = %bb77.i.i.i
+	br label %bb73.i.i.i.outer
+
+bb79.i.i.i:		; preds = %bb77.i.i.i
+	br i1 false, label %bb83.i.i.i, label %bb94.i.i.i
+
+bb83.i.i.i:		; preds = %bb79.i.i.i
+	br i1 false, label %bb84.i.i.i, label %bb88.i.i.i
+
+bb84.i.i.i:		; preds = %bb83.i.i.i
+	br i1 false, label %bb87.i.i.i, label %bb85.i.i.i
+
+bb85.i.i.i:		; preds = %bb84.i.i.i
+	br label %bb87.i.i.i
+
+bb87.i.i.i:		; preds = %bb85.i.i.i, %bb84.i.i.i
+	br label %bb88.i.i.i
+
+bb88.i.i.i:		; preds = %bb87.i.i.i, %bb83.i.i.i
+	br i1 false, label %bb89.i.i.i, label %bb93.i.i.i
+
+bb89.i.i.i:		; preds = %bb88.i.i.i
+	br i1 false, label %bb92.i.i.i, label %bb90.i.i.i
+
+bb90.i.i.i:		; preds = %bb89.i.i.i
+	br label %bb92.i.i.i
+
+bb92.i.i.i:		; preds = %bb90.i.i.i, %bb89.i.i.i
+	br label %bb93.i.i.i
+
+bb93.i.i.i:		; preds = %bb92.i.i.i, %bb88.i.i.i
+	br label %bb66.i.i.i.backedge
+
+bb66.i.i.i.backedge:		; preds = %bb97.i.i.i, %bb94.i.i.i, %bb93.i.i.i
+	br label %bb66.i.i.i
+
+bb94.i.i.i:		; preds = %bb79.i.i.i
+	br i1 false, label %bb66.i.i.i.backedge, label %bb96.i.i.i
+
+bb96.i.i.i:		; preds = %bb94.i.i.i
+	br i1 false, label %bb97.i.i.i, label %bb103.i.i.i.preheader.loopexit
+
+bb103.i.i.i.preheader.loopexit:		; preds = %bb96.i.i.i
+	br label %bb103.i.i.i.preheader
+
+bb103.i.i.i.preheader:		; preds = %bb103.i.i.i.preheader.loopexit, %bb65.i.i.i
+	br label %bb103.i.i.i
+
+bb97.i.i.i:		; preds = %bb96.i.i.i
+	br label %bb66.i.i.i.backedge
+
+bb100.i.i.i:		; preds = %bb103.i.i.i
+	br i1 false, label %bb101.i.i.i, label %bb102.i.i.i
+
+bb101.i.i.i:		; preds = %bb100.i.i.i
+	br label %bb102.i.i.i
+
+bb102.i.i.i:		; preds = %bb101.i.i.i, %bb100.i.i.i
+	br label %bb103.i.i.i
+
+bb103.i.i.i:		; preds = %bb102.i.i.i, %bb103.i.i.i.preheader
+	br i1 false, label %bb100.i.i.i, label %bb109.i.i.i.preheader
+
+bb109.i.i.i.preheader:		; preds = %bb103.i.i.i
+	br label %bb109.i.i.i
+
+bb105.i.i.i:		; preds = %bb109.i.i.i
+	br label %bb107.i.i.i
+
+bb106.i.i.i:		; preds = %bb107.i.i.i
+	br label %bb107.i.i.i
+
+bb107.i.i.i:		; preds = %bb106.i.i.i, %bb105.i.i.i
+	br i1 false, label %bb106.i.i.i, label %bb108.i.i.i
+
+bb108.i.i.i:		; preds = %bb107.i.i.i
+	br label %bb109.i.i.i
+
+bb109.i.i.i:		; preds = %bb108.i.i.i, %bb109.i.i.i.preheader
+	br i1 false, label %bb110.i.i.i, label %bb105.i.i.i
+
+bb110.i.i.i:		; preds = %bb109.i.i.i
+	%0 = sub i32 0, %lcollect.i.i.i.2		; <i32> [#uses=1]
+	%1 = add i32 %0, 1		; <i32> [#uses=1]
+	br label %bb113.i.i.i
+
+bb111.i.i.i:		; preds = %bb113.i.i.i
+	br i1 false, label %bb114.i.i.i, label %bb113.i.i.i
+
+bb113.i.i.i:		; preds = %bb111.i.i.i, %bb110.i.i.i
+	br i1 false, label %bb111.i.i.i, label %bb114.i.i.i
+
+bb114.i.i.i:		; preds = %bb113.i.i.i, %bb111.i.i.i
+	%2 = lshr i32 %1, 1		; <i32> [#uses=2]
+	br i1 false, label %bb116.i.i.i, label %bb124.i.i.i
+
+bb116.i.i.i:		; preds = %bb114.i.i.i
+	br i1 false, label %bb117.i.i.i.preheader, label %bb122.i.i.i.preheader
+
+bb122.i.i.i.preheader:		; preds = %bb116.i.i.i
+	br label %bb122.i.i.i
+
+bb117.i.i.i.preheader:		; preds = %bb116.i.i.i
+	br label %bb117.i.i.i
+
+bb117.i.i.i:		; preds = %bb118.i.i.i, %bb117.i.i.i.preheader
+	%target.i.i.i.1 = phi i32 [ %3, %bb118.i.i.i ], [ %2, %bb117.i.i.i.preheader ]		; <i32> [#uses=1]
+	%3 = add i32 %target.i.i.i.1, 1		; <i32> [#uses=2]
+	br i1 false, label %bb118.i.i.i, label %bb124.i.i.i.loopexit
+
+bb118.i.i.i:		; preds = %bb117.i.i.i
+	br i1 false, label %bb117.i.i.i, label %bb124.i.i.i.loopexit
+
+bb122.i.i.i:		; preds = %bb123.i.i.i, %bb122.i.i.i.preheader
+	%target.i.i.i.2 = phi i32 [ %4, %bb123.i.i.i ], [ %2, %bb122.i.i.i.preheader ]		; <i32> [#uses=2]
+	br i1 false, label %bb124.i.i.i.loopexit1, label %bb123.i.i.i
+
+bb123.i.i.i:		; preds = %bb122.i.i.i
+	%4 = add i32 %target.i.i.i.2, -1		; <i32> [#uses=1]
+	br i1 false, label %bb122.i.i.i, label %bb124.i.i.i.loopexit1
+
+bb124.i.i.i.loopexit:		; preds = %bb118.i.i.i, %bb117.i.i.i
+	br label %bb124.i.i.i
+
+bb124.i.i.i.loopexit1:		; preds = %bb123.i.i.i, %bb122.i.i.i
+	br label %bb124.i.i.i
+
+bb124.i.i.i:		; preds = %bb124.i.i.i.loopexit1, %bb124.i.i.i.loopexit, %bb114.i.i.i
+	%target.i.i.i.0 = phi i32 [ 0, %bb114.i.i.i ], [ %3, %bb124.i.i.i.loopexit ], [ %target.i.i.i.2, %bb124.i.i.i.loopexit1 ]		; <i32> [#uses=0]
+	br label %bb132.i.i.i.outer
+
+bb125.i.i.i:		; preds = %bb132.i.i.i
+	br i1 false, label %bb132.i.i.i, label %bb130.i.i.i
+
+bb130.i.i.i:		; preds = %bb125.i.i.i
+	br label %bb132.i.i.i.outer
+
+bb132.i.i.i.outer:		; preds = %bb130.i.i.i, %bb124.i.i.i
+	br label %bb132.i.i.i
+
+bb132.i.i.i:		; preds = %bb132.i.i.i.outer, %bb125.i.i.i
+	br i1 false, label %bb125.i.i.i, label %bb133.i.i.i
+
+bb133.i.i.i:		; preds = %bb132.i.i.i
+	br i1 false, label %bb136.i.i.i, label %bb134.i.i.i
+
+bb134.i.i.i:		; preds = %bb133.i.i.i
+	br i1 false, label %bb136.i.i.i, label %bb135.i.i.i
+
+bb135.i.i.i:		; preds = %bb134.i.i.i
+	br label %bb136.i.i.i
+
+bb136.i.i.i:		; preds = %bb135.i.i.i, %bb134.i.i.i, %bb133.i.i.i
+	br i1 false, label %bb137.i.i.i, label %bb37.i.i
+
+bb137.i.i.i:		; preds = %bb136.i.i.i
+	br label %bb37.i.i
+
+bb37.i.i:		; preds = %bb137.i.i.i, %bb136.i.i.i, %bb1.i37.i.i
+	br i1 false, label %bb40.i.i, label %bb38.i.i
+
+bb38.i.i:		; preds = %bb37.i.i
+	br i1 false, label %bb39.i.i, label %bb40.i.i
+
+bb39.i.i:		; preds = %bb38.i.i
+	br i1 false, label %bb17.i.i.i, label %bb3.i12.i.i
+
+bb3.i12.i.i:		; preds = %bb39.i.i
+	br label %bb5.i14.i.i
+
+bb5.i14.i.i:		; preds = %bb8.i.i.i79, %bb3.i12.i.i
+	br i1 false, label %bb6.i15.i.i, label %bb9.i.i.i80
+
+bb6.i15.i.i:		; preds = %bb5.i14.i.i
+	br i1 false, label %bb7.i.i.i78, label %bb9.i.i.i80
+
+bb7.i.i.i78:		; preds = %bb6.i15.i.i
+	br i1 false, label %bb9.i.i.i80, label %bb8.i.i.i79
+
+bb8.i.i.i79:		; preds = %bb7.i.i.i78
+	br i1 false, label %bb9.i.i.i80, label %bb5.i14.i.i
+
+bb9.i.i.i80:		; preds = %bb8.i.i.i79, %bb7.i.i.i78, %bb6.i15.i.i, %bb5.i14.i.i
+	br i1 false, label %bb16.i.i.i, label %bb10.i.i.i81
+
+bb10.i.i.i81:		; preds = %bb9.i.i.i80
+	br i1 false, label %bb11.i.i.i, label %bb15.i.i.i
+
+bb11.i.i.i:		; preds = %bb10.i.i.i81
+	br i1 false, label %bb16.i.i.i, label %bb15.i.i.i
+
+bb15.i.i.i:		; preds = %bb11.i.i.i, %bb10.i.i.i81
+	br label %bb16.i.i.i
+
+bb16.i.i.i:		; preds = %bb15.i.i.i, %bb11.i.i.i, %bb9.i.i.i80
+	br label %bb17.i.i.i
+
+bb17.i.i.i:		; preds = %bb16.i.i.i, %bb39.i.i
+	br i1 false, label %bb18.i.i.i, label %bb25.i.i.i
+
+bb18.i.i.i:		; preds = %bb17.i.i.i
+	br i1 false, label %bb24.i.i.i, label %bb23.i.i.i
+
+bb23.i.i.i:		; preds = %bb18.i.i.i
+	br label %bb24.i.i.i
+
+bb24.i.i.i:		; preds = %bb23.i.i.i, %bb18.i.i.i
+	br label %bb29.i.i.i
+
+bb25.i.i.i:		; preds = %bb17.i.i.i
+	br i1 false, label %bb29.i.i.i, label %bb27.i.i.i
+
+bb27.i.i.i:		; preds = %bb25.i.i.i
+	br i1 false, label %bb29.i.i.i, label %bb28.i.i.i
+
+bb28.i.i.i:		; preds = %bb27.i.i.i
+	br i1 false, label %bb29.i.i.i, label %bb.i4.i.i.i
+
+bb.i4.i.i.i:		; preds = %bb28.i.i.i
+	br i1 false, label %bb4.i.i16.i.i, label %bb29.i.i.i
+
+bb4.i.i16.i.i:		; preds = %bb.i4.i.i.i
+	br label %bb29.i.i.i
+
+bb29.i.i.i:		; preds = %bb4.i.i16.i.i, %bb.i4.i.i.i, %bb28.i.i.i, %bb27.i.i.i, %bb25.i.i.i, %bb24.i.i.i
+	br label %bb40.i.i
+
+bb40.i.i:		; preds = %bb29.i.i.i, %bb38.i.i, %bb37.i.i
+	br i1 false, label %bb9.i.i.i.i.preheader, label %bb2.i.i.i87
+
+bb9.i.i.i.i.preheader:		; preds = %bb40.i.i
+	br label %bb9.i.i.i.i
+
+bb.i.i.i.i84:		; preds = %bb9.i.i.i.i
+	switch i8 0, label %bb8.i.i.i.i [
+		i8 -1, label %bb1.i.i.i.i85
+		i8 1, label %bb9.i.i.i.i
+	]
+
+bb1.i.i.i.i85:		; preds = %bb.i.i.i.i84
+	br i1 false, label %bb5.i.i.i.i, label %bb2.i.i.i87
+
+bb5.i.i.i.i:		; preds = %bb1.i.i.i.i85
+	br label %bb2.i.i.i87
+
+bb8.i.i.i.i:		; preds = %bb.i.i.i.i84
+	br i1 false, label %bb2.i.i.i87, label %bb6.i.i.i95
+
+bb9.i.i.i.i:		; preds = %bb.i.i.i.i84, %bb9.i.i.i.i.preheader
+	br i1 false, label %bb.i.i.i.i84, label %bb10.i.i.i.i
+
+bb10.i.i.i.i:		; preds = %bb9.i.i.i.i
+	br label %bb2.i.i.i87
+
+bb2.i.i.i87:		; preds = %bb10.i.i.i.i, %bb8.i.i.i.i, %bb5.i.i.i.i, %bb1.i.i.i.i85, %bb40.i.i
+	br i1 false, label %bb3.i.i.i88, label %decide.exit.i.i
+
+bb3.i.i.i88:		; preds = %bb2.i.i.i87
+	br i1 false, label %bb4.i.i.i90, label %bb1.i23.i.i.i
+
+bb1.i23.i.i.i:		; preds = %bb3.i.i.i88
+	br i1 false, label %decide.exit.i.i, label %bb4.i.i.i90
+
+bb4.i.i.i90:		; preds = %bb1.i23.i.i.i, %bb3.i.i.i88
+	br i1 false, label %bb1.i9.i.i.i, label %bb5.i.i.i94
+
+bb1.i9.i.i.i:		; preds = %bb4.i.i.i90
+	br i1 false, label %bb.i.i27.i.i.i.i, label %bb1.i.i28.i.i.i.i
+
+bb.i.i27.i.i.i.i:		; preds = %bb1.i9.i.i.i
+	br label %int2lit.exit32.i.i.i.i
+
+bb1.i.i28.i.i.i.i:		; preds = %bb1.i9.i.i.i
+	br label %int2lit.exit32.i.i.i.i
+
+int2lit.exit32.i.i.i.i:		; preds = %bb1.i.i28.i.i.i.i, %bb.i.i27.i.i.i.i
+	br i1 false, label %bb8.i19.i.i.i, label %bb2.i.i.i.i91
+
+bb2.i.i.i.i91:		; preds = %int2lit.exit32.i.i.i.i
+	br label %bb4.i.i.i.i
+
+bb3.i.i.i.i92:		; preds = %gcd.exit.i.i.i.i
+	br label %bb4.i.i.i.i
+
+bb4.i.i.i.i:		; preds = %bb3.i.i.i.i92, %bb2.i.i.i.i91
+	br label %bb3.i.i13.i.i.i
+
+bb2.i.i12.i.i.i:		; preds = %bb3.i.i13.i.i.i
+	br label %bb3.i.i13.i.i.i
+
+bb3.i.i13.i.i.i:		; preds = %bb2.i.i12.i.i.i, %bb4.i.i.i.i
+	br i1 false, label %gcd.exit.i.i.i.i, label %bb2.i.i12.i.i.i
+
+gcd.exit.i.i.i.i:		; preds = %bb3.i.i13.i.i.i
+	br i1 false, label %bb5.i14.i.i.i.preheader, label %bb3.i.i.i.i92
+
+bb5.i14.i.i.i.preheader:		; preds = %gcd.exit.i.i.i.i
+	br label %bb5.i14.i.i.i
+
+bb5.i14.i.i.i:		; preds = %int2lit.exit.i.i.i.i, %bb5.i14.i.i.i.preheader
+	br i1 false, label %bb.i.i.i17.i.i.i, label %bb1.i.i.i18.i.i.i
+
+bb.i.i.i17.i.i.i:		; preds = %bb5.i14.i.i.i
+	br label %int2lit.exit.i.i.i.i
+
+bb1.i.i.i18.i.i.i:		; preds = %bb5.i14.i.i.i
+	br label %int2lit.exit.i.i.i.i
+
+int2lit.exit.i.i.i.i:		; preds = %bb1.i.i.i18.i.i.i, %bb.i.i.i17.i.i.i
+	br i1 false, label %bb8.i19.i.i.i.loopexit, label %bb5.i14.i.i.i
+
+bb8.i19.i.i.i.loopexit:		; preds = %int2lit.exit.i.i.i.i
+	br label %bb8.i19.i.i.i
+
+bb8.i19.i.i.i:		; preds = %bb8.i19.i.i.i.loopexit, %int2lit.exit32.i.i.i.i
+	br i1 false, label %bb5.i.i.i94, label %bb6.i.i.i95
+
+bb5.i.i.i94:		; preds = %bb8.i19.i.i.i, %bb4.i.i.i90
+	br label %bb.i2.i.i.i
+
+bb.i2.i.i.i:		; preds = %hpop.exit.i.i.i.i, %bb5.i.i.i94
+	br i1 false, label %hpop.exit.i.i.i.i, label %bb1.i.i.i.i.i
+
+bb1.i.i.i.i.i:		; preds = %bb.i2.i.i.i
+	br label %bb2.i.i.i.i.i
+
+bb2.i.i.i.i.i:		; preds = %bb11.i.i.i.i.i, %bb1.i.i.i.i.i
+	br i1 false, label %bb3.i.i.i.i.i, label %bb12.i.i.i.i.i
+
+bb3.i.i.i.i.i:		; preds = %bb2.i.i.i.i.i
+	br i1 false, label %bb4.i.i.i.i.i, label %bb1.i.i.i.i.i.i
+
+bb1.i.i.i.i.i.i:		; preds = %bb3.i.i.i.i.i
+	br i1 false, label %bb8.i.i.i.i.i, label %bb3.i.i.i.i.i.i
+
+bb3.i.i.i.i.i.i:		; preds = %bb1.i.i.i.i.i.i
+	br i1 false, label %bb4.i.i.i.i.i, label %bb8.i.i.i.i.i
+
+bb4.i.i.i.i.i:		; preds = %bb3.i.i.i.i.i.i, %bb3.i.i.i.i.i
+	br i1 false, label %bb5.i.i.i.i.i, label %bb11.i.i.i.i.i
+
+bb5.i.i.i.i.i:		; preds = %bb4.i.i.i.i.i
+	br i1 false, label %bb6.i.i.i.i.i, label %bb1.i21.i.i.i.i.i
+
+bb1.i21.i.i.i.i.i:		; preds = %bb5.i.i.i.i.i
+	br i1 false, label %bb11.i.i.i.i.i, label %bb3.i24.i.i.i.i.i
+
+bb3.i24.i.i.i.i.i:		; preds = %bb1.i21.i.i.i.i.i
+	br i1 false, label %bb6.i.i.i.i.i, label %bb11.i.i.i.i.i
+
+bb6.i.i.i.i.i:		; preds = %bb3.i24.i.i.i.i.i, %bb5.i.i.i.i.i
+	br label %bb11.i.i.i.i.i
+
+bb8.i.i.i.i.i:		; preds = %bb3.i.i.i.i.i.i, %bb1.i.i.i.i.i.i
+	br i1 false, label %bb9.i.i.i.i.i, label %bb12.i.i.i.i.i
+
+bb9.i.i.i.i.i:		; preds = %bb8.i.i.i.i.i
+	br i1 false, label %bb11.i.i.i.i.i, label %bb1.i8.i.i.i.i.i
+
+bb1.i8.i.i.i.i.i:		; preds = %bb9.i.i.i.i.i
+	br i1 false, label %bb12.i.i.i.i.i, label %bb3.i11.i.i.i.i.i
+
+bb3.i11.i.i.i.i.i:		; preds = %bb1.i8.i.i.i.i.i
+	br i1 false, label %bb11.i.i.i.i.i, label %bb12.i.i.i.i.i
+
+bb11.i.i.i.i.i:		; preds = %bb3.i11.i.i.i.i.i, %bb9.i.i.i.i.i, %bb6.i.i.i.i.i, %bb3.i24.i.i.i.i.i, %bb1.i21.i.i.i.i.i, %bb4.i.i.i.i.i
+	br label %bb2.i.i.i.i.i
+
+bb12.i.i.i.i.i:		; preds = %bb3.i11.i.i.i.i.i, %bb1.i8.i.i.i.i.i, %bb8.i.i.i.i.i, %bb2.i.i.i.i.i
+	br label %hpop.exit.i.i.i.i
+
+hpop.exit.i.i.i.i:		; preds = %bb12.i.i.i.i.i, %bb.i2.i.i.i
+	br i1 false, label %sdecide.exit.i.i.i, label %bb.i2.i.i.i
+
+sdecide.exit.i.i.i:		; preds = %hpop.exit.i.i.i.i
+	br label %bb6.i.i.i95
+
+bb6.i.i.i95:		; preds = %sdecide.exit.i.i.i, %bb8.i19.i.i.i, %bb8.i.i.i.i
+	br label %decide.exit.i.i
+
+decide.exit.i.i:		; preds = %bb6.i.i.i95, %bb1.i23.i.i.i, %bb2.i.i.i87
+	br i1 false, label %bb42.i.i, label %sat.exit.i.loopexit.loopexit2
+
+bb42.i.i:		; preds = %decide.exit.i.i
+	br label %bb13.i.i71.outer
+
+sat.exit.i.loopexit.loopexit:		; preds = %bb24.i.i, %bb1.i68.i.i, %incincs.exit.i.i
+	br label %sat.exit.i.loopexit
+
+sat.exit.i.loopexit.loopexit2:		; preds = %decide.exit.i.i, %bb1.i48.i.i, %bb29.i.i
+	br label %sat.exit.i.loopexit
+
+sat.exit.i.loopexit:		; preds = %sat.exit.i.loopexit.loopexit2, %sat.exit.i.loopexit.loopexit
+	br label %sat.exit.i
+
+sat.exit.i:		; preds = %sat.exit.i.loopexit, %bb1.i61.i.i, %bb8.i.i67, %bb1.i.i.i63, %bb3.i.i59
+	br i1 false, label %bb7.i, label %bb2.i96
+
+bb2.i96:		; preds = %sat.exit.i
+	switch i32 0, label %bb5.i99 [
+		i32 10, label %bb4.i98
+		i32 20, label %bb6.i100
+	]
+
+bb4.i98:		; preds = %bb2.i96
+	br label %bb6.i100
+
+bb5.i99:		; preds = %bb2.i96
+	br label %bb6.i100
+
+bb6.i100:		; preds = %bb5.i99, %bb4.i98, %bb2.i96
+	br label %bb7.i
+
+bb7.i:		; preds = %bb6.i100, %sat.exit.i
+	br i1 false, label %bb.i1.i, label %picosat_sat.exit
+
+bb.i1.i:		; preds = %bb7.i
+	br label %picosat_sat.exit
+
+picosat_sat.exit:		; preds = %bb.i1.i, %bb7.i
+	switch i32 0, label %bb166 [
+		i32 20, label %bb150
+		i32 10, label %bb163
+	]
+
+bb150:		; preds = %picosat_sat.exit
+	br i1 false, label %bb152, label %bb151
+
+bb151:		; preds = %bb150
+	br label %bb152
+
+bb152:		; preds = %bb151, %bb150
+	br i1 false, label %bb154, label %bb153
+
+bb153:		; preds = %bb152
+	br label %bb154
+
+bb154:		; preds = %bb153, %bb152
+	br i1 false, label %bb157, label %bb156
+
+bb156:		; preds = %bb154
+	br label %bb157
+
+bb157:		; preds = %bb156, %bb154
+	br i1 false, label %bb159, label %bb158
+
+bb158:		; preds = %bb157
+	br label %bb159
+
+bb159:		; preds = %bb158, %bb157
+	br i1 false, label %bb167, label %bb160
+
+bb160:		; preds = %bb159
+	br label %bb167
+
+bb163:		; preds = %picosat_sat.exit
+	br i1 false, label %bb167, label %bb164
+
+bb164:		; preds = %bb163
+	br label %bb4.i
+
+bb.i11:		; preds = %bb4.i
+	br i1 false, label %bb.i.i12, label %bb1.i.i14
+
+bb.i.i12:		; preds = %bb.i11
+	unreachable
+
+bb1.i.i14:		; preds = %bb.i11
+	br i1 false, label %bb3.i.i16, label %bb2.i.i15
+
+bb2.i.i15:		; preds = %bb1.i.i14
+	unreachable
+
+bb3.i.i16:		; preds = %bb1.i.i14
+	br i1 false, label %bb3.i, label %bb7.i.i
+
+bb7.i.i:		; preds = %bb3.i.i16
+	br i1 false, label %bb.i.i.i.i17, label %bb1.i.i.i.i18
+
+bb.i.i.i.i17:		; preds = %bb7.i.i
+	br label %int2lit.exit.i.i
+
+bb1.i.i.i.i18:		; preds = %bb7.i.i
+	br label %int2lit.exit.i.i
+
+int2lit.exit.i.i:		; preds = %bb1.i.i.i.i18, %bb.i.i.i.i17
+	br i1 false, label %bb3.i, label %bb9.i.i
+
+bb9.i.i:		; preds = %int2lit.exit.i.i
+	br label %bb3.i
+
+bb3.i:		; preds = %bb9.i.i, %int2lit.exit.i.i, %bb3.i.i16
+	br label %bb4.i
+
+bb4.i:		; preds = %bb3.i, %bb164
+	br i1 false, label %bb5.i, label %bb.i11
+
+bb5.i:		; preds = %bb4.i
+	br i1 false, label %bb6.i, label %bb167
+
+bb6.i:		; preds = %bb5.i
+	br label %bb167
+
+bb166:		; preds = %picosat_sat.exit
+	br label %bb167
+
+bb167:		; preds = %bb166, %bb6.i, %bb5.i, %bb163, %bb160, %bb159, %picosat_print.exit
+	br i1 false, label %bb168, label %bb170
+
+bb168:		; preds = %bb167
+	br i1 false, label %bb170, label %bb169
+
+bb169:		; preds = %bb168
+	br i1 false, label %bb.i7, label %picosat_time_stamp.exit9
+
+bb.i7:		; preds = %bb169
+	br label %picosat_time_stamp.exit9
+
+picosat_time_stamp.exit9:		; preds = %bb.i7, %bb169
+	br label %bb170
+
+bb170:		; preds = %picosat_time_stamp.exit9, %bb168, %bb167, %bb129
+	br i1 false, label %bb.i.i3, label %picosat_leave.exit
+
+bb.i.i3:		; preds = %bb170
+	br label %picosat_leave.exit
+
+picosat_leave.exit:		; preds = %bb.i.i3, %bb170
+	br i1 false, label %bb1.i.i, label %bb.i.i
+
+bb.i.i:		; preds = %picosat_leave.exit
+	unreachable
+
+bb1.i.i:		; preds = %picosat_leave.exit
+	br label %bb9.i.i.i
+
+bb3.i.i.i:		; preds = %bb9.i.i.i
+	br i1 false, label %bb5.i.i.i, label %bb4.i.i.i
+
+bb4.i.i.i:		; preds = %bb3.i.i.i
+	br label %bb5.i.i.i
+
+bb5.i.i.i:		; preds = %bb4.i.i.i, %bb3.i.i.i
+	br label %bb9.i.i.i
+
+bb9.i.i.i:		; preds = %bb5.i.i.i, %bb1.i.i
+	br i1 false, label %bb10.i.i.i, label %bb3.i.i.i
+
+bb10.i.i.i:		; preds = %bb9.i.i.i
+	br i1 false, label %delete.exit.i.i.i, label %bb1.i.i.i.i
+
+bb1.i.i.i.i:		; preds = %bb10.i.i.i
+	br label %delete.exit.i.i.i
+
+delete.exit.i.i.i:		; preds = %bb1.i.i.i.i, %bb10.i.i.i
+	br i1 false, label %delete_clauses.exit.i.i, label %bb1.i7.i.i.i
+
+bb1.i7.i.i.i:		; preds = %delete.exit.i.i.i
+	br label %delete_clauses.exit.i.i
+
+delete_clauses.exit.i.i:		; preds = %bb1.i7.i.i.i, %delete.exit.i.i.i
+	br label %bb3.i.i
+
+bb2.i.i:		; preds = %bb3.i.i
+	br i1 false, label %lrelease.exit.i.i, label %bb1.i.i23.i.i
+
+bb1.i.i23.i.i:		; preds = %bb2.i.i
+	br label %lrelease.exit.i.i
+
+lrelease.exit.i.i:		; preds = %bb1.i.i23.i.i, %bb2.i.i
+	br label %bb3.i.i
+
+bb3.i.i:		; preds = %lrelease.exit.i.i, %delete_clauses.exit.i.i
+	br i1 false, label %bb4.i.i, label %bb2.i.i
+
+bb4.i.i:		; preds = %bb3.i.i
+	br i1 false, label %delete.exit214.i.i, label %bb1.i208.i.i
+
+bb1.i208.i.i:		; preds = %bb4.i.i
+	br label %delete.exit214.i.i
+
+delete.exit214.i.i:		; preds = %bb1.i208.i.i, %bb4.i.i
+	br i1 false, label %delete.exit203.i.i, label %bb1.i197.i.i
+
+bb1.i197.i.i:		; preds = %delete.exit214.i.i
+	br label %delete.exit203.i.i
+
+delete.exit203.i.i:		; preds = %bb1.i197.i.i, %delete.exit214.i.i
+	br i1 false, label %delete.exit192.i.i, label %bb1.i186.i.i
+
+bb1.i186.i.i:		; preds = %delete.exit203.i.i
+	br label %delete.exit192.i.i
+
+delete.exit192.i.i:		; preds = %bb1.i186.i.i, %delete.exit203.i.i
+	br i1 false, label %delete.exit181.i.i, label %bb1.i175.i.i
+
+bb1.i175.i.i:		; preds = %delete.exit192.i.i
+	br label %delete.exit181.i.i
+
+delete.exit181.i.i:		; preds = %bb1.i175.i.i, %delete.exit192.i.i
+	br i1 false, label %delete.exit170.i.i, label %bb1.i164.i.i
+
+bb1.i164.i.i:		; preds = %delete.exit181.i.i
+	br label %delete.exit170.i.i
+
+delete.exit170.i.i:		; preds = %bb1.i164.i.i, %delete.exit181.i.i
+	br i1 false, label %delete.exit159.i.i, label %bb1.i153.i.i
+
+bb1.i153.i.i:		; preds = %delete.exit170.i.i
+	br label %delete.exit159.i.i
+
+delete.exit159.i.i:		; preds = %bb1.i153.i.i, %delete.exit170.i.i
+	br i1 false, label %delete.exit148.i.i, label %bb1.i142.i.i
+
+bb1.i142.i.i:		; preds = %delete.exit159.i.i
+	br label %delete.exit148.i.i
+
+delete.exit148.i.i:		; preds = %bb1.i142.i.i, %delete.exit159.i.i
+	br i1 false, label %delete.exit137.i.i, label %bb1.i131.i.i
+
+bb1.i131.i.i:		; preds = %delete.exit148.i.i
+	br label %delete.exit137.i.i
+
+delete.exit137.i.i:		; preds = %bb1.i131.i.i, %delete.exit148.i.i
+	br i1 false, label %delete.exit126.i.i, label %bb1.i120.i.i
+
+bb1.i120.i.i:		; preds = %delete.exit137.i.i
+	br label %delete.exit126.i.i
+
+delete.exit126.i.i:		; preds = %bb1.i120.i.i, %delete.exit137.i.i
+	br i1 false, label %delete.exit115.i.i, label %bb1.i109.i.i
+
+bb1.i109.i.i:		; preds = %delete.exit126.i.i
+	br label %delete.exit115.i.i
+
+delete.exit115.i.i:		; preds = %bb1.i109.i.i, %delete.exit126.i.i
+	br i1 false, label %delete.exit104.i.i, label %bb1.i98.i.i
+
+bb1.i98.i.i:		; preds = %delete.exit115.i.i
+	br label %delete.exit104.i.i
+
+delete.exit104.i.i:		; preds = %bb1.i98.i.i, %delete.exit115.i.i
+	br i1 false, label %delete.exit93.i.i, label %bb1.i87.i.i
+
+bb1.i87.i.i:		; preds = %delete.exit104.i.i
+	br label %delete.exit93.i.i
+
+delete.exit93.i.i:		; preds = %bb1.i87.i.i, %delete.exit104.i.i
+	br i1 false, label %delete.exit82.i.i, label %bb1.i76.i.i
+
+bb1.i76.i.i:		; preds = %delete.exit93.i.i
+	br label %delete.exit82.i.i
+
+delete.exit82.i.i:		; preds = %bb1.i76.i.i, %delete.exit93.i.i
+	br i1 false, label %delete.exit71.i.i, label %bb1.i65.i.i
+
+bb1.i65.i.i:		; preds = %delete.exit82.i.i
+	br label %delete.exit71.i.i
+
+delete.exit71.i.i:		; preds = %bb1.i65.i.i, %delete.exit82.i.i
+	br i1 false, label %delete.exit60.i.i, label %bb1.i54.i.i
+
+bb1.i54.i.i:		; preds = %delete.exit71.i.i
+	br label %delete.exit60.i.i
+
+delete.exit60.i.i:		; preds = %bb1.i54.i.i, %delete.exit71.i.i
+	br i1 false, label %delete.exit38.i.i, label %bb1.i32.i.i
+
+bb1.i32.i.i:		; preds = %delete.exit60.i.i
+	br label %delete.exit38.i.i
+
+delete.exit38.i.i:		; preds = %bb1.i32.i.i, %delete.exit60.i.i
+	br i1 false, label %delete.exit18.i.i, label %bb1.i12.i.i
+
+bb1.i12.i.i:		; preds = %delete.exit38.i.i
+	br label %delete.exit18.i.i
+
+delete.exit18.i.i:		; preds = %bb1.i12.i.i, %delete.exit38.i.i
+	br i1 false, label %picosat_reset.exit, label %bb1.i2.i.i
+
+bb1.i2.i.i:		; preds = %delete.exit18.i.i
+	br label %picosat_reset.exit
+
+picosat_reset.exit:		; preds = %bb1.i2.i.i, %delete.exit18.i.i
+	br label %bb171
+
+bb171:		; preds = %picosat_reset.exit, %bb110
+	br i1 false, label %bb173, label %bb172
+
+bb172:		; preds = %bb171
+	br label %bb173
+
+bb173:		; preds = %bb172, %bb171
+	br i1 false, label %bb175, label %bb174
+
+bb174:		; preds = %bb173
+	br label %bb175
+
+bb175:		; preds = %bb174, %bb173
+	br i1 false, label %bb177, label %bb176
+
+bb176:		; preds = %bb175
+	br label %bb177
+
+bb177:		; preds = %bb176, %bb175
+	br i1 false, label %bb179, label %bb178
+
+bb178:		; preds = %bb177
+	ret i32 0
+
+bb179:		; preds = %bb177
+	ret i32 0
+}
+
+define i32 @main(i32 %argc, i8** %argv) nounwind {
+entry:
+	br label %bb2
+
+bb:		; preds = %bb2
+	br i1 false, label %bb3, label %bb2
+
+bb2:		; preds = %bb, %entry
+	br i1 false, label %bb5.loopexit, label %bb
+
+bb3:		; preds = %bb
+	br i1 false, label %bb5, label %bb4
+
+bb4:		; preds = %bb3
+	br label %bb5
+
+bb5.loopexit:		; preds = %bb2
+	br label %bb5
+
+bb5:		; preds = %bb5.loopexit, %bb4, %bb3
+	%0 = call fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind		; <i32> [#uses=2]
+	br i1 false, label %bb7, label %bb6
+
+bb6:		; preds = %bb5
+	ret i32 %0
+
+bb7:		; preds = %bb5
+	ret i32 %0
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/pr32917.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/pr32917.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/pr32917.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/pr32917.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; PR 32917
+
+ at b = common local_unnamed_addr global i32 0, align 4
+ at a = common local_unnamed_addr global i32 0, align 4
+
+define i32 @fn2() local_unnamed_addr {
+  %1 = load i32, i32* @b, align 4
+  %2 = sext i32 %1 to i64
+  %3 = inttoptr i64 %2 to i32*
+  call fastcc void @fn1(i32* %3)
+  ret i32 undef
+}
+
+define internal fastcc void @fn1(i32* nocapture readonly) unnamed_addr {
+  %2 = getelementptr inbounds i32, i32* %0, i64 -1
+  %3 = load i32, i32* %2, align 4
+  store i32 %3, i32* @a, align 4
+  ret void
+}
+
+; CHECK: getelementptr {{.*}} -1
+; CHECK-NOT: getelementptr {{.*}} 4294967295

Added: llvm/trunk/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,38 @@
+; RUN: opt -argpromotion -verify -dse -S %s -o - | FileCheck %s
+
+; Fix for PR33641. ArgumentPromotion removed the argument to bar but left the call to
+; dbg.value which still used the removed argument.
+
+%p_t = type i16*
+%fun_t = type void (%p_t)*
+
+define void @foo() {
+  %tmp = alloca %fun_t
+  store %fun_t @bar, %fun_t* %tmp
+  ret void
+}
+
+define internal void @bar(%p_t %p)  {
+  call void @llvm.dbg.value(metadata %p_t %p, metadata !4, metadata !5), !dbg !6
+  ret void
+}
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1)
+!1 = !DIFile(filename: "test.c", directory: "")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "bar", unit: !0)
+!4 = !DILocalVariable(name: "p", scope: !3)
+!5 = !DIExpression()
+!6 = !DILocation(line: 1, column: 1, scope: !3)
+
+; The %p argument should be removed, and the use of it in dbg.value should be
+; changed to undef.
+; CHECK:      define internal void @bar() {
+; CHECK-NEXT:   call void @llvm.dbg.value(metadata i16* undef
+; CHECK-NEXT:   ret void
+; CHECK-NEXT: }

Added: llvm/trunk/test/Transforms/ArgumentPromotion/profile.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/profile.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/profile.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/profile.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt -argpromotion -mem2reg -S < %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"
+
+; Checks if !prof metadata is corret in deadargelim.
+
+define void @caller() #0 {
+  %x = alloca i32
+  store i32 42, i32* %x
+  call void @promote_i32_ptr(i32* %x), !prof !0
+; CHECK: call void @promote_i32_ptr(i32 42), !prof ![[PROF:[0-9]]]
+  ret void
+}
+
+define internal void @promote_i32_ptr(i32* %xp) {
+  %x = load i32, i32* %xp
+  call void @use_i32(i32 %x)
+  ret void
+}
+
+declare void @use_i32(i32)
+
+; CHECK: ![[PROF]] = !{!"branch_weights", i32 30}
+!0 = !{!"branch_weights", i32 30}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/reserve-tbaa.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/reserve-tbaa.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/reserve-tbaa.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/reserve-tbaa.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,53 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; PR17906
+; When we promote two arguments in a single function with different types,
+; before the fix, we used the same tag for the newly-created two loads.
+; This testing case makes sure that we correctly transfer the tbaa tags from the
+; original loads to the newly-created loads when promoting pointer arguments.
+
+ at a = global i32* null, align 8
+ at e = global i32** @a, align 8
+ at g = global i32 0, align 4
+ at c = global i64 0, align 8
+ at d = global i8 0, align 1
+
+define internal fastcc void @fn(i32* nocapture readonly %p1, i64* nocapture readonly %p2) {
+entry:
+  %0 = load i64, i64* %p2, align 8, !tbaa !1
+  %conv = trunc i64 %0 to i32
+  %1 = load i32, i32* %p1, align 4, !tbaa !5
+  %conv1 = trunc i32 %1 to i8
+  store i8 %conv1, i8* @d, align 1, !tbaa !7
+  ret void
+}
+
+define i32 @main() {
+entry:
+; CHECK-LABEL: main
+; CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa ![[I32:[0-9]+]]
+; CHECK: %g.val = load i32, i32* @g, align 4, !tbaa ![[I32]]
+; CHECK: %c.val = load i64, i64* @c, align 8, !tbaa ![[LONG:[0-9]+]]
+  %0 = load i32**, i32*** @e, align 8, !tbaa !8
+  store i32* @g, i32** %0, align 8, !tbaa !8
+  %1 = load i32*, i32** @a, align 8, !tbaa !8
+  store i32 1, i32* %1, align 4, !tbaa !5
+  call fastcc void @fn(i32* @g, i64* @c)
+
+  ret i32 0
+}
+
+!1 = !{!2, !2, i64 0}
+!2 = !{!"long", !3, i64 0}
+!3 = !{!"omnipotent char", !4, i64 0}
+!4 = !{!"Simple C/C++ TBAA"}
+!5 = !{!6, !6, i64 0}
+!6 = !{!"int", !3, i64 0}
+!7 = !{!3, !3, i64 0}
+!8 = !{!9, !9, i64 0}
+!9 = !{!"any pointer", !3, i64 0}
+; CHECK: ![[I32]] = !{![[I32_TYPE:[0-9]+]], ![[I32_TYPE]], i64 0}
+; CHECK: ![[I32_TYPE]] = !{!"int", !{{.*}}, i64 0}
+; CHECK: ![[LONG]] = !{![[LONG_TYPE:[0-9]+]], ![[LONG_TYPE]], i64 0}
+; CHECK: ![[LONG_TYPE]] = !{!"long", !{{.*}}, i64 0}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/sret.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/sret.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/sret.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/sret.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,29 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc"
+
+; CHECK: define internal void @add(i32 %[[THIS1:.*]], i32 %[[THIS2:.*]], i32* noalias %[[SR:.*]])
+define internal void @add({i32, i32}* %this, i32* sret %r) {
+  %ap = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 0
+  %bp = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 1
+  %a = load i32, i32* %ap
+  %b = load i32, i32* %bp
+  ; CHECK: %[[AB:.*]] = add i32 %[[THIS1]], %[[THIS2]]
+  %ab = add i32 %a, %b
+  ; CHECK: store i32 %[[AB]], i32* %[[SR]]
+  store i32 %ab, i32* %r
+  ret void
+}
+
+; CHECK: define void @f()
+define void @f() {
+  ; CHECK: %[[R:.*]] = alloca i32
+  %r = alloca i32
+  %pair = alloca {i32, i32}
+
+  ; CHECK: call void @add(i32 %{{.*}}, i32 %{{.*}}, i32* noalias %[[R]])
+  call void @add({i32, i32}* %pair, i32* sret %r)
+  ret void
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/tail.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/tail.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/tail.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/tail.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt %s -argpromotion -S -o - | FileCheck %s
+; RUN: opt %s -passes=argpromotion -S -o - | FileCheck %s
+; PR14710
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+%pair = type { i32, i32 }
+
+declare i8* @foo(%pair*)
+
+define internal void @bar(%pair* byval %Data) {
+; CHECK: define internal void @bar(i32 %Data.0, i32 %Data.1)
+; CHECK: %Data = alloca %pair
+; CHECK-NOT: tail
+; CHECK: call i8* @foo(%pair* %Data)
+  tail call i8* @foo(%pair* %Data)
+  ret void
+}
+
+define void @zed(%pair* byval %Data) {
+  call void @bar(%pair* byval %Data)
+  ret void
+}

Added: llvm/trunk/test/Transforms/ArgumentPromotion/variadic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ArgumentPromotion/variadic.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ArgumentPromotion/variadic.ll (added)
+++ llvm/trunk/test/Transforms/ArgumentPromotion/variadic.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,29 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
+
+; Unused arguments from variadic functions cannot be eliminated as that changes
+; their classiciation according to the SysV amd64 ABI. Clang and other frontends
+; bake in the classification when they use things like byval, as in this test.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+%struct.tt0 = type { i64, i64 }
+%struct.__va_list_tag = type { i32, i32, i8*, i8* }
+
+ at t45 = internal global %struct.tt0 { i64 1335139741, i64 438042995 }, align 8
+
+; Function Attrs: nounwind uwtable
+define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 {
+entry:
+  tail call void (i8*, i8*, i8*, i8*, i8*, ...) @callee_t0f(i8* undef, i8* undef, i8* undef, i8* undef, i8* undef, %struct.tt0* byval align 8 @t45)
+  ret i32 0
+}
+
+; Function Attrs: nounwind uwtable
+define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...) {
+entry:
+  ret void
+}
+
+; CHECK-LABEL: define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...)

Added: llvm/trunk/test/Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,47 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=aarch64-linux-gnu -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=aarch64-- -atomic-expand %s | FileCheck %s
+
+define void @atomic_swap_f16(half* %ptr, half %val) nounwind {
+; CHECK-LABEL: @atomic_swap_f16(
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.aarch64.ldaxr.p0f16(half* [[PTR:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i16
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i16 [[TMP2]] to half
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast half [[VAL:%.*]] to i16
+; CHECK-NEXT:    [[TMP5:%.*]] = zext i16 [[TMP4]] to i64
+; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @llvm.aarch64.stxr.p0f16(i64 [[TMP5]], half* [[PTR]])
+; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
+; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret void
+;
+  %t1 = atomicrmw xchg half* %ptr, half %val acquire
+  ret void
+}
+
+define void @atomic_swap_f32(float* %ptr, float %val) nounwind {
+; CHECK-LABEL: @atomic_swap_f32(
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.aarch64.ldaxr.p0f32(float* [[PTR:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = trunc i64 [[TMP1]] to i32
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i32 [[TMP2]] to float
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[VAL:%.*]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP4]] to i64
+; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @llvm.aarch64.stxr.p0f32(i64 [[TMP5]], float* [[PTR]])
+; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
+; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret void
+;
+  %t1 = atomicrmw xchg float* %ptr, float %val acquire
+  ret void
+}
+
+define void @atomic_swap_f64(double* %ptr, double %val) nounwind {
+; CHECK-LABEL: @atomic_swap_f64(
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.aarch64.ldaxr.p0f64(double* [[PTR:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i64 [[TMP1]] to double
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double [[VAL:%.*]] to i64
+; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @llvm.aarch64.stxr.p0f64(i64 [[TMP3]], double* [[PTR]])
+; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP4]], 0
+; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret void
+;
+  %t1 = atomicrmw xchg double* %ptr, double %val acquire
+  ret void
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/AArch64/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AArch64/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AArch64/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AArch64/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,3 @@
+if not 'AArch64' in config.root.targets:
+    config.unsupported = True
+

Added: llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fadd.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fadd.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fadd.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fadd.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,264 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -atomic-expand %s | FileCheck -check-prefix=CI %s
+; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s | FileCheck -check-prefix=GFX9 %s
+
+define float @test_atomicrmw_fadd_f32_flat(float* %ptr, float %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f32_flat(
+; CI-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CI-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret float [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f32_flat(
+; GFX9-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; GFX9-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GFX9:       atomicrmw.start:
+; GFX9-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GFX9-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; GFX9-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; GFX9-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; GFX9-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; GFX9-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; GFX9-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; GFX9-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; GFX9-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; GFX9-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GFX9:       atomicrmw.end:
+; GFX9-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fadd_f32_global(float addrspace(1)* %ptr, float %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f32_global(
+; CI-NEXT:    [[TMP1:%.*]] = load float, float addrspace(1)* [[PTR:%.*]], align 4
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(1)* [[PTR]] to i32 addrspace(1)*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CI-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(1)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret float [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f32_global(
+; GFX9-NEXT:    [[TMP1:%.*]] = load float, float addrspace(1)* [[PTR:%.*]], align 4
+; GFX9-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GFX9:       atomicrmw.start:
+; GFX9-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GFX9-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; GFX9-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(1)* [[PTR]] to i32 addrspace(1)*
+; GFX9-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; GFX9-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; GFX9-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(1)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; GFX9-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; GFX9-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; GFX9-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; GFX9-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GFX9:       atomicrmw.end:
+; GFX9-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float addrspace(1)* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fadd_f32_local(float addrspace(3)* %ptr, float %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f32_local(
+; CI-NEXT:    [[TMP1:%.*]] = load float, float addrspace(3)* [[PTR:%.*]], align 4
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(3)* [[PTR]] to i32 addrspace(3)*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CI-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(3)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret float [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f32_local(
+; GFX9-NEXT:    [[RES:%.*]] = atomicrmw fadd float addrspace(3)* [[PTR:%.*]], float [[VALUE:%.*]] seq_cst
+; GFX9-NEXT:    ret float [[RES]]
+;
+  %res = atomicrmw fadd float addrspace(3)* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define half @test_atomicrmw_fadd_f16_flat(half* %ptr, half %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f16_flat(
+; CI-NEXT:    [[RES:%.*]] = atomicrmw fadd half* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; CI-NEXT:    ret half [[RES]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f16_flat(
+; GFX9-NEXT:    [[RES:%.*]] = atomicrmw fadd half* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; GFX9-NEXT:    ret half [[RES]]
+;
+  %res = atomicrmw fadd half* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define half @test_atomicrmw_fadd_f16_global(half addrspace(1)* %ptr, half %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f16_global(
+; CI-NEXT:    [[RES:%.*]] = atomicrmw fadd half addrspace(1)* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; CI-NEXT:    ret half [[RES]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f16_global(
+; GFX9-NEXT:    [[RES:%.*]] = atomicrmw fadd half addrspace(1)* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; GFX9-NEXT:    ret half [[RES]]
+;
+  %res = atomicrmw fadd half addrspace(1)* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define half @test_atomicrmw_fadd_f16_local(half addrspace(3)* %ptr, half %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f16_local(
+; CI-NEXT:    [[RES:%.*]] = atomicrmw fadd half addrspace(3)* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; CI-NEXT:    ret half [[RES]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f16_local(
+; GFX9-NEXT:    [[RES:%.*]] = atomicrmw fadd half addrspace(3)* [[PTR:%.*]], half [[VALUE:%.*]] seq_cst
+; GFX9-NEXT:    ret half [[RES]]
+;
+  %res = atomicrmw fadd half addrspace(3)* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define double @test_atomicrmw_fadd_f64_flat(double* %ptr, double %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f64_flat(
+; CI-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; CI-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret double [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f64_flat(
+; GFX9-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; GFX9-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GFX9:       atomicrmw.start:
+; GFX9-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GFX9-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; GFX9-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; GFX9-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GFX9-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GFX9-NEXT:    [[TMP5:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GFX9-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GFX9-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GFX9-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GFX9-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GFX9:       atomicrmw.end:
+; GFX9-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fadd double* %ptr, double %value seq_cst
+  ret double %res
+}
+
+define double @test_atomicrmw_fadd_f64_global(double addrspace(1)* %ptr, double %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f64_global(
+; CI-NEXT:    [[TMP1:%.*]] = load double, double addrspace(1)* [[PTR:%.*]], align 8
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(1)* [[PTR]] to i64 addrspace(1)*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; CI-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(1)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret double [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f64_global(
+; GFX9-NEXT:    [[TMP1:%.*]] = load double, double addrspace(1)* [[PTR:%.*]], align 8
+; GFX9-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GFX9:       atomicrmw.start:
+; GFX9-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GFX9-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; GFX9-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(1)* [[PTR]] to i64 addrspace(1)*
+; GFX9-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GFX9-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GFX9-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(1)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GFX9-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GFX9-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GFX9-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GFX9-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GFX9:       atomicrmw.end:
+; GFX9-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fadd double addrspace(1)* %ptr, double %value seq_cst
+  ret double %res
+}
+
+define double @test_atomicrmw_fadd_f64_local(double addrspace(3)* %ptr, double %value) {
+; CI-LABEL: @test_atomicrmw_fadd_f64_local(
+; CI-NEXT:    [[TMP1:%.*]] = load double, double addrspace(3)* [[PTR:%.*]], align 8
+; CI-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CI:       atomicrmw.start:
+; CI-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CI-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; CI-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(3)* [[PTR]] to i64 addrspace(3)*
+; CI-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; CI-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; CI-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(3)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; CI-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; CI-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; CI-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; CI-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CI:       atomicrmw.end:
+; CI-NEXT:    ret double [[TMP6]]
+;
+; GFX9-LABEL: @test_atomicrmw_fadd_f64_local(
+; GFX9-NEXT:    [[TMP1:%.*]] = load double, double addrspace(3)* [[PTR:%.*]], align 8
+; GFX9-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GFX9:       atomicrmw.start:
+; GFX9-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GFX9-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; GFX9-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(3)* [[PTR]] to i64 addrspace(3)*
+; GFX9-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GFX9-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GFX9-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(3)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GFX9-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GFX9-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GFX9-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GFX9-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GFX9:       atomicrmw.end:
+; GFX9-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fadd double addrspace(3)* %ptr, double %value seq_cst
+  ret double %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fsub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fsub.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fsub.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-fsub.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,201 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -atomic-expand %s | FileCheck -check-prefix=GCN %s
+; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s | FileCheck -check-prefix=GCN %s
+
+define float @test_atomicrmw_fadd_f32_flat(float* %ptr, float %value) {
+; GCN-LABEL: @test_atomicrmw_fadd_f32_flat(
+; GCN-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32_global(float addrspace(1)* %ptr, float %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f32_global(
+; GCN-NEXT:    [[TMP1:%.*]] = load float, float addrspace(1)* [[PTR:%.*]], align 4
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(1)* [[PTR]] to i32 addrspace(1)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(1)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float addrspace(1)* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32_local(float addrspace(3)* %ptr, float %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f32_local(
+; GCN-NEXT:    [[TMP1:%.*]] = load float, float addrspace(3)* [[PTR:%.*]], align 4
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(3)* [[PTR]] to i32 addrspace(3)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(3)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float addrspace(3)* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define half @test_atomicrmw_fsub_f16_flat(half* %ptr, half %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f16_flat(
+; GCN-NEXT:    [[TMP1:%.*]] = load half, half* [[PTR:%.*]], align 2
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi half [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub half [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast half* [[PTR]] to i16*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast half [[NEW]] to i16
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast half [[LOADED]] to i16
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i16* [[TMP2]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i16 [[NEWLOADED]] to half
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret half [[TMP6]]
+;
+  %res = atomicrmw fsub half* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define half @test_atomicrmw_fsub_f16_global(half addrspace(1)* %ptr, half %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f16_global(
+; GCN-NEXT:    [[TMP1:%.*]] = load half, half addrspace(1)* [[PTR:%.*]], align 2
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi half [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub half [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast half addrspace(1)* [[PTR]] to i16 addrspace(1)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast half [[NEW]] to i16
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast half [[LOADED]] to i16
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i16 addrspace(1)* [[TMP2]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i16 [[NEWLOADED]] to half
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret half [[TMP6]]
+;
+  %res = atomicrmw fsub half addrspace(1)* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define half @test_atomicrmw_fsub_f16_local(half addrspace(3)* %ptr, half %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f16_local(
+; GCN-NEXT:    [[TMP1:%.*]] = load half, half addrspace(3)* [[PTR:%.*]], align 2
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi half [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub half [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast half addrspace(3)* [[PTR]] to i16 addrspace(3)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast half [[NEW]] to i16
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast half [[LOADED]] to i16
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i16 addrspace(3)* [[TMP2]], i16 [[TMP4]], i16 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i16, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i16 [[NEWLOADED]] to half
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret half [[TMP6]]
+;
+  %res = atomicrmw fsub half addrspace(3)* %ptr, half %value seq_cst
+  ret half %res
+}
+
+define double @test_atomicrmw_fsub_f64_flat(double* %ptr, double %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f64_flat(
+; GCN-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fsub double* %ptr, double %value seq_cst
+  ret double %res
+}
+
+define double @test_atomicrmw_fsub_f64_global(double addrspace(1)* %ptr, double %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f64_global(
+; GCN-NEXT:    [[TMP1:%.*]] = load double, double addrspace(1)* [[PTR:%.*]], align 8
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(1)* [[PTR]] to i64 addrspace(1)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(1)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fsub double addrspace(1)* %ptr, double %value seq_cst
+  ret double %res
+}
+
+define double @test_atomicrmw_fsub_f64_local(double addrspace(3)* %ptr, double %value) {
+; GCN-LABEL: @test_atomicrmw_fsub_f64_local(
+; GCN-NEXT:    [[TMP1:%.*]] = load double, double addrspace(3)* [[PTR:%.*]], align 8
+; GCN-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; GCN:       atomicrmw.start:
+; GCN-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; GCN-NEXT:    [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]]
+; GCN-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(3)* [[PTR]] to i64 addrspace(3)*
+; GCN-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; GCN-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; GCN-NEXT:    [[TMP5:%.*]] = cmpxchg i64 addrspace(3)* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; GCN-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; GCN-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; GCN-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; GCN-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; GCN:       atomicrmw.end:
+; GCN-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fsub double addrspace(3)* %ptr, double %value seq_cst
+  ret double %res
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-nand.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-nand.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-nand.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/expand-atomic-rmw-nand.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,60 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -atomic-expand %s | FileCheck %s
+; RUN: opt -mtriple=r600-mesa-mesa3d -S -atomic-expand %s | FileCheck %s
+
+define i32 @test_atomicrmw_nand_i32_flat(i32* %ptr, i32 %value) {
+; CHECK-LABEL: @test_atomicrmw_nand_i32_flat(
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[NEW:%.*]] = xor i32 [[TMP2]], -1
+; CHECK-NEXT:    [[TMP3:%.*]] = cmpxchg i32* [[PTR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1
+; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret i32 [[NEWLOADED]]
+;
+  %res = atomicrmw nand i32* %ptr, i32 %value seq_cst
+  ret i32 %res
+}
+
+define i32 @test_atomicrmw_nand_i32_global(i32 addrspace(1)* %ptr, i32 %value) {
+; CHECK-LABEL: @test_atomicrmw_nand_i32_global(
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(1)* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[NEW:%.*]] = xor i32 [[TMP2]], -1
+; CHECK-NEXT:    [[TMP3:%.*]] = cmpxchg i32 addrspace(1)* [[PTR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1
+; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret i32 [[NEWLOADED]]
+;
+  %res = atomicrmw nand i32 addrspace(1)* %ptr, i32 %value seq_cst
+  ret i32 %res
+}
+
+define i32 @test_atomicrmw_nand_i32_local(i32 addrspace(3)* %ptr, i32 %value) {
+; CHECK-LABEL: @test_atomicrmw_nand_i32_local(
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(3)* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[NEW:%.*]] = xor i32 [[TMP2]], -1
+; CHECK-NEXT:    [[TMP3:%.*]] = cmpxchg i32 addrspace(3)* [[PTR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1
+; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret i32 [[NEWLOADED]]
+;
+  %res = atomicrmw nand i32 addrspace(3)* %ptr, i32 %value seq_cst
+  ret i32 %res
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/AMDGPU/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,2 @@
+if not 'AMDGPU' in config.root.targets:
+  config.unsupported = True

Added: llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v7.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v7.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v7.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v7.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,440 @@
+; RUN: opt -S -o - -mtriple=armv7-apple-ios7.0 -atomic-expand -codegen-opt-level=1 %s | FileCheck %s
+
+define i8 @test_atomic_xchg_i8(i8* %ptr, i8 %xchgend) {
+; CHECK-LABEL: @test_atomic_xchg_i8
+; CHECK-NOT: dmb
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[NEWVAL32:%.*]] = zext i8 %xchgend to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: dmb
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw xchg i8* %ptr, i8 %xchgend monotonic
+  ret i8 %res
+}
+
+define i16 @test_atomic_add_i16(i16* %ptr, i16 %addend) {
+; CHECK-LABEL: @test_atomic_add_i16
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i16
+; CHECK: [[NEWVAL:%.*]] = add i16 [[OLDVAL]], %addend
+; CHECK: [[NEWVAL32:%.*]] = zext i16 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i16(i32 [[NEWVAL32]], i16* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i16 [[OLDVAL]]
+  %res = atomicrmw add i16* %ptr, i16 %addend seq_cst
+  ret i16 %res
+}
+
+define i32 @test_atomic_sub_i32(i32* %ptr, i32 %subend) {
+; CHECK-LABEL: @test_atomic_sub_i32
+; CHECK-NOT: dmb
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %ptr)
+; CHECK: [[NEWVAL:%.*]] = sub i32 [[OLDVAL]], %subend
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 [[NEWVAL]], i32* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i32 [[OLDVAL]]
+  %res = atomicrmw sub i32* %ptr, i32 %subend acquire
+  ret i32 %res
+}
+
+define i8 @test_atomic_and_i8(i8* %ptr, i8 %andend) {
+; CHECK-LABEL: @test_atomic_and_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[NEWVAL:%.*]] = and i8 [[OLDVAL]], %andend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: dmb
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw and i8* %ptr, i8 %andend release
+  ret i8 %res
+}
+
+define i16 @test_atomic_nand_i16(i16* %ptr, i16 %nandend) {
+; CHECK-LABEL: @test_atomic_nand_i16
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i16
+; CHECK: [[NEWVAL_TMP:%.*]] = and i16 [[OLDVAL]], %nandend
+; CHECK: [[NEWVAL:%.*]] = xor i16 [[NEWVAL_TMP]], -1
+; CHECK: [[NEWVAL32:%.*]] = zext i16 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i16(i32 [[NEWVAL32]], i16* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i16 [[OLDVAL]]
+  %res = atomicrmw nand i16* %ptr, i16 %nandend seq_cst
+  ret i16 %res
+}
+
+define i64 @test_atomic_or_i64(i64* %ptr, i64 %orend) {
+; CHECK-LABEL: @test_atomic_or_i64
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[LOHI:%.*]] = call { i32, i32 } @llvm.arm.ldrexd(i8* [[PTR8]])
+; CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
+; CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
+; CHECK: [[LO64:%.*]] = zext i32 [[LO]] to i64
+; CHECK: [[HI64_TMP:%.*]] = zext i32 [[HI]] to i64
+; CHECK: [[HI64:%.*]] = shl i64 [[HI64_TMP]], 32
+; CHECK: [[OLDVAL:%.*]] = or i64 [[LO64]], [[HI64]]
+; CHECK: [[NEWVAL:%.*]] = or i64 [[OLDVAL]], %orend
+; CHECK: [[NEWLO:%.*]] = trunc i64 [[NEWVAL]] to i32
+; CHECK: [[NEWHI_TMP:%.*]] = lshr i64 [[NEWVAL]], 32
+; CHECK: [[NEWHI:%.*]] = trunc i64 [[NEWHI_TMP]] to i32
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strexd(i32 [[NEWLO]], i32 [[NEWHI]], i8* [[PTR8]])
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i64 [[OLDVAL]]
+  %res = atomicrmw or i64* %ptr, i64 %orend seq_cst
+  ret i64 %res
+}
+
+define i8 @test_atomic_xor_i8(i8* %ptr, i8 %xorend) {
+; CHECK-LABEL: @test_atomic_xor_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[NEWVAL:%.*]] = xor i8 [[OLDVAL]], %xorend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw xor i8* %ptr, i8 %xorend seq_cst
+  ret i8 %res
+}
+
+define i8 @test_atomic_max_i8(i8* %ptr, i8 %maxend) {
+; CHECK-LABEL: @test_atomic_max_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[WANT_OLD:%.*]] = icmp sgt i8 [[OLDVAL]], %maxend
+; CHECK: [[NEWVAL:%.*]] = select i1 [[WANT_OLD]], i8 [[OLDVAL]], i8 %maxend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw max i8* %ptr, i8 %maxend seq_cst
+  ret i8 %res
+}
+
+define i8 @test_atomic_min_i8(i8* %ptr, i8 %minend) {
+; CHECK-LABEL: @test_atomic_min_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[WANT_OLD:%.*]] = icmp sle i8 [[OLDVAL]], %minend
+; CHECK: [[NEWVAL:%.*]] = select i1 [[WANT_OLD]], i8 [[OLDVAL]], i8 %minend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw min i8* %ptr, i8 %minend seq_cst
+  ret i8 %res
+}
+
+define i8 @test_atomic_umax_i8(i8* %ptr, i8 %umaxend) {
+; CHECK-LABEL: @test_atomic_umax_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[WANT_OLD:%.*]] = icmp ugt i8 [[OLDVAL]], %umaxend
+; CHECK: [[NEWVAL:%.*]] = select i1 [[WANT_OLD]], i8 [[OLDVAL]], i8 %umaxend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw umax i8* %ptr, i8 %umaxend seq_cst
+  ret i8 %res
+}
+
+define i8 @test_atomic_umin_i8(i8* %ptr, i8 %uminend) {
+; CHECK-LABEL: @test_atomic_umin_i8
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[WANT_OLD:%.*]] = icmp ule i8 [[OLDVAL]], %uminend
+; CHECK: [[NEWVAL:%.*]] = select i1 [[WANT_OLD]], i8 [[OLDVAL]], i8 %uminend
+; CHECK: [[NEWVAL32:%.*]] = zext i8 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw umin i8* %ptr, i8 %uminend seq_cst
+  ret i8 %res
+}
+
+define i8 @test_cmpxchg_i8_seqcst_seqcst(i8* %ptr, i8 %desired, i8 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i8_seqcst_seqcst
+; CHECK: br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i8 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[FENCED_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[FENCED_STORE]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[LOADED_LOOP:%.*]] = phi i8 [ [[OLDVAL]], %[[FENCED_STORE]] ], [ [[OLDVAL_LOOP:%.*]], %[[RELEASED_LOAD:.*]] ]
+; CHECK: [[NEWVAL32:%.*]] = zext i8 %newval to i32
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[RELEASED_LOAD]]
+
+; CHECK: [[RELEASED_LOAD]]:
+; CHECK: [[OLDVAL32_LOOP:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL_LOOP]] = trunc i32 [[OLDVAL32_LOOP]] to i8
+; CHECK: [[SHOULD_STORE_LOOP:%.*]] = icmp eq i8 [[OLDVAL_LOOP]], %desired
+; CHECK: br i1 [[SHOULD_STORE_LOOP]], label %[[LOOP]], label %[[NO_STORE_BB]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: [[LOADED_NO_STORE:%.*]] = phi i8 [ [[OLDVAL]], %[[START]] ], [ [[OLDVAL_LOOP]], %[[RELEASED_LOAD]] ]
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: [[LOADED:%.*]] = phi i8 [ [[LOADED_LOOP]], %[[SUCCESS_BB]] ], [ [[LOADED_NO_STORE]], %[[FAILURE_BB]] ]
+; CHECK: ret i8 [[LOADED]]
+
+  %pairold = cmpxchg i8* %ptr, i8 %desired, i8 %newval seq_cst seq_cst
+  %old = extractvalue { i8, i1 } %pairold, 0
+  ret i8 %old
+}
+
+define i16 @test_cmpxchg_i16_seqcst_monotonic(i16* %ptr, i16 %desired, i16 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i16_seqcst_monotonic
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 %1 to i16
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i16 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[FENCED_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[FENCED_STORE]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[LOADED_LOOP:%.*]] = phi i16 [ [[OLDVAL]], %[[FENCED_STORE]] ], [ [[OLDVAL_LOOP:%.*]], %[[RELEASED_LOAD:.*]] ]
+; CHECK: [[NEWVAL32:%.*]] = zext i16 %newval to i32
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.strex.p0i16(i32 [[NEWVAL32]], i16* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[RELEASED_LOAD:.*]]
+
+; CHECK: [[RELEASED_LOAD]]:
+; CHECK: [[OLDVAL32_LOOP:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL_LOOP]] = trunc i32 [[OLDVAL32_LOOP]] to i16
+; CHECK: [[SHOULD_STORE_LOOP:%.*]] = icmp eq i16 [[OLDVAL_LOOP]], %desired
+; CHECK: br i1 [[SHOULD_STORE_LOOP]], label %[[LOOP]], label %[[NO_STORE_BB]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: [[LOADED_NO_STORE:%.*]] = phi i16 [ [[OLDVAL]], %[[START]] ], [ [[OLDVAL_LOOP]], %[[RELEASED_LOAD]] ]
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: dmb
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: [[LOADED:%.*]] = phi i16 [ [[LOADED_LOOP]], %[[SUCCESS_BB]] ], [ [[LOADED_NO_STORE]], %[[FAILURE_BB]] ]
+; CHECK: ret i16 [[LOADED]]
+
+  %pairold = cmpxchg i16* %ptr, i16 %desired, i16 %newval seq_cst monotonic
+  %old = extractvalue { i16, i1 } %pairold, 0
+  ret i16 %old
+}
+
+define i32 @test_cmpxchg_i32_acquire_acquire(i32* %ptr, i32 %desired, i32 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i32_acquire_acquire
+; CHECK-NOT: dmb
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %ptr)
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.strex.p0i32(i32 %newval, i32* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK: call void @llvm.arm.dmb(i32 11)
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i32 [[OLDVAL]]
+
+  %pairold = cmpxchg i32* %ptr, i32 %desired, i32 %newval acquire acquire
+  %old = extractvalue { i32, i1 } %pairold, 0
+  ret i32 %old
+}
+
+define i64 @test_cmpxchg_i64_monotonic_monotonic(i64* %ptr, i64 %desired, i64 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i64_monotonic_monotonic
+; CHECK-NOT: dmb
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[LOHI:%.*]] = call { i32, i32 } @llvm.arm.ldrexd(i8* [[PTR8]])
+; CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
+; CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
+; CHECK: [[LO64:%.*]] = zext i32 [[LO]] to i64
+; CHECK: [[HI64_TMP:%.*]] = zext i32 [[HI]] to i64
+; CHECK: [[HI64:%.*]] = shl i64 [[HI64_TMP]], 32
+; CHECK: [[OLDVAL:%.*]] = or i64 [[LO64]], [[HI64]]
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i64 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[NEWLO:%.*]] = trunc i64 %newval to i32
+; CHECK: [[NEWHI_TMP:%.*]] = lshr i64 %newval, 32
+; CHECK: [[NEWHI:%.*]] = trunc i64 [[NEWHI_TMP]] to i32
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strexd(i32 [[NEWLO]], i32 [[NEWHI]], i8* [[PTR8]])
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: dmb
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: dmb
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i64 [[OLDVAL]]
+
+  %pairold = cmpxchg i64* %ptr, i64 %desired, i64 %newval monotonic monotonic
+  %old = extractvalue { i64, i1 } %pairold, 0
+  ret i64 %old
+}
+
+define i32 @test_cmpxchg_minsize(i32* %addr, i32 %desired, i32 %new) minsize {
+; CHECK-LABEL: @test_cmpxchg_minsize
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK:     [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
+; CHECK:     [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
+; CHECK:     br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK:     [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
+; CHECK:     [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
+; CHECK:     br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[START]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK:     call void @llvm.arm.clrex()
+; CHECK:     br label %[[FAILURE_BB]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END]]
+
+; CHECK: [[END]]:
+; CHECK:     [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK:     ret i32 [[LOADED]]
+
+  %pair = cmpxchg i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
+  %oldval = extractvalue { i32, i1 } %pair, 0
+  ret i32 %oldval
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v8.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v8.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v8.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/ARM/atomic-expansion-v8.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,242 @@
+; RUN: opt -S -o - -mtriple=armv8-linux-gnueabihf -atomic-expand %s -codegen-opt-level=1 | FileCheck %s
+
+define i8 @test_atomic_xchg_i8(i8* %ptr, i8 %xchgend) {
+; CHECK-LABEL: @test_atomic_xchg_i8
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i8
+; CHECK: [[NEWVAL32:%.*]] = zext i8 %xchgend to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: fence
+; CHECK: ret i8 [[OLDVAL]]
+  %res = atomicrmw xchg i8* %ptr, i8 %xchgend monotonic
+  ret i8 %res
+}
+
+define i16 @test_atomic_add_i16(i16* %ptr, i16 %addend) {
+; CHECK-LABEL: @test_atomic_add_i16
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldaex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i16
+; CHECK: [[NEWVAL:%.*]] = add i16 [[OLDVAL]], %addend
+; CHECK: [[NEWVAL32:%.*]] = zext i16 [[NEWVAL]] to i32
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.stlex.p0i16(i32 [[NEWVAL32]], i16* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: fence
+; CHECK: ret i16 [[OLDVAL]]
+  %res = atomicrmw add i16* %ptr, i16 %addend seq_cst
+  ret i16 %res
+}
+
+define i32 @test_atomic_sub_i32(i32* %ptr, i32 %subend) {
+; CHECK-LABEL: @test_atomic_sub_i32
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL:%.*]] = call i32 @llvm.arm.ldaex.p0i32(i32* %ptr)
+; CHECK: [[NEWVAL:%.*]] = sub i32 [[OLDVAL]], %subend
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 [[NEWVAL]], i32* %ptr)
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: fence
+; CHECK: ret i32 [[OLDVAL]]
+  %res = atomicrmw sub i32* %ptr, i32 %subend acquire
+  ret i32 %res
+}
+
+define i64 @test_atomic_or_i64(i64* %ptr, i64 %orend) {
+; CHECK-LABEL: @test_atomic_or_i64
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[LOHI:%.*]] = call { i32, i32 } @llvm.arm.ldaexd(i8* [[PTR8]])
+; CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
+; CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
+; CHECK: [[LO64:%.*]] = zext i32 [[LO]] to i64
+; CHECK: [[HI64_TMP:%.*]] = zext i32 [[HI]] to i64
+; CHECK: [[HI64:%.*]] = shl i64 [[HI64_TMP]], 32
+; CHECK: [[OLDVAL:%.*]] = or i64 [[LO64]], [[HI64]]
+; CHECK: [[NEWVAL:%.*]] = or i64 [[OLDVAL]], %orend
+; CHECK: [[NEWLO:%.*]] = trunc i64 [[NEWVAL]] to i32
+; CHECK: [[NEWHI_TMP:%.*]] = lshr i64 [[NEWVAL]], 32
+; CHECK: [[NEWHI:%.*]] = trunc i64 [[NEWHI_TMP]] to i32
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.stlexd(i32 [[NEWLO]], i32 [[NEWHI]], i8* [[PTR8]])
+; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[LOOP]], label %[[END:.*]]
+; CHECK: [[END]]:
+; CHECK-NOT: fence
+; CHECK: ret i64 [[OLDVAL]]
+  %res = atomicrmw or i64* %ptr, i64 %orend seq_cst
+  ret i64 %res
+}
+
+define i8 @test_cmpxchg_i8_seqcst_seqcst(i8* %ptr, i8 %desired, i8 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i8_seqcst_seqcst
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldaex.p0i8(i8* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 %1 to i8
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i8 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[NEWVAL32:%.*]] = zext i8 %newval to i32
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.stlex.p0i8(i32 [[NEWVAL32]], i8* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i8 [[OLDVAL]]
+
+  %pairold = cmpxchg i8* %ptr, i8 %desired, i8 %newval seq_cst seq_cst
+  %old = extractvalue { i8, i1 } %pairold, 0
+  ret i8 %old
+}
+
+define i16 @test_cmpxchg_i16_seqcst_monotonic(i16* %ptr, i16 %desired, i16 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i16_seqcst_monotonic
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldaex.p0i16(i16* %ptr)
+; CHECK: [[OLDVAL:%.*]] = trunc i32 %1 to i16
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i16 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[NEWVAL32:%.*]] = zext i16 %newval to i32
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.stlex.p0i16(i32 [[NEWVAL32]], i16* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: fence
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: fence
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i16 [[OLDVAL]]
+
+  %pairold = cmpxchg i16* %ptr, i16 %desired, i16 %newval seq_cst monotonic
+  %old = extractvalue { i16, i1 } %pairold, 0
+  ret i16 %old
+}
+
+define i32 @test_cmpxchg_i32_acquire_acquire(i32* %ptr, i32 %desired, i32 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i32_acquire_acquire
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[OLDVAL:%.*]] = call i32 @llvm.arm.ldaex.p0i32(i32* %ptr)
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i32 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[TRYAGAIN:%.*]] =  call i32 @llvm.arm.strex.p0i32(i32 %newval, i32* %ptr)
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i32 [[OLDVAL]]
+
+  %pairold = cmpxchg i32* %ptr, i32 %desired, i32 %newval acquire acquire
+  %old = extractvalue { i32, i1 } %pairold, 0
+  ret i32 %old
+}
+
+define i64 @test_cmpxchg_i64_monotonic_monotonic(i64* %ptr, i64 %desired, i64 %newval) {
+; CHECK-LABEL: @test_cmpxchg_i64_monotonic_monotonic
+; CHECK-NOT: fence
+; CHECK: br label %[[LOOP:.*]]
+
+; CHECK: [[LOOP]]:
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[LOHI:%.*]] = call { i32, i32 } @llvm.arm.ldrexd(i8* [[PTR8]])
+; CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 0
+; CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 1
+; CHECK: [[LO64:%.*]] = zext i32 [[LO]] to i64
+; CHECK: [[HI64_TMP:%.*]] = zext i32 [[HI]] to i64
+; CHECK: [[HI64:%.*]] = shl i64 [[HI64_TMP]], 32
+; CHECK: [[OLDVAL:%.*]] = or i64 [[LO64]], [[HI64]]
+; CHECK: [[SHOULD_STORE:%.*]] = icmp eq i64 [[OLDVAL]], %desired
+; CHECK: br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK: [[NEWLO:%.*]] = trunc i64 %newval to i32
+; CHECK: [[NEWHI_TMP:%.*]] = lshr i64 %newval, 32
+; CHECK: [[NEWHI:%.*]] = trunc i64 [[NEWHI_TMP]] to i32
+; CHECK: [[PTR8:%.*]] = bitcast i64* %ptr to i8*
+; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strexd(i32 [[NEWLO]], i32 [[NEWHI]], i8* [[PTR8]])
+; CHECK: [[TST:%.*]] = icmp eq i32 [[TRYAGAIN]], 0
+; CHECK: br i1 [[TST]], label %[[SUCCESS_BB:.*]], label %[[LOOP]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK-NEXT: call void @llvm.arm.clrex()
+; CHECK-NEXT: br label %[[FAILURE_BB:.*]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: fence_cst
+; CHECK: br label %[[DONE]]
+
+; CHECK: [[DONE]]:
+; CHECK: [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK: ret i64 [[OLDVAL]]
+
+  %pairold = cmpxchg i64* %ptr, i64 %desired, i64 %newval monotonic monotonic
+  %old = extractvalue { i64, i1 } %pairold, 0
+  ret i64 %old
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/ARM/atomicrmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/ARM/atomicrmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/ARM/atomicrmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/ARM/atomicrmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,51 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=armv7-apple-ios7.0 -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    call void @llvm.arm.dmb(i32 11)
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] monotonic monotonic
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    call void @llvm.arm.dmb(i32 11)
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    call void @llvm.arm.dmb(i32 11)
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] monotonic monotonic
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    call void @llvm.arm.dmb(i32 11)
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/ARM/cmpxchg-weak.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/ARM/cmpxchg-weak.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/ARM/cmpxchg-weak.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/ARM/cmpxchg-weak.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,155 @@
+; RUN: opt -atomic-expand -codegen-opt-level=1 -S -mtriple=thumbv7s-apple-ios7.0 %s | FileCheck %s
+
+define i32 @test_cmpxchg_seq_cst(i32* %addr, i32 %desired, i32 %new) {
+; CHECK-LABEL: @test_cmpxchg_seq_cst
+; Intrinsic for "dmb ishst" is then expected
+; CHECK:     br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK:     [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
+; CHECK:     [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
+; CHECK:     br i1 [[SHOULD_STORE]], label %[[FENCED_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[FENCED_STORE]]:
+; CHECK:     call void @llvm.arm.dmb(i32 10)
+; CHECK:     br label %[[TRY_STORE:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK:     [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
+; CHECK:     [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
+; CHECK:     br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK:     call void @llvm.arm.clrex()
+; CHECK:     br label %[[FAILURE_BB]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END]]
+
+; CHECK: [[END]]:
+; CHECK:     [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK:     ret i32 [[LOADED]]
+
+  %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
+  %oldval = extractvalue { i32, i1 } %pair, 0
+  ret i32 %oldval
+}
+
+define i1 @test_cmpxchg_weak_fail(i32* %addr, i32 %desired, i32 %new) {
+; CHECK-LABEL: @test_cmpxchg_weak_fail
+; CHECK:     br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK:     [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
+; CHECK:     [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
+; CHECK:     br i1 [[SHOULD_STORE]], label %[[FENCED_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[FENCED_STORE]]:
+; CHECK:     call void @llvm.arm.dmb(i32 10)
+; CHECK:     br label %[[TRY_STORE:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK:     [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
+; CHECK:     [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
+; CHECK:     br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK:     call void @llvm.arm.clrex()
+; CHECK:     br label %[[FAILURE_BB]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: dmb
+; CHECK:     br label %[[END]]
+
+; CHECK: [[END]]:
+; CHECK:     [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK:     ret i1 [[SUCCESS]]
+
+  %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst monotonic
+  %oldval = extractvalue { i32, i1 } %pair, 1
+  ret i1 %oldval
+}
+
+define i32 @test_cmpxchg_monotonic(i32* %addr, i32 %desired, i32 %new) {
+; CHECK-LABEL: @test_cmpxchg_monotonic
+; CHECK-NOT: dmb
+; CHECK:     br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK:     [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
+; CHECK:     [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
+; CHECK:     br i1 [[SHOULD_STORE]], label %[[TRY_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK:     [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
+; CHECK:     [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
+; CHECK:     br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK-NOT: dmb
+; CHECK:     br label %[[END:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK:     call void @llvm.arm.clrex()
+; CHECK:     br label %[[FAILURE_BB]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK-NOT: dmb
+; CHECK:     br label %[[END]]
+
+; CHECK: [[END]]:
+; CHECK:     [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK:     ret i32 [[LOADED]]
+
+  %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new monotonic monotonic
+  %oldval = extractvalue { i32, i1 } %pair, 0
+  ret i32 %oldval
+}
+
+define i32 @test_cmpxchg_seq_cst_minsize(i32* %addr, i32 %desired, i32 %new) minsize {
+; CHECK-LABEL: @test_cmpxchg_seq_cst_minsize
+; CHECK:     br label %[[START:.*]]
+
+; CHECK: [[START]]:
+; CHECK:     [[LOADED:%.*]] = call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
+; CHECK:     [[SHOULD_STORE:%.*]] = icmp eq i32 [[LOADED]], %desired
+; CHECK:     br i1 [[SHOULD_STORE]], label %[[FENCED_STORE:.*]], label %[[NO_STORE_BB:.*]]
+
+; CHECK: [[FENCED_STORE]]:
+; CHECK:     call void @llvm.arm.dmb(i32 10)
+; CHECK:     br label %[[TRY_STORE:.*]]
+
+; CHECK: [[TRY_STORE]]:
+; CHECK:     [[STREX:%.*]] = call i32 @llvm.arm.strex.p0i32(i32 %new, i32* %addr)
+; CHECK:     [[SUCCESS:%.*]] = icmp eq i32 [[STREX]], 0
+; CHECK:     br i1 [[SUCCESS]], label %[[SUCCESS_BB:.*]], label %[[FAILURE_BB:.*]]
+
+; CHECK: [[SUCCESS_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END:.*]]
+
+; CHECK: [[NO_STORE_BB]]:
+; CHECK:     call void @llvm.arm.clrex()
+; CHECK:     br label %[[FAILURE_BB]]
+
+; CHECK: [[FAILURE_BB]]:
+; CHECK:     call void @llvm.arm.dmb(i32 11)
+; CHECK:     br label %[[END]]
+
+; CHECK: [[END]]:
+; CHECK:     [[SUCCESS:%.*]] = phi i1 [ true, %[[SUCCESS_BB]] ], [ false, %[[FAILURE_BB]] ]
+; CHECK:     ret i32 [[LOADED]]
+
+  %pair = cmpxchg weak i32* %addr, i32 %desired, i32 %new seq_cst seq_cst
+  %oldval = extractvalue { i32, i1 } %pair, 0
+  ret i32 %oldval
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/ARM/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/ARM/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/ARM/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/ARM/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,3 @@
+if not 'ARM' in config.root.targets:
+    config.unsupported = True
+

Added: llvm/trunk/test/Transforms/AtomicExpand/Hexagon/atomicrmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/Hexagon/atomicrmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/Hexagon/atomicrmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/Hexagon/atomicrmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,47 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=hexagon-- -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[PTR:%.*]] to i32*
+; CHECK-NEXT:    [[LARX:%.*]] = call i32 @llvm.hexagon.L2.loadw.locked(i32* [[TMP1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32 [[LARX]] to float
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[TMP2]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[STCX:%.*]] = call i32 @llvm.hexagon.S2.storew.locked(i32* [[TMP3]], i32 [[TMP4]])
+; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[STCX]], 0
+; CHECK-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
+; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
+; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP2]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[PTR:%.*]] to i32*
+; CHECK-NEXT:    [[LARX:%.*]] = call i32 @llvm.hexagon.L2.loadw.locked(i32* [[TMP1]])
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32 [[LARX]] to float
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[TMP2]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[STCX:%.*]] = call i32 @llvm.hexagon.S2.storew.locked(i32* [[TMP3]], i32 [[TMP4]])
+; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[STCX]], 0
+; CHECK-NEXT:    [[TMP6:%.*]] = zext i1 [[TMP5]] to i32
+; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
+; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP2]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/Hexagon/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/Hexagon/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/Hexagon/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/Hexagon/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,2 @@
+if not 'Hexagon' in config.root.targets:
+    config.unsupported = True

Added: llvm/trunk/test/Transforms/AtomicExpand/Mips/atomicrmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/Mips/atomicrmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/Mips/atomicrmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/Mips/atomicrmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,51 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=mips64-mti-linux-gnu -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    fence seq_cst
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] monotonic monotonic
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    fence seq_cst
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    fence seq_cst
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] monotonic monotonic
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    fence seq_cst
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/Mips/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/Mips/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/Mips/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/Mips/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,2 @@
+if not 'Mips' in config.root.targets:
+    config.unsupported = True

Added: llvm/trunk/test/Transforms/AtomicExpand/RISCV/atomicrmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/RISCV/atomicrmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/RISCV/atomicrmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/RISCV/atomicrmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,59 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=riscv32-- -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = alloca float, align 4
+; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[PTR]] to i8*
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float* [[TMP1]] to i8*
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]])
+; CHECK-NEXT:    store float [[LOADED]], float* [[TMP1]], align 4
+; CHECK-NEXT:    [[TMP5:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP6:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(i8* [[TMP3]], i8* [[TMP4]], i32 [[TMP5]], i32 5, i32 5)
+; CHECK-NEXT:    [[TMP7:%.*]] = load float, float* [[TMP1]], align 4
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP4]])
+; CHECK-NEXT:    [[TMP8:%.*]] = insertvalue { float, i1 } undef, float [[TMP7]], 0
+; CHECK-NEXT:    [[TMP9:%.*]] = insertvalue { float, i1 } [[TMP8]], i1 [[TMP6]], 1
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { float, i1 } [[TMP9]], 1
+; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { float, i1 } [[TMP9]], 0
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[NEWLOADED]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = alloca float, align 4
+; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[PTR]] to i8*
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float* [[TMP1]] to i8*
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]])
+; CHECK-NEXT:    store float [[LOADED]], float* [[TMP1]], align 4
+; CHECK-NEXT:    [[TMP5:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP6:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(i8* [[TMP3]], i8* [[TMP4]], i32 [[TMP5]], i32 5, i32 5)
+; CHECK-NEXT:    [[TMP7:%.*]] = load float, float* [[TMP1]], align 4
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP4]])
+; CHECK-NEXT:    [[TMP8:%.*]] = insertvalue { float, i1 } undef, float [[TMP7]], 0
+; CHECK-NEXT:    [[TMP9:%.*]] = insertvalue { float, i1 } [[TMP8]], i1 [[TMP6]], 1
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { float, i1 } [[TMP9]], 1
+; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { float, i1 } [[TMP9]], 0
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[NEWLOADED]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/RISCV/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/RISCV/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/RISCV/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/RISCV/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,5 @@
+config.suffixes = ['.ll']
+
+targets = set(config.root.targets_to_build.split())
+if not 'RISCV' in targets:
+    config.unsupported = True

Added: llvm/trunk/test/Transforms/AtomicExpand/SPARC/libcalls.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/SPARC/libcalls.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/SPARC/libcalls.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/SPARC/libcalls.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,257 @@
+; RUN: opt -S %s -atomic-expand | FileCheck %s
+
+;;; NOTE: this test is actually target-independent -- any target which
+;;; doesn't support inline atomics can be used. (E.g. X86 i386 would
+;;; work, if LLVM is properly taught about what it's missing vs i586.)
+
+;target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
+;target triple = "i386-unknown-unknown"
+target datalayout = "e-m:e-p:32:32-i64:64-f128:64-n32-S64"
+target triple = "sparc-unknown-unknown"
+
+;; First, check the sized calls. Except for cmpxchg, these are fairly
+;; straightforward.
+
+; CHECK-LABEL: @test_load_i16(
+; CHECK:  %1 = bitcast i16* %arg to i8*
+; CHECK:  %2 = call i16 @__atomic_load_2(i8* %1, i32 5)
+; CHECK:  ret i16 %2
+define i16 @test_load_i16(i16* %arg) {
+  %ret = load atomic i16, i16* %arg seq_cst, align 4
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_store_i16(
+; CHECK:  %1 = bitcast i16* %arg to i8*
+; CHECK:  call void @__atomic_store_2(i8* %1, i16 %val, i32 5)
+; CHECK:  ret void
+define void @test_store_i16(i16* %arg, i16 %val) {
+  store atomic i16 %val, i16* %arg seq_cst, align 4
+  ret void
+}
+
+; CHECK-LABEL: @test_exchange_i16(
+; CHECK:  %1 = bitcast i16* %arg to i8*
+; CHECK:  %2 = call i16 @__atomic_exchange_2(i8* %1, i16 %val, i32 5)
+; CHECK:  ret i16 %2
+define i16 @test_exchange_i16(i16* %arg, i16 %val) {
+  %ret = atomicrmw xchg i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_cmpxchg_i16(
+; CHECK:  %1 = bitcast i16* %arg to i8*
+; CHECK:  %2 = alloca i16, align 2
+; CHECK:  %3 = bitcast i16* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 2, i8* %3)
+; CHECK:  store i16 %old, i16* %2, align 2
+; CHECK:  %4 = call zeroext i1 @__atomic_compare_exchange_2(i8* %1, i8* %3, i16 %new, i32 5, i32 0)
+; CHECK:  %5 = load i16, i16* %2, align 2
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 2, i8* %3)
+; CHECK:  %6 = insertvalue { i16, i1 } undef, i16 %5, 0
+; CHECK:  %7 = insertvalue { i16, i1 } %6, i1 %4, 1
+; CHECK:  %ret = extractvalue { i16, i1 } %7, 0
+; CHECK:  ret i16 %ret
+define i16 @test_cmpxchg_i16(i16* %arg, i16 %old, i16 %new) {
+  %ret_succ = cmpxchg i16* %arg, i16 %old, i16 %new seq_cst monotonic
+  %ret = extractvalue { i16, i1 } %ret_succ, 0
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_add_i16(
+; CHECK:  %1 = bitcast i16* %arg to i8*
+; CHECK:  %2 = call i16 @__atomic_fetch_add_2(i8* %1, i16 %val, i32 5)
+; CHECK:  ret i16 %2
+define i16 @test_add_i16(i16* %arg, i16 %val) {
+  %ret = atomicrmw add i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+
+;; Now, check the output for the unsized libcalls. i128 is used for
+;; these tests because the "16" suffixed functions aren't available on
+;; 32-bit i386.
+
+; CHECK-LABEL: @test_load_i128(
+; CHECK:  %1 = bitcast i128* %arg to i8*
+; CHECK:  %2 = alloca i128, align 8
+; CHECK:  %3 = bitcast i128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %3)
+; CHECK:  call void @__atomic_load(i32 16, i8* %1, i8* %3, i32 5)
+; CHECK:  %4 = load i128, i128* %2, align 8
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %3)
+; CHECK:  ret i128 %4
+define i128 @test_load_i128(i128* %arg) {
+  %ret = load atomic i128, i128* %arg seq_cst, align 16
+  ret i128 %ret
+}
+
+; CHECK-LABEL @test_store_i128(
+; CHECK:  %1 = bitcast i128* %arg to i8*
+; CHECK:  %2 = alloca i128, align 8
+; CHECK:  %3 = bitcast i128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %3)
+; CHECK:  store i128 %val, i128* %2, align 8
+; CHECK:  call void @__atomic_store(i32 16, i8* %1, i8* %3, i32 5)
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %3)
+; CHECK:  ret void
+define void @test_store_i128(i128* %arg, i128 %val) {
+  store atomic i128 %val, i128* %arg seq_cst, align 16
+  ret void
+}
+
+; CHECK-LABEL: @test_exchange_i128(
+; CHECK:  %1 = bitcast i128* %arg to i8*
+; CHECK:  %2 = alloca i128, align 8
+; CHECK:  %3 = bitcast i128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %3)
+; CHECK:  store i128 %val, i128* %2, align 8
+; CHECK:  %4 = alloca i128, align 8
+; CHECK:  %5 = bitcast i128* %4 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %5)
+; CHECK:  call void @__atomic_exchange(i32 16, i8* %1, i8* %3, i8* %5, i32 5)
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %3)
+; CHECK:  %6 = load i128, i128* %4, align 8
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %5)
+; CHECK:  ret i128 %6
+define i128 @test_exchange_i128(i128* %arg, i128 %val) {
+  %ret = atomicrmw xchg i128* %arg, i128 %val seq_cst
+  ret i128 %ret
+}
+
+; CHECK-LABEL: @test_cmpxchg_i128(
+; CHECK:  %1 = bitcast i128* %arg to i8*
+; CHECK:  %2 = alloca i128, align 8
+; CHECK:  %3 = bitcast i128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %3)
+; CHECK:  store i128 %old, i128* %2, align 8
+; CHECK:  %4 = alloca i128, align 8
+; CHECK:  %5 = bitcast i128* %4 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %5)
+; CHECK:  store i128 %new, i128* %4, align 8
+; CHECK:  %6 = call zeroext i1 @__atomic_compare_exchange(i32 16, i8* %1, i8* %3, i8* %5, i32 5, i32 0)
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %5)
+; CHECK:  %7 = load i128, i128* %2, align 8
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %3)
+; CHECK:  %8 = insertvalue { i128, i1 } undef, i128 %7, 0
+; CHECK:  %9 = insertvalue { i128, i1 } %8, i1 %6, 1
+; CHECK:  %ret = extractvalue { i128, i1 } %9, 0
+; CHECK:  ret i128 %ret
+define i128 @test_cmpxchg_i128(i128* %arg, i128 %old, i128 %new) {
+  %ret_succ = cmpxchg i128* %arg, i128 %old, i128 %new seq_cst monotonic
+  %ret = extractvalue { i128, i1 } %ret_succ, 0
+  ret i128 %ret
+}
+
+; This one is a verbose expansion, as there is no generic
+; __atomic_fetch_add function, so it needs to expand to a cmpxchg
+; loop, which then itself expands into a libcall.
+
+; CHECK-LABEL: @test_add_i128(
+; CHECK:  %1 = alloca i128, align 8
+; CHECK:  %2 = alloca i128, align 8
+; CHECK:  %3 = load i128, i128* %arg, align 16
+; CHECK:  br label %atomicrmw.start
+; CHECK:atomicrmw.start:
+; CHECK:  %loaded = phi i128 [ %3, %0 ], [ %newloaded, %atomicrmw.start ]
+; CHECK:  %new = add i128 %loaded, %val
+; CHECK:  %4 = bitcast i128* %arg to i8*
+; CHECK:  %5 = bitcast i128* %1 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %5)
+; CHECK:  store i128 %loaded, i128* %1, align 8
+; CHECK:  %6 = bitcast i128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %6)
+; CHECK:  store i128 %new, i128* %2, align 8
+; CHECK:  %7 = call zeroext i1 @__atomic_compare_exchange(i32 16, i8* %4, i8* %5, i8* %6, i32 5, i32 5)
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %6)
+; CHECK:  %8 = load i128, i128* %1, align 8
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %5)
+; CHECK:  %9 = insertvalue { i128, i1 } undef, i128 %8, 0
+; CHECK:  %10 = insertvalue { i128, i1 } %9, i1 %7, 1
+; CHECK:  %success = extractvalue { i128, i1 } %10, 1
+; CHECK:  %newloaded = extractvalue { i128, i1 } %10, 0
+; CHECK:  br i1 %success, label %atomicrmw.end, label %atomicrmw.start
+; CHECK:atomicrmw.end:
+; CHECK:  ret i128 %newloaded
+define i128 @test_add_i128(i128* %arg, i128 %val) {
+  %ret = atomicrmw add i128* %arg, i128 %val seq_cst
+  ret i128 %ret
+}
+
+;; Ensure that non-integer types get bitcast correctly on the way in and out of a libcall:
+
+; CHECK-LABEL: @test_load_double(
+; CHECK:  %1 = bitcast double* %arg to i8*
+; CHECK:  %2 = call i64 @__atomic_load_8(i8* %1, i32 5)
+; CHECK:  %3 = bitcast i64 %2 to double
+; CHECK:  ret double %3
+define double @test_load_double(double* %arg, double %val) {
+  %1 = load atomic double, double* %arg seq_cst, align 16
+  ret double %1
+}
+
+; CHECK-LABEL: @test_store_double(
+; CHECK:  %1 = bitcast double* %arg to i8*
+; CHECK:  %2 = bitcast double %val to i64
+; CHECK:  call void @__atomic_store_8(i8* %1, i64 %2, i32 5)
+; CHECK:  ret void
+define void @test_store_double(double* %arg, double %val) {
+  store atomic double %val, double* %arg seq_cst, align 16
+  ret void
+}
+
+; CHECK-LABEL: @test_cmpxchg_ptr(
+; CHECK:   %1 = bitcast i16** %arg to i8*
+; CHECK:   %2 = alloca i16*, align 4
+; CHECK:   %3 = bitcast i16** %2 to i8*
+; CHECK:   call void @llvm.lifetime.start.p0i8(i64 4, i8* %3)
+; CHECK:   store i16* %old, i16** %2, align 4
+; CHECK:   %4 = ptrtoint i16* %new to i32
+; CHECK:   %5 = call zeroext i1 @__atomic_compare_exchange_4(i8* %1, i8* %3, i32 %4, i32 5, i32 2)
+; CHECK:   %6 = load i16*, i16** %2, align 4
+; CHECK:   call void @llvm.lifetime.end.p0i8(i64 4, i8* %3)
+; CHECK:   %7 = insertvalue { i16*, i1 } undef, i16* %6, 0
+; CHECK:   %8 = insertvalue { i16*, i1 } %7, i1 %5, 1
+; CHECK:   %ret = extractvalue { i16*, i1 } %8, 0
+; CHECK:   ret i16* %ret
+; CHECK: }
+define i16* @test_cmpxchg_ptr(i16** %arg, i16* %old, i16* %new) {
+  %ret_succ = cmpxchg i16** %arg, i16* %old, i16* %new seq_cst acquire
+  %ret = extractvalue { i16*, i1 } %ret_succ, 0
+  ret i16* %ret
+}
+
+;; ...and for a non-integer type of large size too.
+
+; CHECK-LABEL: @test_store_fp128
+; CHECK:   %1 = bitcast fp128* %arg to i8*
+; CHECK:  %2 = alloca fp128, align 8
+; CHECK:  %3 = bitcast fp128* %2 to i8*
+; CHECK:  call void @llvm.lifetime.start.p0i8(i64 16, i8* %3)
+; CHECK:  store fp128 %val, fp128* %2, align 8
+; CHECK:  call void @__atomic_store(i32 16, i8* %1, i8* %3, i32 5)
+; CHECK:  call void @llvm.lifetime.end.p0i8(i64 16, i8* %3)
+; CHECK:  ret void
+define void @test_store_fp128(fp128* %arg, fp128 %val) {
+  store atomic fp128 %val, fp128* %arg seq_cst, align 16
+  ret void
+}
+
+;; Unaligned loads and stores should be expanded to the generic
+;; libcall, just like large loads/stores, and not a specialized one.
+;; NOTE: atomicrmw and cmpxchg don't yet support an align attribute;
+;; when such support is added, they should also be tested here.
+
+; CHECK-LABEL: @test_unaligned_load_i16(
+; CHECK:  __atomic_load(
+define i16 @test_unaligned_load_i16(i16* %arg) {
+  %ret = load atomic i16, i16* %arg seq_cst, align 1
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_unaligned_store_i16(
+; CHECK: __atomic_store(
+define void @test_unaligned_store_i16(i16* %arg, i16 %val) {
+  store atomic i16 %val, i16* %arg seq_cst, align 1
+  ret void
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/SPARC/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/SPARC/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/SPARC/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/SPARC/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,2 @@
+if not 'Sparc' in config.root.targets:
+  config.unsupported = True

Added: llvm/trunk/test/Transforms/AtomicExpand/SPARC/partword.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/SPARC/partword.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/SPARC/partword.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/SPARC/partword.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,191 @@
+; RUN: opt -S %s -atomic-expand | FileCheck %s
+
+;; Verify the cmpxchg and atomicrmw expansions where sub-word-size
+;; instructions are not available.
+
+;;; NOTE: this test is mostly target-independent -- any target which
+;;; doesn't support cmpxchg of sub-word sizes would do.
+target datalayout = "E-m:e-i64:64-n32:64-S128"
+target triple = "sparcv9-unknown-unknown"
+
+; CHECK-LABEL: @test_cmpxchg_i8(
+; CHECK:  fence seq_cst
+; CHECK:  %0 = ptrtoint i8* %arg to i64
+; CHECK:  %1 = and i64 %0, -4
+; CHECK:  %AlignedAddr = inttoptr i64 %1 to i32*
+; CHECK:  %PtrLSB = and i64 %0, 3
+; CHECK:  %2 = xor i64 %PtrLSB, 3
+; CHECK:  %3 = shl i64 %2, 3
+; CHECK:  %ShiftAmt = trunc i64 %3 to i32
+; CHECK:  %Mask = shl i32 255, %ShiftAmt
+; CHECK:  %Inv_Mask = xor i32 %Mask, -1
+; CHECK:  %4 = zext i8 %new to i32
+; CHECK:  %5 = shl i32 %4, %ShiftAmt
+; CHECK:  %6 = zext i8 %old to i32
+; CHECK:  %7 = shl i32 %6, %ShiftAmt
+; CHECK:  %8 = load i32, i32* %AlignedAddr
+; CHECK:  %9 = and i32 %8, %Inv_Mask
+; CHECK:  br label %partword.cmpxchg.loop
+; CHECK:partword.cmpxchg.loop:
+; CHECK:  %10 = phi i32 [ %9, %entry ], [ %16, %partword.cmpxchg.failure ]
+; CHECK:  %11 = or i32 %10, %5
+; CHECK:  %12 = or i32 %10, %7
+; CHECK:  %13 = cmpxchg i32* %AlignedAddr, i32 %12, i32 %11 monotonic monotonic
+; CHECK:  %14 = extractvalue { i32, i1 } %13, 0
+; CHECK:  %15 = extractvalue { i32, i1 } %13, 1
+; CHECK:  br i1 %15, label %partword.cmpxchg.end, label %partword.cmpxchg.failure
+; CHECK:partword.cmpxchg.failure:
+; CHECK:  %16 = and i32 %14, %Inv_Mask
+; CHECK:  %17 = icmp ne i32 %10, %16
+; CHECK:  br i1 %17, label %partword.cmpxchg.loop, label %partword.cmpxchg.end
+; CHECK:partword.cmpxchg.end:
+; CHECK:  %18 = lshr i32 %14, %ShiftAmt
+; CHECK:  %19 = trunc i32 %18 to i8
+; CHECK:  %20 = insertvalue { i8, i1 } undef, i8 %19, 0
+; CHECK:  %21 = insertvalue { i8, i1 } %20, i1 %15, 1
+; CHECK:  fence seq_cst
+; CHECK:  %ret = extractvalue { i8, i1 } %21, 0
+; CHECK:  ret i8 %ret
+define i8 @test_cmpxchg_i8(i8* %arg, i8 %old, i8 %new) {
+entry:
+  %ret_succ = cmpxchg i8* %arg, i8 %old, i8 %new seq_cst monotonic
+  %ret = extractvalue { i8, i1 } %ret_succ, 0
+  ret i8 %ret
+}
+
+; CHECK-LABEL: @test_cmpxchg_i16(
+; CHECK:  fence seq_cst
+; CHECK:  %0 = ptrtoint i16* %arg to i64
+; CHECK:  %1 = and i64 %0, -4
+; CHECK:  %AlignedAddr = inttoptr i64 %1 to i32*
+; CHECK:  %PtrLSB = and i64 %0, 3
+; CHECK:  %2 = xor i64 %PtrLSB, 2
+; CHECK:  %3 = shl i64 %2, 3
+; CHECK:  %ShiftAmt = trunc i64 %3 to i32
+; CHECK:  %Mask = shl i32 65535, %ShiftAmt
+; CHECK:  %Inv_Mask = xor i32 %Mask, -1
+; CHECK:  %4 = zext i16 %new to i32
+; CHECK:  %5 = shl i32 %4, %ShiftAmt
+; CHECK:  %6 = zext i16 %old to i32
+; CHECK:  %7 = shl i32 %6, %ShiftAmt
+; CHECK:  %8 = load i32, i32* %AlignedAddr
+; CHECK:  %9 = and i32 %8, %Inv_Mask
+; CHECK:  br label %partword.cmpxchg.loop
+; CHECK:partword.cmpxchg.loop:
+; CHECK:  %10 = phi i32 [ %9, %entry ], [ %16, %partword.cmpxchg.failure ]
+; CHECK:  %11 = or i32 %10, %5
+; CHECK:  %12 = or i32 %10, %7
+; CHECK:  %13 = cmpxchg i32* %AlignedAddr, i32 %12, i32 %11 monotonic monotonic
+; CHECK:  %14 = extractvalue { i32, i1 } %13, 0
+; CHECK:  %15 = extractvalue { i32, i1 } %13, 1
+; CHECK:  br i1 %15, label %partword.cmpxchg.end, label %partword.cmpxchg.failure
+; CHECK:partword.cmpxchg.failure:
+; CHECK:  %16 = and i32 %14, %Inv_Mask
+; CHECK:  %17 = icmp ne i32 %10, %16
+; CHECK:  br i1 %17, label %partword.cmpxchg.loop, label %partword.cmpxchg.end
+; CHECK:partword.cmpxchg.end:
+; CHECK:  %18 = lshr i32 %14, %ShiftAmt
+; CHECK:  %19 = trunc i32 %18 to i16
+; CHECK:  %20 = insertvalue { i16, i1 } undef, i16 %19, 0
+; CHECK:  %21 = insertvalue { i16, i1 } %20, i1 %15, 1
+; CHECK:  fence seq_cst
+; CHECK:  %ret = extractvalue { i16, i1 } %21, 0
+; CHECK:  ret i16 %ret
+define i16 @test_cmpxchg_i16(i16* %arg, i16 %old, i16 %new) {
+entry:
+  %ret_succ = cmpxchg i16* %arg, i16 %old, i16 %new seq_cst monotonic
+  %ret = extractvalue { i16, i1 } %ret_succ, 0
+  ret i16 %ret
+}
+
+
+; CHECK-LABEL: @test_add_i16(
+; CHECK:  fence seq_cst
+; CHECK:  %0 = ptrtoint i16* %arg to i64
+; CHECK:  %1 = and i64 %0, -4
+; CHECK:  %AlignedAddr = inttoptr i64 %1 to i32*
+; CHECK:  %PtrLSB = and i64 %0, 3
+; CHECK:  %2 = xor i64 %PtrLSB, 2
+; CHECK:  %3 = shl i64 %2, 3
+; CHECK:  %ShiftAmt = trunc i64 %3 to i32
+; CHECK:  %Mask = shl i32 65535, %ShiftAmt
+; CHECK:  %Inv_Mask = xor i32 %Mask, -1
+; CHECK:  %4 = zext i16 %val to i32
+; CHECK:  %ValOperand_Shifted = shl i32 %4, %ShiftAmt
+; CHECK:  %5 = load i32, i32* %AlignedAddr, align 4
+; CHECK:  br label %atomicrmw.start
+; CHECK:atomicrmw.start:
+; CHECK:  %loaded = phi i32 [ %5, %entry ], [ %newloaded, %atomicrmw.start ]
+; CHECK:  %new = add i32 %loaded, %ValOperand_Shifted
+; CHECK:  %6 = and i32 %new, %Mask
+; CHECK:  %7 = and i32 %loaded, %Inv_Mask
+; CHECK:  %8 = or i32 %7, %6
+; CHECK:  %9 = cmpxchg i32* %AlignedAddr, i32 %loaded, i32 %8 monotonic monotonic
+; CHECK:  %success = extractvalue { i32, i1 } %9, 1
+; CHECK:  %newloaded = extractvalue { i32, i1 } %9, 0
+; CHECK:  br i1 %success, label %atomicrmw.end, label %atomicrmw.start
+; CHECK:atomicrmw.end:
+; CHECK:  %10 = lshr i32 %newloaded, %ShiftAmt
+; CHECK:  %11 = trunc i32 %10 to i16
+; CHECK:  fence seq_cst
+; CHECK:  ret i16 %11
+define i16 @test_add_i16(i16* %arg, i16 %val) {
+entry:
+  %ret = atomicrmw add i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_xor_i16(
+; (I'm going to just assert on the bits that differ from add, above.)
+; CHECK:atomicrmw.start:
+; CHECK:  %new = xor i32 %loaded, %ValOperand_Shifted
+; CHECK:  %6 = cmpxchg i32* %AlignedAddr, i32 %loaded, i32 %new monotonic monotonic
+; CHECK:atomicrmw.end:
+define i16 @test_xor_i16(i16* %arg, i16 %val) {
+entry:
+  %ret = atomicrmw xor i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_or_i16(
+; (I'm going to just assert on the bits that differ from add, above.)
+; CHECK:atomicrmw.start:
+; CHECK:  %new = or i32 %loaded, %ValOperand_Shifted
+; CHECK:  %6 = cmpxchg i32* %AlignedAddr, i32 %loaded, i32 %new monotonic monotonic
+; CHECK:atomicrmw.end:
+define i16 @test_or_i16(i16* %arg, i16 %val) {
+entry:
+  %ret = atomicrmw or i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_and_i16(
+; (I'm going to just assert on the bits that differ from add, above.)
+; CHECK:  %AndOperand = or i32 %Inv_Mask, %ValOperand_Shifted
+; CHECK:atomicrmw.start:
+; CHECK:  %new = and i32 %loaded, %AndOperand
+; CHECK:  %6 = cmpxchg i32* %AlignedAddr, i32 %loaded, i32 %new monotonic monotonic
+; CHECK:atomicrmw.end:
+define i16 @test_and_i16(i16* %arg, i16 %val) {
+entry:
+  %ret = atomicrmw and i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}
+
+; CHECK-LABEL: @test_min_i16(
+; CHECK:atomicrmw.start:
+; CHECK:  %6 = lshr i32 %loaded, %ShiftAmt
+; CHECK:  %7 = trunc i32 %6 to i16
+; CHECK:  %8 = icmp sle i16 %7, %val
+; CHECK:  %new = select i1 %8, i16 %7, i16 %val
+; CHECK:  %9 = zext i16 %new to i32
+; CHECK:  %10 = shl i32 %9, %ShiftAmt
+; CHECK:  %11 = and i32 %loaded, %Inv_Mask
+; CHECK:  %12 = or i32 %11, %10
+; CHECK:  %13 = cmpxchg i32* %AlignedAddr, i32 %loaded, i32 %12 monotonic monotonic
+; CHECK:atomicrmw.end:
+define i16 @test_min_i16(i16* %arg, i16 %val) {
+entry:
+  %ret = atomicrmw min i16* %arg, i16 %val seq_cst
+  ret i16 %ret
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,34 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=i686-linux-gnu -atomic-expand %s | FileCheck %s
+
+
+define i256 @atomic_load256_libcall(i256* %ptr) nounwind {
+; CHECK-LABEL: @atomic_load256_libcall(
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i256* [[PTR:%.*]] to i8*
+; CHECK-NEXT:    [[TMP2:%.*]] = alloca i256, align 8
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast i256* [[TMP2]] to i8*
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 32, i8* [[TMP3]])
+; CHECK-NEXT:    call void @__atomic_load(i64 32, i8* [[TMP1]], i8* [[TMP3]], i32 0)
+; CHECK-NEXT:    [[TMP4:%.*]] = load i256, i256* [[TMP2]], align 8
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 32, i8* [[TMP3]])
+; CHECK-NEXT:    ret i256 [[TMP4]]
+;
+  %result = load atomic i256, i256* %ptr unordered, align 16
+  ret i256 %result
+}
+
+define i256 @atomic_load256_libcall_as1(i256 addrspace(1)* %ptr) nounwind {
+; CHECK-LABEL: @atomic_load256_libcall_as1(
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i256 addrspace(1)* [[PTR:%.*]] to i8 addrspace(1)*
+; CHECK-NEXT:    [[TMP2:%.*]] = addrspacecast i8 addrspace(1)* [[TMP1]] to i8*
+; CHECK-NEXT:    [[TMP3:%.*]] = alloca i256, align 8
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i256* [[TMP3]] to i8*
+; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 32, i8* [[TMP4]])
+; CHECK-NEXT:    call void @__atomic_load(i64 32, i8* [[TMP2]], i8* [[TMP4]], i32 0)
+; CHECK-NEXT:    [[TMP5:%.*]] = load i256, i256* [[TMP3]], align 8
+; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 32, i8* [[TMP4]])
+; CHECK-NEXT:    ret i256 [[TMP5]]
+;
+  %result = load atomic i256, i256 addrspace(1)* %ptr unordered, align 16
+  ret i256 %result
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,167 @@
+; RUN: opt -S %s -atomic-expand -mtriple=x86_64-linux-gnu | FileCheck %s
+
+; This file tests the functions `llvm::convertAtomicLoadToIntegerType` and
+; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this 
+; functionality, please move this test to a target which still is.
+
+define float @float_load_expand(float* %ptr) {
+; CHECK-LABEL: @float_load_expand
+; CHECK: %1 = bitcast float* %ptr to i32*
+; CHECK: %2 = load atomic i32, i32* %1 unordered, align 4
+; CHECK: %3 = bitcast i32 %2 to float
+; CHECK: ret float %3
+  %res = load atomic float, float* %ptr unordered, align 4
+  ret float %res
+}
+
+define float @float_load_expand_seq_cst(float* %ptr) {
+; CHECK-LABEL: @float_load_expand_seq_cst
+; CHECK: %1 = bitcast float* %ptr to i32*
+; CHECK: %2 = load atomic i32, i32* %1 seq_cst, align 4
+; CHECK: %3 = bitcast i32 %2 to float
+; CHECK: ret float %3
+  %res = load atomic float, float* %ptr seq_cst, align 4
+  ret float %res
+}
+
+define float @float_load_expand_vol(float* %ptr) {
+; CHECK-LABEL: @float_load_expand_vol
+; CHECK: %1 = bitcast float* %ptr to i32*
+; CHECK: %2 = load atomic volatile i32, i32* %1 unordered, align 4
+; CHECK: %3 = bitcast i32 %2 to float
+; CHECK: ret float %3
+  %res = load atomic volatile float, float* %ptr unordered, align 4
+  ret float %res
+}
+
+define float @float_load_expand_addr1(float addrspace(1)* %ptr) {
+; CHECK-LABEL: @float_load_expand_addr1
+; CHECK: %1 = bitcast float addrspace(1)* %ptr to i32 addrspace(1)*
+; CHECK: %2 = load atomic i32, i32 addrspace(1)* %1 unordered, align 4
+; CHECK: %3 = bitcast i32 %2 to float
+; CHECK: ret float %3
+  %res = load atomic float, float addrspace(1)* %ptr unordered, align 4
+  ret float %res
+}
+
+define void @float_store_expand(float* %ptr, float %v) {
+; CHECK-LABEL: @float_store_expand
+; CHECK: %1 = bitcast float %v to i32
+; CHECK: %2 = bitcast float* %ptr to i32*
+; CHECK: store atomic i32 %1, i32* %2 unordered, align 4
+  store atomic float %v, float* %ptr unordered, align 4
+  ret void
+}
+
+define void @float_store_expand_seq_cst(float* %ptr, float %v) {
+; CHECK-LABEL: @float_store_expand_seq_cst
+; CHECK: %1 = bitcast float %v to i32
+; CHECK: %2 = bitcast float* %ptr to i32*
+; CHECK: store atomic i32 %1, i32* %2 seq_cst, align 4
+  store atomic float %v, float* %ptr seq_cst, align 4
+  ret void
+}
+
+define void @float_store_expand_vol(float* %ptr, float %v) {
+; CHECK-LABEL: @float_store_expand_vol
+; CHECK: %1 = bitcast float %v to i32
+; CHECK: %2 = bitcast float* %ptr to i32*
+; CHECK: store atomic volatile i32 %1, i32* %2 unordered, align 4
+  store atomic volatile float %v, float* %ptr unordered, align 4
+  ret void
+}
+
+define void @float_store_expand_addr1(float addrspace(1)* %ptr, float %v) {
+; CHECK-LABEL: @float_store_expand_addr1
+; CHECK: %1 = bitcast float %v to i32
+; CHECK: %2 = bitcast float addrspace(1)* %ptr to i32 addrspace(1)*
+; CHECK: store atomic i32 %1, i32 addrspace(1)* %2 unordered, align 4
+  store atomic float %v, float addrspace(1)* %ptr unordered, align 4
+  ret void
+}
+
+define void @pointer_cmpxchg_expand(i8** %ptr, i8* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand
+; CHECK: %1 = bitcast i8** %ptr to i64*
+; CHECK: %2 = ptrtoint i8* %v to i64
+; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 seq_cst monotonic
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8*
+; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0
+; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1
+  cmpxchg i8** %ptr, i8* null, i8* %v seq_cst monotonic
+  ret void
+}
+
+define void @pointer_cmpxchg_expand2(i8** %ptr, i8* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand2
+; CHECK: %1 = bitcast i8** %ptr to i64*
+; CHECK: %2 = ptrtoint i8* %v to i64
+; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 release monotonic
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8*
+; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0
+; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1
+  cmpxchg i8** %ptr, i8* null, i8* %v release monotonic
+  ret void
+}
+
+define void @pointer_cmpxchg_expand3(i8** %ptr, i8* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand3
+; CHECK: %1 = bitcast i8** %ptr to i64*
+; CHECK: %2 = ptrtoint i8* %v to i64
+; CHECK: %3 = cmpxchg i64* %1, i64 0, i64 %2 seq_cst seq_cst
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8*
+; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0
+; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1
+  cmpxchg i8** %ptr, i8* null, i8* %v seq_cst seq_cst
+  ret void
+}
+
+define void @pointer_cmpxchg_expand4(i8** %ptr, i8* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand4
+; CHECK: %1 = bitcast i8** %ptr to i64*
+; CHECK: %2 = ptrtoint i8* %v to i64
+; CHECK: %3 = cmpxchg weak i64* %1, i64 0, i64 %2 seq_cst seq_cst
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8*
+; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0
+; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1
+  cmpxchg weak i8** %ptr, i8* null, i8* %v seq_cst seq_cst
+  ret void
+}
+
+define void @pointer_cmpxchg_expand5(i8** %ptr, i8* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand5
+; CHECK: %1 = bitcast i8** %ptr to i64*
+; CHECK: %2 = ptrtoint i8* %v to i64
+; CHECK: %3 = cmpxchg volatile i64* %1, i64 0, i64 %2 seq_cst seq_cst
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8*
+; CHECK: %7 = insertvalue { i8*, i1 } undef, i8* %6, 0
+; CHECK: %8 = insertvalue { i8*, i1 } %7, i1 %5, 1
+  cmpxchg volatile i8** %ptr, i8* null, i8* %v seq_cst seq_cst
+  ret void
+}
+
+define void @pointer_cmpxchg_expand6(i8 addrspace(2)* addrspace(1)* %ptr, 
+                                     i8 addrspace(2)* %v) {
+; CHECK-LABEL: @pointer_cmpxchg_expand6
+; CHECK: %1 = bitcast i8 addrspace(2)* addrspace(1)* %ptr to i64 addrspace(1)*
+; CHECK: %2 = ptrtoint i8 addrspace(2)* %v to i64
+; CHECK: %3 = cmpxchg i64 addrspace(1)* %1, i64 0, i64 %2 seq_cst seq_cst
+; CHECK: %4 = extractvalue { i64, i1 } %3, 0
+; CHECK: %5 = extractvalue { i64, i1 } %3, 1
+; CHECK: %6 = inttoptr i64 %4 to i8 addrspace(2)*
+; CHECK: %7 = insertvalue { i8 addrspace(2)*, i1 } undef, i8 addrspace(2)* %6, 0
+; CHECK: %8 = insertvalue { i8 addrspace(2)*, i1 } %7, i1 %5, 1
+  cmpxchg i8 addrspace(2)* addrspace(1)* %ptr, i8 addrspace(2)* null, i8 addrspace(2)* %v seq_cst seq_cst
+  ret void
+}
+

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,112 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=i686-linux-gnu -atomic-expand %s | FileCheck %s
+
+define float @test_atomicrmw_fadd_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define double @test_atomicrmw_fadd_f64(double* %ptr, double %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f64(
+; CHECK-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd double [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fadd double* %ptr, double %value seq_cst
+  ret double %res
+}
+
+define float @test_atomicrmw_fadd_f32_as1(float addrspace(1)* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fadd_f32_as1(
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float addrspace(1)* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float addrspace(1)* [[PTR]] to i32 addrspace(1)*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32 addrspace(1)* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fadd float addrspace(1)* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define float @test_atomicrmw_fsub_f32(float* %ptr, float %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f32(
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float* [[PTR]] to i32*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float [[NEW]] to i32
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast float [[LOADED]] to i32
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i32* [[TMP2]], i32 [[TMP4]], i32 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i32 [[NEWLOADED]] to float
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret float [[TMP6]]
+;
+  %res = atomicrmw fsub float* %ptr, float %value seq_cst
+  ret float %res
+}
+
+define double @test_atomicrmw_fsub_f64(double* %ptr, double %value) {
+; CHECK-LABEL: @test_atomicrmw_fsub_f64(
+; CHECK-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP6:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[NEW:%.*]] = fsub double [[LOADED]], [[VALUE:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double [[NEW]] to i64
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast double [[LOADED]] to i64
+; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP4]], i64 [[TMP3]] seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP5]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP5]], 0
+; CHECK-NEXT:    [[TMP6]] = bitcast i64 [[NEWLOADED]] to double
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret double [[TMP6]]
+;
+  %res = atomicrmw fsub double* %ptr, double %value seq_cst
+  ret double %res
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-rmw-initial-load.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,11 @@
+; RUN: opt -S %s -atomic-expand -mtriple=i686-linux-gnu | FileCheck %s
+
+; This file tests the function `llvm::expandAtomicRMWToCmpXchg`.
+; It isn't technically target specific, but is exposed through a pass that is.
+
+define i8 @test_initial_load(i8* %ptr, i8 %value) {
+  %res = atomicrmw nand i8* %ptr, i8 %value seq_cst
+  ret i8 %res
+}
+; CHECK-LABEL: @test_initial_load
+; CHECK-NEXT:    %1 = load i8, i8* %ptr, align 1

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-xchg-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-xchg-fp.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-xchg-fp.ll (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/expand-atomic-xchg-fp.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=i686-linux-gnu -atomic-expand %s | FileCheck %s
+
+define double @atomic_xchg_f64(double* %ptr) nounwind {
+; CHECK-LABEL: @atomic_xchg_f64(
+; CHECK-NEXT:    [[TMP1:%.*]] = load double, double* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double* [[PTR]] to i64*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double [[LOADED]] to i64
+; CHECK-NEXT:    [[TMP4:%.*]] = cmpxchg i64* [[TMP2]], i64 [[TMP3]], i64 4616189618054758400 seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0
+; CHECK-NEXT:    [[TMP5]] = bitcast i64 [[NEWLOADED]] to double
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret double [[TMP5]]
+;
+  %result = atomicrmw xchg double* %ptr, double 4.0 seq_cst
+  ret double %result
+}
+
+define double @atomic_xchg_f64_as1(double addrspace(1)* %ptr) nounwind {
+; CHECK-LABEL: @atomic_xchg_f64_as1(
+; CHECK-NEXT:    [[TMP1:%.*]] = load double, double addrspace(1)* [[PTR:%.*]], align 8
+; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
+; CHECK:       atomicrmw.start:
+; CHECK-NEXT:    [[LOADED:%.*]] = phi double [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double addrspace(1)* [[PTR]] to i64 addrspace(1)*
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double [[LOADED]] to i64
+; CHECK-NEXT:    [[TMP4:%.*]] = cmpxchg i64 addrspace(1)* [[TMP2]], i64 [[TMP3]], i64 4616189618054758400 seq_cst seq_cst
+; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP4]], 1
+; CHECK-NEXT:    [[NEWLOADED:%.*]] = extractvalue { i64, i1 } [[TMP4]], 0
+; CHECK-NEXT:    [[TMP5]] = bitcast i64 [[NEWLOADED]] to double
+; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
+; CHECK:       atomicrmw.end:
+; CHECK-NEXT:    ret double [[TMP5]]
+;
+  %result = atomicrmw xchg double addrspace(1)* %ptr, double 4.0 seq_cst
+  ret double %result
+}

Added: llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/AtomicExpand/X86/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,2 @@
+if not 'X86' in config.root.targets:
+  config.unsupported = True

Added: llvm/trunk/test/Transforms/BDCE/basic.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/basic.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/basic.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/basic.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,397 @@
+; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s
+; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO
+; RUN: opt -S -debugify -bdce < %s | FileCheck %s -check-prefix=DEBUGIFY
+target datalayout = "E-m:e-i64:64-n32:64"
+target triple = "powerpc64-unknown-linux-gnu"
+
+; Function Attrs: nounwind readnone
+define signext i32 @bar(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 4
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 8
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %shr = ashr i32 %or15, 4
+  ret i32 %shr
+
+; CHECK-LABEL: @bar
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+
+; Check that instsimplify is not doing this all on its own.
+; CHECK-IO-LABEL: @bar
+; CHECK-IO: tail call signext i32 @foo(i32 signext 5)
+; CHECK-IO: tail call signext i32 @foo(i32 signext 3)
+; CHECK-IO: tail call signext i32 @foo(i32 signext 2)
+; CHECK-IO: tail call signext i32 @foo(i32 signext 1)
+; CHECK-IO: tail call signext i32 @foo(i32 signext 0)
+; CHECK-IO: tail call signext i32 @foo(i32 signext 4)
+; CHECK-IO: ret i32
+}
+
+; Function Attrs: nounwind readnone
+declare signext i32 @foo(i32 signext) #0
+
+; Function Attrs: nounwind readnone
+define signext i32 @far(i32 signext %x) #1 {
+entry:
+  %call = tail call signext i32 @goo(i32 signext 5) #1
+  %and = and i32 %call, 4
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @goo(i32 signext 3) #1
+  %and2 = and i32 %call1, 8
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @goo(i32 signext 2) #1
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @goo(i32 signext 1) #1
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @goo(i32 signext 0) #1
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @goo(i32 signext 4) #1
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %shr = ashr i32 %or15, 4
+  ret i32 %shr
+
+; CHECK-LABEL: @far
+; Calls to foo(5) and foo(3) are still there, but their results are not used.
+; CHECK: tail call signext i32 @goo(i32 signext 5)
+; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3)
+; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2)
+; CHECK: tail call signext i32 @goo(i32 signext 1)
+; CHECK: tail call signext i32 @goo(i32 signext 0)
+; CHECK: tail call signext i32 @goo(i32 signext 4)
+; CHECK: ret i32
+
+; Check that instsimplify is not doing this all on its own.
+; CHECK-IO-LABEL: @far
+; CHECK-IO: tail call signext i32 @goo(i32 signext 5)
+; CHECK-IO: tail call signext i32 @goo(i32 signext 3)
+; CHECK-IO: tail call signext i32 @goo(i32 signext 2)
+; CHECK-IO: tail call signext i32 @goo(i32 signext 1)
+; CHECK-IO: tail call signext i32 @goo(i32 signext 0)
+; CHECK-IO: tail call signext i32 @goo(i32 signext 4)
+; CHECK-IO: ret i32
+}
+
+declare signext i32 @goo(i32 signext) #1
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar1(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0
+  %shr = ashr i32 %bs, 4
+  ret i32 %shr
+
+; CHECK-LABEL: @tar1
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+declare i32 @llvm.bswap.i32(i32) #0
+
+; Function Attrs: nounwind readnone
+define signext i32 @tim(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 536870912
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 1073741824
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %bs = tail call i32 @llvm.bitreverse.i32(i32 %or15) #0
+  %shr = ashr i32 %bs, 4
+  ret i32 %shr
+
+; CHECK-LABEL: @tim
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+declare i32 @llvm.bitreverse.i32(i32) #0
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar2(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %shl = shl i32 %or15, 10
+  ret i32 %shl
+
+; CHECK-LABEL: @tar2
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar3(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %add = add i32 %or15, 5
+  %shl = shl i32 %add, 10
+  ret i32 %shl
+
+; CHECK-LABEL: @tar3
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar4(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %sub = sub i32 %or15, 5
+  %shl = shl i32 %sub, 10
+  ret i32 %shl
+
+; CHECK-LABEL: @tar4
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar5(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %xor = xor i32 %or15, 5
+  %shl = shl i32 %xor, 10
+  ret i32 %shl
+
+; CHECK-LABEL: @tar5
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+define signext i32 @tar7(i32 signext %x, i1 %b) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %v = select i1 %b, i32 %or15, i32 5
+  %shl = shl i32 %v, 10
+  ret i32 %shl
+
+; CHECK-LABEL: @tar7
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i32
+}
+
+; Function Attrs: nounwind readnone
+define signext i16 @tar8(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+  %or = or i32 %and, %x
+  %call1 = tail call signext i32 @foo(i32 signext 3) #0
+  %and2 = and i32 %call1, 67108864
+  %or3 = or i32 %or, %and2
+  %call4 = tail call signext i32 @foo(i32 signext 2) #0
+  %and5 = and i32 %call4, 16
+  %or6 = or i32 %or3, %and5
+  %call7 = tail call signext i32 @foo(i32 signext 1) #0
+  %and8 = and i32 %call7, 32
+  %or9 = or i32 %or6, %and8
+  %call10 = tail call signext i32 @foo(i32 signext 0) #0
+  %and11 = and i32 %call10, 64
+  %or12 = or i32 %or9, %and11
+  %call13 = tail call signext i32 @foo(i32 signext 4) #0
+  %and14 = and i32 %call13, 128
+  %or15 = or i32 %or12, %and14
+  %tr = trunc i32 %or15 to i16
+  ret i16 %tr
+
+; CHECK-LABEL: @tar8
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 5)
+; CHECK-NOT: tail call signext i32 @foo(i32 signext 3)
+; CHECK: tail call signext i32 @foo(i32 signext 2)
+; CHECK: tail call signext i32 @foo(i32 signext 1)
+; CHECK: tail call signext i32 @foo(i32 signext 0)
+; CHECK: tail call signext i32 @foo(i32 signext 4)
+; CHECK: ret i16
+}
+
+; DEBUGIFY-LABEL: @tar9
+define signext i16 @tar9(i32 signext %x) #0 {
+entry:
+  %call = tail call signext i32 @foo(i32 signext 5) #0
+  %and = and i32 %call, 33554432
+; DEBUGIFY: call void @llvm.dbg.value(metadata i32 %call, metadata {{.*}}, metadata !DIExpression(DW_OP_constu, 33554432, DW_OP_and, DW_OP_stack_value))
+  %cast = trunc i32 %call to i16
+  ret i16 %cast
+}
+
+attributes #0 = { nounwind readnone }
+attributes #1 = { nounwind }
+

Added: llvm/trunk/test/Transforms/BDCE/dbg-multipleuses.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/dbg-multipleuses.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/dbg-multipleuses.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/dbg-multipleuses.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,47 @@
+; Test that BDCE doesn't destroy llvm.dbg.value's argument.
+; RUN: opt -bdce %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"
+
+; CHECK: define void @f()
+; CHECK-NEXT: entry:
+; CHECK-NEXT: tail call void (...) @h()
+; CHECK-NEXT: %[[CALL:.*]] = tail call i32 (...) @g()
+; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 %[[CALL:.*]]
+
+define void @f() !dbg !6 {
+entry:
+  tail call void (...) @h(), !dbg !9
+  %call = tail call i32 (...) @g(), !dbg !10
+  tail call void @llvm.dbg.value(metadata i32 %call, metadata !11, metadata !13), !dbg !14
+  %patatino = xor i32 %call, %call
+  tail call void (...) @h(), !dbg !15
+  ret void, !dbg !16
+}
+
+declare void @h(...)
+declare i32 @g(...)
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+!llvm.ident = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 288665) (llvm/trunk 288725)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "patatino.c", directory: "/home/davide/work/llvm/build-clang/bin")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{!"clang version 4.0.0 (trunk 288665) (llvm/trunk 288725)"}
+!6 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type: !7, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: false, unit: !0, retainedNodes: !2)
+!7 = !DISubroutineType(types: !8)
+!8 = !{null}
+!9 = !DILocation(line: 4, column: 3, scope: !6)
+!10 = !DILocation(line: 5, column: 11, scope: !6)
+!11 = !DILocalVariable(name: "a", scope: !6, file: !1, line: 5, type: !12)
+!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!13 = !DIExpression()
+!14 = !DILocation(line: 5, column: 7, scope: !6)
+!15 = !DILocation(line: 6, column: 3, scope: !6)
+!16 = !DILocation(line: 7, column: 1, scope: !6)

Added: llvm/trunk/test/Transforms/BDCE/dce-pure.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/dce-pure.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/dce-pure.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/dce-pure.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,34 @@
+; RUN: opt -bdce -S < %s | FileCheck %s
+; RUN: opt -passes=bdce -S < %s | FileCheck %s
+
+declare i32 @strlen(i8*) readonly nounwind
+
+define void @test1() {
+  call i32 @strlen( i8* null )
+  ret void
+
+; CHECK-LABEL: @test1
+; CHECK-NOT: call
+; CHECK: ret void
+}
+
+define i32 @test2() personality i32 (...)* @__gxx_personality_v0 {
+  ; invoke of pure function should not be deleted!
+  invoke i32 @strlen( i8* null ) readnone
+                  to label %Cont unwind label %Other
+
+Cont:           ; preds = %0
+  ret i32 0
+
+Other:          ; preds = %0
+   %exn = landingpad {i8*, i32}
+            cleanup
+  ret i32 1
+
+; CHECK-LABEL: @test2
+; CHECK: invoke
+; CHECK: ret i32 1
+}
+
+declare i32 @__gxx_personality_v0(...)
+

Added: llvm/trunk/test/Transforms/BDCE/dead-uses.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/dead-uses.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/dead-uses.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/dead-uses.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,103 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -bdce -S < %s | FileCheck %s
+
+; Funnel shift based rotate test cases from PR39771
+
+declare i32 @llvm.fshr.i32(i32, i32, i32)
+declare <2 x i32> @llvm.fshr.v2i32(<2 x i32>, <2 x i32>, <2 x i32>)
+
+; First fshr operand is dead.
+define i32 @pr39771_fshr_multi_use_instr(i32 %a) {
+; CHECK-LABEL: @pr39771_fshr_multi_use_instr(
+; CHECK-NEXT:    [[X:%.*]] = or i32 [[A:%.*]], 0
+; CHECK-NEXT:    [[B:%.*]] = tail call i32 @llvm.fshr.i32(i32 0, i32 [[X]], i32 1)
+; CHECK-NEXT:    [[C:%.*]] = lshr i32 [[B]], 23
+; CHECK-NEXT:    [[D:%.*]] = xor i32 [[C]], [[B]]
+; CHECK-NEXT:    [[E:%.*]] = and i32 [[D]], 31
+; CHECK-NEXT:    ret i32 [[E]]
+;
+  %x = or i32 %a, 0
+  %b = tail call i32 @llvm.fshr.i32(i32 %x, i32 %x, i32 1)
+  %c = lshr i32 %b, 23
+  %d = xor i32 %c, %b
+  %e = and i32 %d, 31
+  ret i32 %e
+}
+
+; First fshr operand is dead (vector variant).
+define <2 x i32> @pr39771_fshr_multi_use_instr_vec(<2 x i32> %a) {
+; CHECK-LABEL: @pr39771_fshr_multi_use_instr_vec(
+; CHECK-NEXT:    [[X:%.*]] = or <2 x i32> [[A:%.*]], zeroinitializer
+; CHECK-NEXT:    [[B:%.*]] = tail call <2 x i32> @llvm.fshr.v2i32(<2 x i32> zeroinitializer, <2 x i32> [[X]], <2 x i32> <i32 1, i32 1>)
+; CHECK-NEXT:    [[C:%.*]] = lshr <2 x i32> [[B]], <i32 23, i32 23>
+; CHECK-NEXT:    [[D:%.*]] = xor <2 x i32> [[C]], [[B]]
+; CHECK-NEXT:    [[E:%.*]] = and <2 x i32> [[D]], <i32 31, i32 31>
+; CHECK-NEXT:    ret <2 x i32> [[E]]
+;
+  %x = or <2 x i32> %a, zeroinitializer
+  %b = tail call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %x, <2 x i32> <i32 1, i32 1>)
+  %c = lshr <2 x i32> %b, <i32 23, i32 23>
+  %d = xor <2 x i32> %c, %b
+  %e = and <2 x i32> %d, <i32 31, i32 31>
+  ret <2 x i32> %e
+}
+
+; First fshr operand is dead, but it comes from an argument, not instruction.
+define i32 @pr39771_fshr_multi_use_arg(i32 %a) {
+; CHECK-LABEL: @pr39771_fshr_multi_use_arg(
+; CHECK-NEXT:    [[B:%.*]] = tail call i32 @llvm.fshr.i32(i32 0, i32 [[A:%.*]], i32 1)
+; CHECK-NEXT:    [[C:%.*]] = lshr i32 [[B]], 23
+; CHECK-NEXT:    [[D:%.*]] = xor i32 [[C]], [[B]]
+; CHECK-NEXT:    [[E:%.*]] = and i32 [[D]], 31
+; CHECK-NEXT:    ret i32 [[E]]
+;
+  %b = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 1)
+  %c = lshr i32 %b, 23
+  %d = xor i32 %c, %b
+  %e = and i32 %d, 31
+  ret i32 %e
+}
+
+define i32 @pr39771_expanded_fshr_multi_use(i32 %a) {
+; CHECK-LABEL: @pr39771_expanded_fshr_multi_use(
+; CHECK-NEXT:    [[TMP:%.*]] = lshr i32 [[A:%.*]], 1
+; CHECK-NEXT:    [[TMP2:%.*]] = shl i32 0, 31
+; CHECK-NEXT:    [[B:%.*]] = or i32 [[TMP]], [[TMP2]]
+; CHECK-NEXT:    [[C:%.*]] = lshr i32 [[B]], 23
+; CHECK-NEXT:    [[D:%.*]] = xor i32 [[C]], [[B]]
+; CHECK-NEXT:    [[E:%.*]] = and i32 [[D]], 31
+; CHECK-NEXT:    ret i32 [[E]]
+;
+  %tmp = lshr i32 %a, 1
+  %tmp2 = shl i32 %a, 31
+  %b = or i32 %tmp, %tmp2
+  %c = lshr i32 %b, 23
+  %d = xor i32 %c, %b
+  %e = and i32 %d, 31
+  ret i32 %e
+}
+
+; %b operand of %c will be dead initially, but later found live.
+define void @dead_use_invalidation(i32 %a) {
+; CHECK-LABEL: @dead_use_invalidation(
+; CHECK-NEXT:    [[B:%.*]] = or i32 [[A:%.*]], 0
+; CHECK-NEXT:    [[C:%.*]] = shl i32 [[B]], 31
+; CHECK-NEXT:    [[D:%.*]] = and i32 [[C]], 1
+; CHECK-NEXT:    [[E:%.*]] = or i32 [[C]], 0
+; CHECK-NEXT:    [[F:%.*]] = or i32 [[D]], 0
+; CHECK-NEXT:    call void @dummy(i32 [[E]])
+; CHECK-NEXT:    call void @dummy(i32 [[F]])
+; CHECK-NEXT:    call void @dummy(i32 [[B]])
+; CHECK-NEXT:    ret void
+;
+  %b = or i32 %a, 0
+  %c = shl i32 %b, 31
+  %d = and i32 %c, 1
+  %e = or i32 %c, 0
+  %f = or i32 %d, 0
+  call void @dummy(i32 %e)
+  call void @dummy(i32 %f)
+  call void @dummy(i32 %b)
+  ret void
+}
+declare void @dummy(i32)

Added: llvm/trunk/test/Transforms/BDCE/dead-void-ro.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/dead-void-ro.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/dead-void-ro.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/dead-void-ro.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,18 @@
+; RUN: opt -S -bdce < %s | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @PR34211(i16* %p) {
+; CHECK-LABEL: @PR34211
+  %not_demanded_but_not_dead = load volatile i16, i16* %p
+  call void @no_side_effects_so_dead(i16 %not_demanded_but_not_dead)
+  ret void
+
+; CHECK: %not_demanded_but_not_dead = load volatile i16, i16* %p
+; CHECK-NEXT: ret void
+}
+
+declare void @no_side_effects_so_dead(i16) #0
+
+attributes #0 = { nounwind readnone }
+

Added: llvm/trunk/test/Transforms/BDCE/invalidate-assumptions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/invalidate-assumptions.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/invalidate-assumptions.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/invalidate-assumptions.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,95 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -bdce %s -S | FileCheck %s
+
+; The 'nuw' on the subtract allows us to deduce that %setbit is not demanded.
+; But if we change that value to '0', then the 'nuw' is no longer valid. If we don't
+; remove the 'nuw', another pass (-instcombine) may make a transform based on an
+; that incorrect assumption and we can miscompile:
+; https://bugs.llvm.org/show_bug.cgi?id=33695
+
+define i1 @PR33695(i1 %b, i8 %x) {
+; CHECK-LABEL: @PR33695(
+; CHECK-NEXT:    [[LITTLE_NUMBER:%.*]] = zext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[BIG_NUMBER:%.*]] = shl i8 0, 1
+; CHECK-NEXT:    [[SUB:%.*]] = sub i8 [[BIG_NUMBER]], [[LITTLE_NUMBER]]
+; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i8 [[SUB]] to i1
+; CHECK-NEXT:    ret i1 [[TRUNC]]
+;
+  %setbit = or i8 %x, 64
+  %little_number = zext i1 %b to i8
+  %big_number = shl i8 %setbit, 1
+  %sub = sub nuw i8 %big_number, %little_number
+  %trunc = trunc i8 %sub to i1
+  ret i1 %trunc
+}
+
+; Similar to above, but now with more no-wrap.
+; https://bugs.llvm.org/show_bug.cgi?id=34037
+
+define i64 @PR34037(i64 %m, i32 %r, i64 %j, i1 %b, i32 %k, i64 %p) {
+; CHECK-LABEL: @PR34037(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i64 0, 29
+; CHECK-NEXT:    [[CONV1:%.*]] = select i1 [[B:%.*]], i64 7, i64 0
+; CHECK-NEXT:    [[SUB:%.*]] = sub i64 [[SHL]], [[CONV1]]
+; CHECK-NEXT:    [[CONV2:%.*]] = zext i32 [[K:%.*]] to i64
+; CHECK-NEXT:    [[MUL:%.*]] = mul i64 [[SUB]], [[CONV2]]
+; CHECK-NEXT:    [[CONV4:%.*]] = and i64 [[P:%.*]], 65535
+; CHECK-NEXT:    [[AND5:%.*]] = and i64 [[MUL]], [[CONV4]]
+; CHECK-NEXT:    ret i64 [[AND5]]
+;
+  %conv = zext i32 %r to i64
+  %and = and i64 %m, %conv
+  %neg = xor i64 %and, 34359738367
+  %or = or i64 %j, %neg
+  %shl = shl i64 %or, 29
+  %conv1 = select i1 %b, i64 7, i64 0
+  %sub = sub nuw nsw i64 %shl, %conv1
+  %conv2 = zext i32 %k to i64
+  %mul = mul nsw i64 %sub, %conv2
+  %conv4 = and i64 %p, 65535
+  %and5 = and i64 %mul, %conv4
+  ret i64 %and5
+}
+
+; This is a manufactured example based on the 1st test to prove that the
+; assumption-killing algorithm stops at the call. Ie, it does not remove
+; nsw/nuw from the 'add' because a call demands all bits of its argument.
+
+declare i1 @foo(i1)
+
+define i1 @poison_on_call_user_is_ok(i1 %b, i8 %x) {
+; CHECK-LABEL: @poison_on_call_user_is_ok(
+; CHECK-NEXT:    [[LITTLE_NUMBER:%.*]] = zext i1 [[B:%.*]] to i8
+; CHECK-NEXT:    [[BIG_NUMBER:%.*]] = shl i8 0, 1
+; CHECK-NEXT:    [[SUB:%.*]] = sub i8 [[BIG_NUMBER]], [[LITTLE_NUMBER]]
+; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i8 [[SUB]] to i1
+; CHECK-NEXT:    [[CALL_RESULT:%.*]] = call i1 @foo(i1 [[TRUNC]])
+; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i1 [[CALL_RESULT]], true
+; CHECK-NEXT:    [[MUL:%.*]] = mul i1 [[TRUNC]], [[ADD]]
+; CHECK-NEXT:    ret i1 [[MUL]]
+;
+  %setbit = or i8 %x, 64
+  %little_number = zext i1 %b to i8
+  %big_number = shl i8 %setbit, 1
+  %sub = sub nuw i8 %big_number, %little_number
+  %trunc = trunc i8 %sub to i1
+  %call_result = call i1 @foo(i1 %trunc)
+  %add = add nsw nuw i1 %call_result, 1
+  %mul = mul i1 %trunc, %add
+  ret i1 %mul
+}
+
+
+; We were asserting that all users of a trivialized integer-type instruction were
+; also integer-typed, but that's too strong. The alloca has a pointer-type result.
+
+define void @PR34179(i32* %a) {
+; CHECK-LABEL: @PR34179(
+; CHECK-NEXT:    [[T0:%.*]] = load volatile i32, i32* [[A:%.*]]
+; CHECK-NEXT:    ret void
+;
+  %t0 = load volatile i32, i32* %a
+  %vla = alloca i32, i32 %t0
+  ret void
+}
+

Added: llvm/trunk/test/Transforms/BDCE/order.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/order.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/order.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/order.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,37 @@
+; RUN: opt -bdce -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"
+
+declare i32 @__gxx_personality_v0(...)
+
+define fastcc void @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+  br i1 undef, label %if.else, label %entry.if.end_crit_edge
+
+if.else:
+  ret void
+
+invoke.cont70:
+  store i32 %call71, i32* undef, align 4
+  br label %if.else
+
+; CHECK-LABEL: @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb
+; CHECK: store i32 %call71
+
+lpad65.loopexit.split-lp.loopexit.split-lp:
+  br label %if.else
+
+lpad65.loopexit.split-lp.loopexit.split-lp.loopexit:
+  %lpad.loopexit1121 = landingpad { i8*, i32 }
+          cleanup
+  br label %lpad65.loopexit.split-lp.loopexit.split-lp
+
+entry.if.end_crit_edge:
+  %call71 = invoke i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv()
+          to label %invoke.cont70 unwind label %lpad65.loopexit.split-lp.loopexit.split-lp.loopexit
+}
+
+declare i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv()
+
+attributes #0 = { uwtable }
+

Added: llvm/trunk/test/Transforms/BDCE/pr26587.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/pr26587.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/pr26587.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/pr26587.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,46 @@
+; Test that BDCE doesn't destroy llvm.dbg.value's argument.
+; RUN: opt -bdce %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"
+
+; CHECK: define void @f()
+; CHECK-NEXT: entry:
+; CHECK-NEXT: tail call void (...) @h()
+; CHECK-NEXT: %[[CALL:.*]] = tail call i32 (...) @g()
+; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 %[[CALL:.*]]
+
+define void @f() !dbg !6 {
+entry:
+  tail call void (...) @h(), !dbg !9
+  %call = tail call i32 (...) @g(), !dbg !10
+  tail call void @llvm.dbg.value(metadata i32 %call, metadata !11, metadata !13), !dbg !14
+  tail call void (...) @h(), !dbg !15
+  ret void, !dbg !16
+}
+
+declare void @h(...)
+declare i32 @g(...)
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+!llvm.ident = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 288665) (llvm/trunk 288725)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "patatino.c", directory: "/home/davide/work/llvm/build-clang/bin")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{!"clang version 4.0.0 (trunk 288665) (llvm/trunk 288725)"}
+!6 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type: !7, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: false, unit: !0, retainedNodes: !2)
+!7 = !DISubroutineType(types: !8)
+!8 = !{null}
+!9 = !DILocation(line: 4, column: 3, scope: !6)
+!10 = !DILocation(line: 5, column: 11, scope: !6)
+!11 = !DILocalVariable(name: "a", scope: !6, file: !1, line: 5, type: !12)
+!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!13 = !DIExpression()
+!14 = !DILocation(line: 5, column: 7, scope: !6)
+!15 = !DILocation(line: 6, column: 3, scope: !6)
+!16 = !DILocation(line: 7, column: 1, scope: !6)

Added: llvm/trunk/test/Transforms/BDCE/vectors.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/vectors.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/vectors.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/vectors.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,102 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -bdce < %s | FileCheck %s
+
+; BDCE applied to integer vectors.
+
+define <2 x i32> @test_basic(<2 x i32> %a, <2 x i32> %b) {
+; CHECK-LABEL: @test_basic(
+; CHECK-NEXT:    [[A3:%.*]] = and <2 x i32> zeroinitializer, <i32 4, i32 4>
+; CHECK-NEXT:    [[B2:%.*]] = add <2 x i32> [[B:%.*]], <i32 1, i32 1>
+; CHECK-NEXT:    [[B3:%.*]] = and <2 x i32> [[B2]], <i32 8, i32 8>
+; CHECK-NEXT:    [[C:%.*]] = or <2 x i32> [[A3]], [[B3]]
+; CHECK-NEXT:    [[D:%.*]] = ashr <2 x i32> [[C]], <i32 3, i32 3>
+; CHECK-NEXT:    ret <2 x i32> [[D]]
+;
+  %a2 = add <2 x i32> %a, <i32 1, i32 1>
+  %a3 = and <2 x i32> %a2, <i32 4, i32 4>
+  %b2 = add <2 x i32> %b, <i32 1, i32 1>
+  %b3 = and <2 x i32> %b2, <i32 8, i32 8>
+  %c = or <2 x i32> %a3, %b3
+  %d = ashr <2 x i32> %c, <i32 3, i32 3>
+  ret <2 x i32> %d
+}
+
+; Going vector -> scalar
+define i32 @test_extractelement(<2 x i32> %a, <2 x i32> %b) {
+; CHECK-LABEL: @test_extractelement(
+; CHECK-NEXT:    [[A3:%.*]] = and <2 x i32> zeroinitializer, <i32 4, i32 4>
+; CHECK-NEXT:    [[B2:%.*]] = add <2 x i32> [[B:%.*]], <i32 1, i32 1>
+; CHECK-NEXT:    [[B3:%.*]] = and <2 x i32> [[B2]], <i32 8, i32 8>
+; CHECK-NEXT:    [[C:%.*]] = or <2 x i32> [[A3]], [[B3]]
+; CHECK-NEXT:    [[D:%.*]] = extractelement <2 x i32> [[C]], i32 0
+; CHECK-NEXT:    [[E:%.*]] = ashr i32 [[D]], 3
+; CHECK-NEXT:    ret i32 [[E]]
+;
+  %a2 = add <2 x i32> %a, <i32 1, i32 1>
+  %a3 = and <2 x i32> %a2, <i32 4, i32 4>
+  %b2 = add <2 x i32> %b, <i32 1, i32 1>
+  %b3 = and <2 x i32> %b2, <i32 8, i32 8>
+  %c = or <2 x i32> %a3, %b3
+  %d = extractelement <2 x i32> %c, i32 0
+  %e = ashr i32 %d, 3
+  ret i32 %e
+}
+
+; Going scalar -> vector
+define <2 x i32> @test_insertelement(i32 %a, i32 %b) {
+; CHECK-LABEL: @test_insertelement(
+; CHECK-NEXT:    [[X3:%.*]] = and <2 x i32> zeroinitializer, <i32 4, i32 4>
+; CHECK-NEXT:    [[Y:%.*]] = insertelement <2 x i32> undef, i32 [[B:%.*]], i32 0
+; CHECK-NEXT:    [[Y2:%.*]] = insertelement <2 x i32> [[Y]], i32 [[A:%.*]], i32 1
+; CHECK-NEXT:    [[Y3:%.*]] = and <2 x i32> [[Y2]], <i32 8, i32 8>
+; CHECK-NEXT:    [[Z:%.*]] = or <2 x i32> [[X3]], [[Y3]]
+; CHECK-NEXT:    [[U:%.*]] = ashr <2 x i32> [[Z]], <i32 3, i32 3>
+; CHECK-NEXT:    ret <2 x i32> [[U]]
+;
+  %x = insertelement <2 x i32> undef, i32 %a, i32 0
+  %x2 = insertelement <2 x i32> %x, i32 %b, i32 1
+  %x3 = and <2 x i32> %x2, <i32 4, i32 4>
+  %y = insertelement <2 x i32> undef, i32 %b, i32 0
+  %y2 = insertelement <2 x i32> %y, i32 %a, i32 1
+  %y3 = and <2 x i32> %y2, <i32 8, i32 8>
+  %z = or <2 x i32> %x3, %y3
+  %u = ashr <2 x i32> %z, <i32 3, i32 3>
+  ret <2 x i32> %u
+}
+
+; Some non-int vectors and conversions
+define <2 x i32> @test_conversion(<2 x i32> %a) {
+; CHECK-LABEL: @test_conversion(
+; CHECK-NEXT:    [[A2:%.*]] = add <2 x i32> [[A:%.*]], <i32 1, i32 1>
+; CHECK-NEXT:    [[A3:%.*]] = and <2 x i32> [[A2]], <i32 2, i32 2>
+; CHECK-NEXT:    [[X:%.*]] = uitofp <2 x i32> [[A3]] to <2 x double>
+; CHECK-NEXT:    [[Y:%.*]] = fadd <2 x double> [[X]], <double 1.000000e+00, double 1.000000e+00>
+; CHECK-NEXT:    [[Z:%.*]] = fptoui <2 x double> [[Y]] to <2 x i32>
+; CHECK-NEXT:    [[U:%.*]] = ashr <2 x i32> [[Z]], <i32 3, i32 3>
+; CHECK-NEXT:    ret <2 x i32> [[U]]
+;
+  %a2 = add <2 x i32> %a, <i32 1, i32 1>
+  %a3 = and <2 x i32> %a2, <i32 2, i32 2>
+  %x = uitofp <2 x i32> %a3 to <2 x double>
+  %y = fadd <2 x double> %x, <double 1.0, double 1.0>
+  %z = fptoui <2 x double> %y to <2 x i32>
+  %u = ashr <2 x i32> %z, <i32 3, i32 3>
+  ret <2 x i32> %u
+}
+
+; Assumption invalidation (adapted from invalidate-assumptions.ll)
+define <2 x i1> @test_assumption_invalidation(<2 x i1> %b, <2 x i8> %x) {
+; CHECK-LABEL: @test_assumption_invalidation(
+; CHECK-NEXT:    [[LITTLE_NUMBER:%.*]] = zext <2 x i1> [[B:%.*]] to <2 x i8>
+; CHECK-NEXT:    [[BIG_NUMBER:%.*]] = shl <2 x i8> zeroinitializer, <i8 1, i8 1>
+; CHECK-NEXT:    [[SUB:%.*]] = sub <2 x i8> [[BIG_NUMBER]], [[LITTLE_NUMBER]]
+; CHECK-NEXT:    [[TRUNC:%.*]] = trunc <2 x i8> [[SUB]] to <2 x i1>
+; CHECK-NEXT:    ret <2 x i1> [[TRUNC]]
+;
+  %setbit = or <2 x i8> %x, <i8 64, i8 64>
+  %little_number = zext <2 x i1> %b to <2 x i8>
+  %big_number = shl <2 x i8> %setbit, <i8 1, i8 1>
+  %sub = sub nuw <2 x i8> %big_number, %little_number
+  %trunc = trunc <2 x i8> %sub to <2 x i1>
+  ret <2 x i1> %trunc
+}

Added: llvm/trunk/test/Transforms/BlockExtractor/extract-blocks.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BlockExtractor/extract-blocks.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BlockExtractor/extract-blocks.ll (added)
+++ llvm/trunk/test/Transforms/BlockExtractor/extract-blocks.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,43 @@
+; RUN: echo 'foo bb9' > %t
+; RUN: echo 'foo bb20' >> %t
+; RUN: opt -S -extract-blocks -extract-blocks-file=%t %s | FileCheck %s --check-prefix=CHECK-NO-ERASE
+; RUN: opt -S -extract-blocks -extract-blocks-file=%t -extract-blocks-erase-funcs %s | FileCheck %s --check-prefix=CHECK-ERASE
+
+; CHECK-NO-ERASE: @foo(
+; CHECK-NO-ERASE: @foo.bb9(
+; CHECK-NO-ERASE: @foo.bb20(
+; CHECK-ERASE: declare i32 @foo(
+; CHECK-ERASE: @foo.bb9(
+; CHECK-ERASE: @foo.bb20(
+define i32 @foo(i32 %arg, i32 %arg1) {
+bb:
+  %tmp5 = icmp sgt i32 %arg, 0
+  %tmp8 = icmp sgt i32 %arg1, 0
+  %or.cond = and i1 %tmp5, %tmp8
+  br i1 %or.cond, label %bb9, label %bb14
+
+bb9:                                              ; preds = %bb
+  %tmp12 = shl i32 %arg1, 2
+  %tmp13 = add nsw i32 %tmp12, %arg
+  br label %bb30
+
+bb14:                                             ; preds = %bb
+  %0 = and i32 %arg1, %arg
+  %1 = icmp slt i32 %0, 0
+  br i1 %1, label %bb20, label %bb26
+
+bb20:                                             ; preds = %bb14
+  %tmp22 = mul nsw i32 %arg, 3
+  %tmp24 = sdiv i32 %arg1, 6
+  %tmp25 = add nsw i32 %tmp24, %tmp22
+  br label %bb30
+
+bb26:                                             ; preds = %bb14
+  %tmp29 = sub nsw i32 %arg, %arg1
+  br label %bb30
+
+bb30:                                             ; preds = %bb26, %bb20, %bb9
+  %tmp.0 = phi i32 [ %tmp13, %bb9 ], [ %tmp25, %bb20 ], [ %tmp29, %bb26 ]
+  ret i32 %tmp.0
+}
+

Added: llvm/trunk/test/Transforms/BlockExtractor/invalid-block.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BlockExtractor/invalid-block.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BlockExtractor/invalid-block.ll (added)
+++ llvm/trunk/test/Transforms/BlockExtractor/invalid-block.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,9 @@
+; RUN: echo 'bar invalidbb' > %t
+; RUN: not opt -S -extract-blocks -extract-blocks-file=%t %s 2>&1 | FileCheck %s
+
+; CHECK: Invalid block
+define void @bar() {
+bb:
+  ret void
+}
+

Added: llvm/trunk/test/Transforms/BlockExtractor/invalid-function.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BlockExtractor/invalid-function.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BlockExtractor/invalid-function.ll (added)
+++ llvm/trunk/test/Transforms/BlockExtractor/invalid-function.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,9 @@
+; RUN: echo 'foo bb' > %t
+; RUN: not opt -S -extract-blocks -extract-blocks-file=%t %s 2>&1 | FileCheck %s
+
+; CHECK: Invalid function
+define void @bar() {
+bb:
+  ret void
+}
+

Added: llvm/trunk/test/Transforms/BranchFolding/2007-10-19-InlineAsmDirectives.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BranchFolding/2007-10-19-InlineAsmDirectives.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BranchFolding/2007-10-19-InlineAsmDirectives.ll (added)
+++ llvm/trunk/test/Transforms/BranchFolding/2007-10-19-InlineAsmDirectives.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt < %s -O3 | llc -no-integrated-as | FileCheck %s
+; REQUIRES: default_triple
+
+;; We don't want branch folding to fold asm directives.
+
+; CHECK: bork_directive
+; CHECK: bork_directive
+; CHECK-NOT: bork_directive
+
+define void @bork(i32 %param) {
+entry:
+	%tmp = icmp eq i32 %param, 0
+        br i1 %tmp, label %cond_true, label %cond_false
+
+cond_true:
+        call void asm sideeffect ".bork_directive /* ${0:c}:${1:c} */", "i,i,~{dirflag},~{fpsr},~{flags}"( i32 37, i32 927 )
+        ret void
+
+cond_false:
+	call void asm sideeffect ".foo_directive ${0:c}:${1:c}", "i,i,~{dirflag},~{fpsr},~{flags}"( i32 37, i32 927 )
+        call void asm sideeffect ".bork_directive /* ${0:c}:${1:c} */", "i,i,~{dirflag},~{fpsr},~{flags}"( i32 37, i32 927 )
+        ret void
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,253 @@
+; RUN: opt -S -callsite-splitting < %s | FileCheck --check-prefix=CHECK %s
+; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=0 < %s | FileCheck --check-prefix=NODUP %s
+
+; Instructions before a call that will be pushed to its predecessors
+; with uses after the callsite, must be patched up as PHI nodes in
+; the join block.
+define i32* @test_split_branch_phi(i32* %ptrarg, i32 %i) {
+Header:
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                    ; preds = %Header
+  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42
+  %0 = load i32, i32* %arrayidx, align 4
+  %tobool1 = icmp ne i32 %0, 0
+  br i1 %tobool1, label %CallSite, label %End
+
+CallSite:                                          ; preds = %TBB, %Header
+  %somepointer = getelementptr i32, i32* %ptrarg, i64 18
+  call void @bar(i32* %ptrarg, i32 %i)
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  %somepointerphi = phi i32* [ %somepointer, %CallSite ], [ null, %TBB ]
+  ret i32* %somepointerphi
+}
+; NODUP-LABEL: test_split_branch_phi
+; NODUP-NOT: split
+; CHECK-LABEL: Header.split
+; CHECK: %[[V1:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18
+; CHECK: call void @bar(i32* null, i32 %i)
+; CHECK: br label %CallSite
+; CHECK-LABEL: TBB.split:
+; CHECK: %[[V2:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18
+; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i)
+; CHECK: br label %CallSite
+; CHECK: CallSite:
+; CHECK: phi i32* [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ]
+
+
+define void @split_branch_no_extra_phi(i32* %ptrarg, i32 %i) {
+Header:
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                    ; preds = %Header
+  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42
+  %0 = load i32, i32* %arrayidx, align 4
+  %tobool1 = icmp ne i32 %0, 0
+  br i1 %tobool1, label %CallSite, label %End
+
+CallSite:                                          ; preds = %TBB, %Header
+  %i.add = add i32 %i, 99
+  call void @bar(i32* %ptrarg, i32 %i.add)
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  ret void
+}
+; NODUP-LABEL: split_branch_no_extra_phi
+; NODUP-NOT: split
+; CHECK-LABEL: split_branch_no_extra_phi
+; CHECK-LABEL: Header.split
+; CHECK: %[[V1:.+]] = add i32 %i, 99
+; CHECK: call void @bar(i32* null, i32 %[[V1]])
+; CHECK: br label %CallSite
+; CHECK-LABEL: TBB.split:
+; CHECK: %[[V2:.+]] = add i32 %i, 99
+; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %[[V2]])
+; CHECK: br label %CallSite
+; CHECK: CallSite:
+; CHECK-NOT: phi
+
+
+; In this test case, the codesize cost of the instructions before the call to
+; bar() is equal to the default DuplicationThreshold of 5, because calls are
+; more expensive.
+define void @test_no_split_threshold(i32* %ptrarg, i32 %i) {
+Header:
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                    ; preds = %Header
+  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42
+  %0 = load i32, i32* %arrayidx, align 4
+  %tobool1 = icmp ne i32 %0, 0
+  br i1 %tobool1, label %CallSite, label %End
+
+CallSite:                                          ; preds = %TBB, %Header
+  %i2 = add i32 %i, 10
+  call void @bari(i32 %i2)
+  call void @bari(i32 %i2)
+  call void @bar(i32* %ptrarg, i32 %i2)
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  ret void
+}
+; NODUP-LABEL: test_no_split_threshold
+; NODUP-NOT: split
+; CHECK-LABEL: test_no_split_threshold
+; CHECK-NOT: split
+; CHECK-LABEL: CallSite:
+; CHECK: call void @bar(i32* %ptrarg, i32 %i2)
+
+; In this test case, the phi node %l in CallSite should be removed, as after
+; moving the call to the split blocks we can use the values directly.
+define void @test_remove_unused_phi(i32* %ptrarg, i32 %i) {
+Header:
+  %l1 = load i32, i32* undef, align 16
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                    ; preds = %Header
+  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42
+  %0 = load i32, i32* %arrayidx, align 4
+  %l2 = load i32, i32* undef, align 16
+  %tobool1 = icmp ne i32 %0, 0
+  br i1 %tobool1, label %CallSite, label %End
+
+CallSite:                                          ; preds = %TBB, %Header
+  %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ]
+  call void @bar(i32* %ptrarg, i32 %l)
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  ret void
+}
+; NODUP-LABEL: test_remove_unused_phi
+; NODUP-NOT: split
+; CHECK-LABEL: test_remove_unused_phi
+; CHECK-LABEL: Header.split
+; CHECK: call void @bar(i32* null, i32 %l1)
+; CHECK: br label %CallSite
+; CHECK-LABEL: TBB.split:
+; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2)
+; CHECK: br label %CallSite
+; CHECK-LABEL: CallSite:
+; CHECK-NOT: phi
+
+; In this test case, we need to insert a new PHI node in TailBB to combine
+; the loads we moved to the predecessors.
+define void @test_add_new_phi(i32* %ptrarg, i32 %i) {
+Header:
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:
+  br i1 undef, label %CallSite, label %End
+
+CallSite:
+  %arrayidx112 = getelementptr inbounds i32, i32* undef, i64 1
+  %0 = load i32, i32* %arrayidx112, align 4
+  call void @bar(i32* %ptrarg, i32 %i)
+  %sub = sub nsw i32 %0, undef
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  ret void
+}
+; NODUP-LABEL: test_add_new_phi
+; NODUP-NOT: split
+; CHECK-LABEL: test_add_new_phi
+; CHECK-LABEL: Header.split
+; CHECK: %[[V1:.+]] = load i32, i32*
+; CHECK: call void @bar(i32* null, i32 %i)
+; CHECK: br label %CallSite
+; CHECK-LABEL: TBB.split:
+; CHECK: %[[V2:.+]] = load i32, i32*
+; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i)
+; CHECK: br label %CallSite
+; CHECK-LABEL: CallSite:
+; CHECK-NEXT: %[[V3:.+]] = phi i32 [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ]
+; CHECK: %sub = sub nsw i32 %[[V3]], undef
+
+define i32 @test_firstnophi(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  store i32 %v, i32* %a
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+; NODUP-LABEL: @test_firstnophi
+; NODUP-NOT: split:
+; CHECK-LABEL: @test_firstnophi
+; CHECK-LABEL: Header.split:
+; CHECK-NEXT: store i32 %v, i32* %a
+; CHECK-NEXT: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
+; CHECK-NEXT: br label %Tail
+; CHECK-LABEL: TBB.split:
+; CHECK-NEXT: store i32 %v, i32* %a
+; CHECK-NEXT: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
+; CHECK-NEXT br label %Tail
+; CHECK-LABEL: Tail:
+; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+; CHECK: ret i32 %[[MERGED]]
+define i32 @callee(i32* %a, i32 %v, i32 %p) {
+    ret i32 0
+}
+
+define void @test_no_remove_used_phi(i32* %ptrarg, i32 %i) {
+Header:
+  %l1 = load i32, i32* undef, align 16
+  %tobool = icmp ne i32* %ptrarg, null
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                    ; preds = %Header
+  %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42
+  %0 = load i32, i32* %arrayidx, align 4
+  %l2 = load i32, i32* undef, align 16
+  %tobool1 = icmp ne i32 %0, 0
+  br i1 %tobool1, label %CallSite, label %End
+
+CallSite:                                          ; preds = %TBB, %Header
+  %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ]
+  call void @bar(i32* %ptrarg, i32 %l)
+  call void @bari(i32 %l)
+  br label %End
+
+End:                                           ; preds = %CallSite, %TBB
+  ret void
+}
+; NODUP-LABEL: @test_no_remove_used_phi
+; NODUP-NOT: split
+; CHECK-LABEL: @test_no_remove_used_phi
+; CHECK-LABEL: Header.split:
+; CHECK: call void @bar(i32* null, i32 %l1)
+; CHECK-NEXT: br label %CallSite
+; CHECK-LABEL: TBB.split:
+; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2)
+; CHECK-NEXT br label %CallSite
+; CHECK-LABEL: CallSite:
+; CHECK-NEXT:  %l = phi i32 [ %l1, %Header.split ], [ %l2, %TBB.split ]
+; CHECK: call void @bari(i32 %l)
+
+define void @bar(i32*, i32) {
+    ret void
+}
+
+define  void @bari(i32) {
+    ret void
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,139 @@
+; RUN: opt < %s -callsite-splitting -S | FileCheck %s
+; RUN: opt < %s  -passes='function(callsite-splitting)' -S | FileCheck %s
+
+; CHECK-LABEL: @test_simple
+; CHECK-LABEL: Header:
+; CHECK-NEXT: br i1 undef, label %Header.split
+; CHECK-LABEL: Header.split:
+; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
+; CHECK-LABEL: TBB:
+; CHECK: br i1 %cmp, label %TBB.split
+; CHECK-LABEL: TBB.split:
+; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p)
+; CHECK-LABEL: Tail
+; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+; CHECK: ret i32 %[[MERGED]]
+define i32 @test_simple(i32* %a, i32 %v, i32 %p) {
+Header:
+  br i1 undef, label %Tail, label %End
+
+TBB:
+  %cmp = icmp eq i32* %a, null
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+; CHECK-LABEL: @test_eq_eq_eq_untaken
+; CHECK-LABEL: Header:
+; CHECK: br i1 %tobool1, label %TBB1, label %Header.split
+; CHECK-LABEL: Header.split:
+; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
+; CHECK-LABEL: TBB2:
+; CHECK: br i1 %cmp2, label %TBB2.split, label %End
+; CHECK-LABEL: TBB2.split:
+; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 99)
+; CHECK-LABEL: Tail
+; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]
+; CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq_eq_untaken2(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %TBB1, label %Tail
+
+TBB1:
+  %cmp1 = icmp eq i32 %v, 1
+  br i1 %cmp1, label %TBB2, label %End
+
+TBB2:
+  %cmp2 = icmp eq i32 %p, 99
+  br i1 %cmp2, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+; CHECK-LABEL: @test_eq_ne_eq_untaken
+; CHECK-LABEL: Header:
+; CHECK: br i1 %tobool1, label %TBB1, label %Header.split
+; CHECK-LABEL: Header.split:
+; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
+; CHECK-LABEL: TBB2:
+; CHECK: br i1 %cmp2, label %TBB2.split, label %End
+; CHECK-LABEL: TBB2.split:
+; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 99)
+; CHECK-LABEL: Tail
+; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ]
+; CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_ne_eq_untaken(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %TBB1, label %Tail
+
+TBB1:
+  %cmp1 = icmp ne i32 %v, 1
+  br i1 %cmp1, label %TBB2, label %End
+
+TBB2:
+  %cmp2 = icmp eq i32 %p, 99
+  br i1 %cmp2, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+; CHECK-LABEL: @test_header_header2_tbb
+; CHECK: Header2:
+; CHECK:br i1 %tobool2, label %Header2.split, label %TBB1
+; CHECK-LABEL: Header2.split:
+; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
+; CHECK-LABEL: TBB2:
+; CHECK: br i1 %cmp2, label %TBB2.split, label %End
+; CHECK-LABEL: TBB2.split:
+; NOTE: CallSiteSplitting cannot infer that %a is null here, as it currently
+;       only supports recording conditions along a single predecessor path.
+; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 99)
+; CHECK-LABEL: Tail
+; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB2.split ]
+; CHECK: ret i32 %[[MERGED]]
+define i32 @test_header_header2_tbb(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %TBB1, label %Header2
+
+Header2:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB1
+
+TBB1:
+  %cmp1 = icmp eq i32 %v, 1
+  br i1 %cmp1, label %TBB2, label %End
+
+TBB2:
+  %cmp2 = icmp eq i32 %p, 99
+  br i1 %cmp2, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+define i32 @callee(i32* %a, i32 %v, i32 %p) {
+  ret i32 10
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,42 @@
+; RUN: opt < %s -callsite-splitting -S | FileCheck %s
+; RUN: opt < %s  -passes='function(callsite-splitting)' -S | FileCheck %s
+
+define i32 @callee(i32*, i32, i32) {
+  ret i32 10
+}
+
+; CHECK-LABEL: @test_preds_equal
+; CHECK-NOT: split
+; CHECK: br i1 %cmp, label %Tail, label %Tail
+define i32 @test_preds_equal(i32* %a, i32 %v, i32 %p) {
+TBB:
+  %cmp = icmp eq i32* %a, null
+  br i1 %cmp, label %Tail, label %Tail
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+}
+
+define void @fn1(i16 %p1) {
+entry:
+  ret void
+}
+
+define void @fn2() {
+  ret void
+
+; Unreachable code below
+
+for.inc:                                          ; preds = %for.inc
+  br i1 undef, label %for.end6, label %for.inc
+
+for.end6:                                         ; preds = %for.inc
+  br i1 undef, label %lor.rhs, label %lor.end
+
+lor.rhs:                                          ; preds = %for.end6
+  br label %lor.end
+
+lor.end:                                          ; preds = %for.end6, %lor.rhs
+  call void @fn1(i16 0)
+  ret void
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-debug.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,56 @@
+; RUN: opt -S -callsite-splitting -o - < %s | FileCheck %s
+; RUN: opt -S -strip-debug -callsite-splitting -o - < %s | FileCheck %s
+
+define internal i16 @bar(i16 %p1, i16 %p2) {
+  %_tmp3 = mul i16 %p2, %p1
+  ret i16 %_tmp3
+}
+
+define i16 @foo(i16 %in) {
+bb0:
+  br label %bb1
+
+bb1:
+  %0 = icmp ne i16 %in, 0
+  br i1 %0, label %bb2, label %CallsiteBB
+
+bb2:
+  br label %CallsiteBB
+
+CallsiteBB:
+  %1 = phi i16 [ 0, %bb1 ], [ 1, %bb2 ]
+  %c = phi i16 [ 2, %bb1 ], [ 3, %bb2 ]
+  call void @llvm.dbg.value(metadata i16 %c, metadata !7, metadata !DIExpression()), !dbg !8
+  %2 = call i16 @bar(i16 %1, i16 5)
+  ret i16 %2
+}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+attributes #0 = { nounwind readnone speculatable }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2, !3}
+!llvm.ident = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "My Compiler")
+!1 = !DIFile(filename: "foo.c", directory: "/bar")
+!2 = !{i32 2, !"Dwarf Version", i32 4}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{!"My Compiler"}
+!5 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed)
+!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, unit: !0)
+!7 = !DILocalVariable(name: "c", scope: !6, line: 5, type: !5)
+!8 = !DILocation(line: 5, column: 7, scope: !6)
+
+; The optimization should trigger even in the presence of the dbg.value in
+; CallSiteBB.
+
+; CHECK-LABEL: @foo
+; CHECK-LABEL: bb1.split:
+; CHECK: [[TMP1:%[0-9]+]] = call i16 @bar(i16 0, i16 5)
+; CHECK-LABEL: bb2.split:
+; CHECK: [[TMP2:%[0-9]+]] = call i16 @bar(i16 1, i16 5)
+; CHECK-LABEL: CallsiteBB
+; CHECK: %phi.call = phi i16 [ [[TMP2]], %bb2.split ], [ [[TMP1]], %bb1.split

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,588 @@
+; RUN: opt < %s -callsite-splitting -S | FileCheck %s
+; RUN: opt < %s  -passes='function(callsite-splitting)' -S | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-linaro-linux-gnueabi"
+
+;CHECK-LABEL: @test_eq_eq
+
+;CHECK-LABEL: Header:
+;CHECK: br i1 %tobool1, label %Header.split, label %TBB
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
+;CHECK-LABEL: TBB:
+;CHECK: br i1 %cmp, label %TBB.split, label %End
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_eq_eq_eq
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %Header2, label %End
+
+Header2:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32 %v, 111
+  br i1 %tobool1, label %Header2, label %End
+
+Header2:
+  %tobool2 = icmp eq i32 %v, 222
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 333
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_eq
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_eq(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_eq_ne
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %Header2, label %TBB
+
+Header2:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp ne i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_ne
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_ne(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp ne i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %Header2, label %TBB
+
+Header2:
+  %tobool2 = icmp ne i32* %a, %a2
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp ne i32* %a, %a3
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+
+
+;CHECK-LABEL: @test_eq_eq_untaken
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq_untaken(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %TBB, label %Tail
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_eq_eq_eq_untaken
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %TBB, label %Header2
+
+Header2:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_eq_untaken
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_eq_untaken(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %TBB, label %Tail
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_eq_ne_untaken
+;CHECK-LABEL: Header2.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_eq_ne_untaken(i32* %a, i32 %v, i32 %p) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %TBB, label %Header2
+
+Header2:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp ne i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_ne_ne_untaken
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_ne_ne_untaken(i32* %a, i32 %v) {
+Header:
+  %tobool1 = icmp ne i32* %a, null
+  br i1 %tobool1, label %TBB, label %Tail
+
+TBB:
+  %cmp = icmp ne i32 %v, 1
+  br i1 %cmp, label %End, label %Tail
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_nonconst_const_phi
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) {
+Header:
+  %tobool1 = icmp eq i32* %a, %b
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_nonconst_nonconst_phi
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB.split ], [ %[[CALL1]], %Header.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) {
+Header:
+  %tobool1 = icmp eq i32* %a, %b
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, %v2 
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_cfg_no_or_phi
+;CHECK-LABEL: TBB0.split
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1)
+;CHECK-LABEL: TBB1.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB1.split ], [ %[[CALL1]], %TBB0.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_cfg_no_or_phi(i32* %a,  i32 %v) {
+entry:
+  br i1 undef, label %TBB0, label %TBB1
+TBB0:
+  br i1 undef, label %Tail, label %End
+TBB1:
+  br i1 undef, label %Tail, label %End
+Tail:
+  %p = phi i32[1,%TBB0], [2, %TBB1]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost
+;CHECK-NOT: Header.split:
+;CHECK-NOT: TBB.split:
+;CHECK-LABEL: Tail:
+;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK: ret i32 %r
+define i32 @test_nonconst_nonconst_phi_noncost(i32* %a, i32* %b, i32 %v, i32 %v2) {
+Header:
+  %tobool1 = icmp eq i32* %a, %b
+  br i1 %tobool1, label %Tail, label %TBB
+
+TBB:
+  %cmp = icmp eq i32 %v, %v2 
+  br i1 %cmp, label %Tail, label %End
+
+Tail:
+  %p = phi i32[%v,%Header], [%v2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_3preds_constphi
+;CHECK-NOT: Header.split:
+;CHECK-NOT: TBB.split:
+;CHECK-LABEL: Tail:
+;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK: ret i32 %r
+define i32 @test_3preds_constphi(i32* %a, i32 %v, i1 %c1, i1 %c2, i1 %c3) {
+Header:
+  br i1 %c1, label %Tail, label %TBB1
+
+TBB1:
+  br i1 %c2, label %Tail, label %TBB2
+
+TBB2:
+  br i1 %c3, label %Tail, label %End
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB1], [3, %TBB2]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_indirectbr_phi
+;CHECK-NOT: Header.split:
+;CHECK-NOT: TBB.split:
+;CHECK-LABEL: Tail:
+;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+;CHECK: ret i32 %r
+define i32 @test_indirectbr_phi(i8* %address, i32* %a, i32* %b, i32 %v) {
+Header:
+   %indirect.goto.dest = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
+   indirectbr i8* %indirect.goto.dest, [label %TBB, label %Tail]
+
+TBB:
+  %indirect.goto.dest2 = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address
+  indirectbr i8* %indirect.goto.dest2, [label %Tail, label %End]
+
+Tail:
+  %p = phi i32[1,%Header], [2, %TBB]
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_cond_no_effect
+;CHECK-NOT: Header.split:
+;CHECK-NOT: TBB.split:
+;CHECK-LABEL: Tail:
+;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 0)
+;CHECK: ret i32 %r
+define i32 @test_cond_no_effect(i32* %a, i32 %v) {
+Entry:
+  %tobool1 = icmp eq i32* %a, null
+  br i1 %tobool1, label %Header, label %End
+
+Header:
+  br i1 undef, label %Tail, label %TBB
+
+TBB:
+  br i1 undef, label %Tail, label %End
+
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 0)
+  ret i32 %r
+
+End:
+  ret i32 %v
+}
+
+;CHECK-LABEL: @test_unreachable
+;CHECK-LABEL: Header.split:
+;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10)
+;CHECK-LABEL: TBB.split:
+;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p)
+;CHECK-LABEL: Tail
+;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ]
+;CHECK: ret i32 %[[MERGED]]
+define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) {
+Entry:
+  br label %End
+Header:
+  %tobool2 = icmp eq i32 %p, 10
+  br i1 %tobool2, label %Tail, label %TBB
+TBB:
+  %cmp = icmp eq i32 %v, 1
+  br i1 %cmp, label %Tail, label %Header
+Tail:
+  %r = call i32 @callee(i32* %a, i32 %v, i32 %p)
+  ret i32 %r
+End:
+  ret i32 %v
+}
+
+define i32 @callee(i32* %a, i32 %v, i32 %p) {
+entry:
+  %c = icmp ne i32* %a, null
+  br i1 %c, label %BB1, label %BB2
+
+BB1:
+  call void @dummy(i32* %a, i32 %p)
+  br label %End
+
+BB2:
+  call void @dummy2(i32 %v, i32 %p)
+  br label %End
+
+End:
+  ret i32 %p
+}
+
+declare void @dummy(i32*, i32)
+declare void @dummy2(i32, i32)
+
+; Make sure we remove the non-nullness on constant paramater.
+;
+;CHECK-LABEL: @caller2
+;CHECK-LABEL: Top1.split:
+;CHECK: call i32 @callee(i32* inttoptr (i64 4643 to i32*)
+define void @caller2(i32 %c, i32* %a_elt, i32* %b_elt) {
+entry:
+  br label %Top0
+
+Top0:
+  %tobool1 = icmp eq i32* %a_elt, inttoptr (i64 4643 to  i32*) 
+  br i1 %tobool1, label %Top1, label %NextCond
+
+Top1:
+  %tobool2 = icmp ne i32* %a_elt, null
+  br i1 %tobool2, label %CallSiteBB, label %NextCond
+
+NextCond:
+  %cmp = icmp ne i32* %b_elt, null
+  br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+  call i32 @callee(i32* %a_elt, i32 %c, i32 %c)
+  br label %End
+
+End:
+  ret void
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,85 @@
+; RUN: opt -callsite-splitting -S < %s | FileCheck %s
+
+; CHECK-LABEL: @test1
+; CHECK:         [[R1:%.+]] = call i32 @callee(i32 0, i32 %dd), !dbg [[DBG1:!.*]]
+; CHECK:         [[R2:%.+]] = call i32 @callee(i32 1, i32 %dd), !dbg [[DBG1]]
+; CHECK-LABEL: CallSite:
+; CHECK-NEXT:    phi i32 [ [[R2]], %land.rhs.split ], [ [[R1]], %entry.split ], !dbg [[DBG1]]
+
+define i32 @test1(i32* dereferenceable(4) %cc, i32 %dd) !dbg !6 {
+entry:
+  br i1 undef, label %CallSite, label %land.rhs
+
+land.rhs:                                         ; preds = %entry
+  br label %CallSite
+
+CallSite:                                         ; preds = %land.rhs, %entry
+  %pv = phi i32 [ 0, %entry ], [ 1, %land.rhs ]
+  %call = call i32 @callee(i32 %pv, i32 %dd), !dbg !18
+  ret i32 %call
+}
+
+; CHECK-LABEL: @test2
+; CHECK:         [[LV1:%.*]] = load i32, i32* %ptr, align 4, !dbg [[DBG_LV:!.*]]
+; CHECK-NEXT:    [[R1:%.+]] = call i32 @callee(i32 0, i32 10), !dbg [[DBG_CALL:!.*]]
+; CHECK:         [[LV2:%.*]] = load i32, i32* %ptr, align 4, !dbg [[DBG_LV]]
+; CHECK-NEXT:    [[R2:%.+]] = call i32 @callee(i32 0, i32 %i), !dbg [[DBG_CALL]]
+; CHECK-LABEL: CallSite:
+; CHECK-NEXT:    phi i32 [ [[LV1]], %Header.split ], [ [[LV2]], %TBB.split ], !dbg [[DBG_LV]]
+; CHECK-NEXT:    phi i32 [ [[R1]], %Header.split ], [ [[R2]], %TBB.split ], !dbg [[DBG_CALL]]
+
+define void @test2(i32* %ptr, i32 %i) !dbg !19 {
+Header:
+  %tobool = icmp ne i32 %i, 10
+  br i1 %tobool, label %TBB, label %CallSite
+
+TBB:                                              ; preds = %Header
+  br i1 undef, label %CallSite, label %End
+
+CallSite:                                         ; preds = %TBB, %Header
+  %lv = load i32, i32* %ptr, align 4, !dbg !25
+  %cv = call i32 @callee(i32 0, i32 %i), !dbg !26
+  %sub = sub nsw i32 %lv, %cv
+  br label %End
+
+End:                                              ; preds = %CallSite, %TBB
+  ret void
+}
+
+define i32 @callee(i32 %aa, i32 %bb) {
+entry:
+  %add = add nsw i32 %aa, %bb
+  ret i32 %add
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!3, !4}
+!llvm.module.flags = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "<stdin>", directory: "/")
+!2 = !{}
+!3 = !{i32 23}
+!4 = !{i32 11}
+!5 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = distinct !DISubprogram(name: "test", linkageName: "test", scope: null, file: !1, line: 3, type: !7, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, retainedNodes: !8)
+!7 = !DISubroutineType(types: !2)
+!8 = !{!9, !11, !13, !15, !16, !17}
+!9 = !DILocalVariable(name: "2", scope: !6, file: !1, line: 3, type: !10)
+!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+!11 = !DILocalVariable(name: "3", scope: !6, file: !1, line: 5, type: !12)
+!12 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
+!13 = !DILocalVariable(name: "4", scope: !6, file: !1, line: 6, type: !14)
+!14 = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned)
+!15 = !DILocalVariable(name: "5", scope: !6, file: !1, line: 9, type: !12)
+!16 = !DILocalVariable(name: "6", scope: !6, file: !1, line: 10, type: !12)
+!17 = !DILocalVariable(name: "7", scope: !6, file: !1, line: 11, type: !10)
+!18 = !DILocation(line: 10, column: 1, scope: !6)
+!19 = distinct !DISubprogram(name: "test_add_new_phi", linkageName: "test_add_new_phi", scope: null, file: !1, line: 14, type: !7, isLocal: false, isDefinition: true, scopeLine: 14, isOptimized: true, unit: !0, retainedNodes: !20)
+!20 = !{!21, !22, !23, !24}
+!21 = !DILocalVariable(name: "8", scope: !19, file: !1, line: 14, type: !14)
+!22 = !DILocalVariable(name: "9", scope: !19, file: !1, line: 17, type: !10)
+!23 = !DILocalVariable(name: "10", scope: !19, file: !1, line: 18, type: !12)
+!24 = !DILocalVariable(name: "11", scope: !19, file: !1, line: 20, type: !12)
+!25 = !DILocation(line: 18, column: 1, scope: !19)
+!26 = !DILocation(line: 19, column: 1, scope: !19)

Added: llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/callsite-split.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,119 @@
+; RUN: opt < %s -callsite-splitting -inline -instcombine -jump-threading -S | FileCheck %s
+; RUN: opt < %s  -passes='function(callsite-splitting),cgscc(inline),function(instcombine,jump-threading)' -S | FileCheck %s
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-linaro-linux-gnueabi"
+
+%struct.bitmap = type { i32, %struct.bitmap* }
+
+;CHECK-LABEL: @caller
+;CHECK-LABEL: Top.split:
+;CHECK: call void @callee(%struct.bitmap* null, %struct.bitmap* null, %struct.bitmap* %b_elt, i1 false)
+;CHECK-LABEL: NextCond:
+;CHECK: br {{.*}} label %callee.exit
+;CHECK-LABEL: callee.exit:
+;CHECK: call void @dummy2(%struct.bitmap* %a_elt)
+
+define void @caller(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt) {
+entry:
+  br label %Top
+
+Top:
+  %tobool1 = icmp eq %struct.bitmap* %a_elt, null
+  br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+  %cmp = icmp ne %struct.bitmap* %b_elt, null
+  br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+  %p = phi i1 [0, %Top], [%c, %NextCond]
+  call void @callee(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %p)
+  br label %End
+
+End:
+  ret void
+}
+
+define void @callee(%struct.bitmap* %dst_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %c) {
+entry:
+  %tobool = icmp ne %struct.bitmap* %a_elt, null
+  %tobool1 = icmp ne %struct.bitmap* %b_elt, null
+  %or.cond = and i1 %tobool, %tobool1
+  br i1 %or.cond, label %Cond, label %Big
+
+Cond:
+  %cmp = icmp eq %struct.bitmap*  %dst_elt, %a_elt
+  br i1 %cmp, label %Small, label %Big
+
+Small:
+  call void @dummy2(%struct.bitmap* %a_elt)
+  br label %End
+
+Big:
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt)
+  br label %End
+
+End:
+  ret void
+}
+
+declare void @dummy2(%struct.bitmap*)
+declare void @dummy1(%struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*)
+
+
+;CHECK-LABEL: @caller2
+;CHECK-LABEL: Top.split:
+;CHECK: call void @dummy4()
+;CHECK-LABEL: NextCond.split:
+;CHECK: call void @dummy3()
+;CheCK-LABEL: CallSiteBB:
+;CHECK: %phi.call = phi i1 [ true, %NextCond.split ], [ false, %Top.split ]
+;CHECK: call void @foo(i1 %phi.call)
+define void @caller2(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, %struct.bitmap* %c_elt) {
+entry:
+  br label %Top
+
+Top:
+  %tobool1 = icmp eq %struct.bitmap* %a_elt, %b_elt
+  br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+  %cmp = icmp ne %struct.bitmap* %b_elt, %c_elt
+  br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+  %phi = phi i1 [0, %Top],[1, %NextCond]
+  %u = call i1 @callee2(i1 %phi)
+  call void @foo(i1 %u)
+  br label %End
+
+End:
+  ret void
+}
+
+define i1 @callee2(i1 %b) {
+entry:
+  br i1 %b, label %BB1, label %BB2
+
+BB1:
+  call void @dummy3()
+  br label %End
+
+BB2:
+  call void @dummy4()
+  br label %End
+
+End:
+  ret i1 %b
+}
+
+declare void @dummy3()
+declare void @dummy4()
+declare void @foo(i1)

Added: llvm/trunk/test/Transforms/CallSiteSplitting/lpad.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/lpad.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/lpad.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/lpad.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,40 @@
+; RUN: opt -S -callsite-splitting < %s | FileCheck %s
+;
+; Make sure that the callsite is not splitted by checking that there's only one
+; call to @callee.
+
+; CHECK-LABEL: @caller
+; CHECK-LABEL: lpad
+; CHECK: call void @callee
+; CHECK-NOT: call void @callee
+
+declare void @foo(i1* %p);
+declare void @bar(i1* %p);
+declare dso_local i32 @__gxx_personality_v0(...)
+
+define void @caller(i1* %p) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+  %0 = icmp eq i1* %p, null
+  br i1 %0, label %bb1, label %bb2
+
+bb1:
+  invoke void @foo(i1* %p) to label %end1 unwind label %lpad
+
+bb2:
+  invoke void @bar(i1* %p) to label %end2 unwind label %lpad
+
+lpad:
+  %1 = landingpad { i8*, i32 } cleanup
+  call void @callee(i1* %p)
+  resume { i8*, i32 } %1
+
+end1:
+  ret void
+
+end2:
+  ret void
+}
+
+define internal void @callee(i1* %p) {
+  ret void
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/musttail.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/musttail.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/musttail.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/musttail.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,104 @@
+; RUN: opt < %s -callsite-splitting -verify-dom-info -S | FileCheck %s
+
+;CHECK-LABEL: @caller
+;CHECK-LABEL: Top.split:
+;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b)
+;CHECK: %cb2 = bitcast i8* %ca1 to i8*
+;CHECK: ret i8* %cb2
+;CHECK-LABEL: TBB.split
+;CHECK: %ca3 = musttail call i8* @callee(i8* nonnull %a, i8* null)
+;CHECK: %cb4 = bitcast i8* %ca3 to i8*
+;CHECK: ret i8* %cb4
+define i8* @caller(i8* %a, i8* %b) {
+Top:
+  %c = icmp eq i8* %a, null
+  br i1 %c, label %Tail, label %TBB
+TBB:
+  %c2 = icmp eq i8* %b, null
+  br i1 %c2, label %Tail, label %End
+Tail:
+  %ca = musttail call i8* @callee(i8* %a, i8* %b)
+  %cb = bitcast i8* %ca to i8*
+  ret i8* %cb
+End:
+  ret i8* null
+}
+
+define i8* @callee(i8* %a, i8* %b) noinline {
+  ret i8* %a
+}
+
+;CHECK-LABEL: @no_cast_caller
+;CHECK-LABEL: Top.split:
+;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b)
+;CHECK: ret i8* %ca1
+;CHECK-LABEL: TBB.split
+;CHECK: %ca2 = musttail call i8* @callee(i8* nonnull %a, i8* null)
+;CHECK: ret i8* %ca2
+define i8* @no_cast_caller(i8* %a, i8* %b) {
+Top:
+  %c = icmp eq i8* %a, null
+  br i1 %c, label %Tail, label %TBB
+TBB:
+  %c2 = icmp eq i8* %b, null
+  br i1 %c2, label %Tail, label %End
+Tail:
+  %ca = musttail call i8* @callee(i8* %a, i8* %b)
+  ret i8* %ca
+End:
+  ret i8* null
+}
+
+;CHECK-LABEL: @void_caller
+;CHECK-LABEL: Top.split:
+;CHECK: musttail call void @void_callee(i8* null, i8* %b)
+;CHECK: ret void
+;CHECK-LABEL: TBB.split
+;CHECK: musttail call void @void_callee(i8* nonnull %a, i8* null)
+;CHECK: ret void
+define void @void_caller(i8* %a, i8* %b) {
+Top:
+  %c = icmp eq i8* %a, null
+  br i1 %c, label %Tail, label %TBB
+TBB:
+  %c2 = icmp eq i8* %b, null
+  br i1 %c2, label %Tail, label %End
+Tail:
+  musttail call void @void_callee(i8* %a, i8* %b)
+  ret void
+End:
+  ret void
+}
+
+define void @void_callee(i8* %a, i8* %b) noinline {
+  ret void
+}
+
+;   Include a test with a larger CFG that exercises the DomTreeUpdater
+;   machinery a bit more.
+;CHECK-LABEL: @larger_cfg_caller
+;CHECK-LABEL: Top.split:
+;CHECK: %r1 = musttail call i8* @callee(i8* null, i8* %b)
+;CHECK: ret i8* %r1
+;CHECK-LABEL: TBB.split
+;CHECK: %r2 = musttail call i8* @callee(i8* nonnull %a, i8* null)
+;CHECK: ret i8* %r2
+define i8* @larger_cfg_caller(i8* %a, i8* %b) {
+Top:
+  %cond1 = icmp eq i8* %a, null
+  br i1 %cond1, label %Tail, label %ExtraTest
+ExtraTest:
+  %a0 = load i8, i8* %a
+  %cond2 = icmp eq i8 %a0, 0
+  br i1 %cond2, label %TBB_pred, label %End
+TBB_pred:
+  br label %TBB
+TBB:
+  %cond3 = icmp eq i8* %b, null
+  br i1 %cond3, label %Tail, label %End
+Tail:
+  %r = musttail call i8* @callee(i8* %a, i8* %b)
+  ret i8* %r
+End:
+  ret i8* null
+}

Added: llvm/trunk/test/Transforms/CallSiteSplitting/split-loop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/split-loop.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/split-loop.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/split-loop.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,90 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -callsite-splitting -simplifycfg < %s | FileCheck %s
+
+define i16 @test1() {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 undef, i16 1, i16 0
+; CHECK-NEXT:    call void @callee(i16 0)
+; CHECK-NEXT:    br label [[FOR_COND12:%.*]]
+; CHECK:       for.cond12:
+; CHECK-NEXT:    call void @callee(i16 [[SPEC_SELECT]])
+; CHECK-NEXT:    br label [[FOR_COND12]]
+;
+entry:
+  %spec.select = select i1 undef, i16 1, i16 0
+  %tobool18 = icmp ne i16 %spec.select, 0
+  br i1 %tobool18, label %for.cond12.us, label %for.cond12
+
+for.cond12.us:
+  unreachable
+
+for.cond12:
+  call void @callee(i16 %spec.select)
+  br label %for.cond12
+}
+
+define i16 @test2() {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[S:%.*]] = select i1 undef, i16 1, i16 0
+; CHECK-NEXT:    call void @callee(i16 0)
+; CHECK-NEXT:    br label [[FOR_COND12:%.*]]
+; CHECK:       for.cond12:
+; CHECK-NEXT:    [[ADD:%.*]] = add i16 [[S]], 10
+; CHECK-NEXT:    [[ADD2:%.*]] = add i16 [[S]], 10
+; CHECK-NEXT:    call void @callee(i16 [[S]])
+; CHECK-NEXT:    br label [[FOR_COND12]]
+;
+entry:
+  %s= select i1 undef, i16 1, i16 0
+  %tobool18 = icmp ne i16 %s, 0
+  br i1 %tobool18, label %for.cond12.us, label %for.cond12
+
+for.cond12.us:
+  unreachable
+
+for.cond12:
+  call void @callee(i16 %s)
+  %add = add i16 %s, 10
+  %add2 = add i16 %s, 10
+  br label %for.cond12
+}
+
+define i16 @test3() {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[S:%.*]] = select i1 undef, i16 1, i16 0
+; CHECK-NEXT:    call void @callee(i16 0)
+; CHECK-NEXT:    br label [[FOR_COND12:%.*]]
+; CHECK:       for.cond12:
+; CHECK-NEXT:    [[ADD:%.*]] = add i16 [[S]], 10
+; CHECK-NEXT:    [[ADD2:%.*]] = add i16 [[ADD]], 10
+; CHECK-NEXT:    br i1 undef, label [[FOR_COND12_SPLIT:%.*]], label [[EXIT:%.*]]
+; CHECK:       for.cond12.split:
+; CHECK-NEXT:    call void @callee(i16 [[S]])
+; CHECK-NEXT:    br label [[FOR_COND12]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret i16 [[ADD2]]
+;
+entry:
+  %s= select i1 undef, i16 1, i16 0
+  %tobool18 = icmp ne i16 %s, 0
+  br i1 %tobool18, label %for.cond12.us, label %for.cond12
+
+for.cond12.us:
+  unreachable
+
+for.cond12:
+  call void @callee(i16 %s)
+  %add = add i16 %s, 10
+  %add2 = add i16 %add, 10
+  br i1 undef, label %for.cond12, label %exit
+
+exit:
+  ret i16 %add2
+}
+
+define internal void @callee(i16 %flag) {
+  ret void
+}

Added: llvm/trunk/test/Transforms/CalledValuePropagation/simple-arguments.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CalledValuePropagation/simple-arguments.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CalledValuePropagation/simple-arguments.ll (added)
+++ llvm/trunk/test/Transforms/CalledValuePropagation/simple-arguments.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,83 @@
+; RUN: opt -called-value-propagation -S < %s | FileCheck %s
+
+target triple = "aarch64-unknown-linux-gnueabi"
+
+
+; This test checks that we propagate the functions through arguments and attach
+; !callees metadata to the call. Such metadata can enable optimizations of this
+; code sequence.
+;
+; For example, the code below a illustrates a contrived sort-like algorithm
+; that accepts a pointer to a comparison function. Since the indirect call to
+; the comparison function has only two targets, the call can be promoted to two
+; direct calls using an if-then-else. The loop can then be unswitched and the
+; called functions inlined. This essentially produces two loops, once
+; specialized for each comparison.
+;
+; CHECK:  %tmp3 = call i1 %cmp(i64* %tmp1, i64* %tmp2), !callees ![[MD:[0-9]+]]
+; CHECK: ![[MD]] = !{i1 (i64*, i64*)* @ugt, i1 (i64*, i64*)* @ule}
+;
+define void @test_argument(i64* %x, i64 %n, i1 %flag) {
+entry:
+  %tmp0 = sub i64 %n, 1
+  br i1 %flag, label %then, label %else
+
+then:
+  call void @arrange_data(i64* %x, i64 %tmp0, i1 (i64*, i64*)* @ugt)
+  br label %merge
+
+else:
+  call void @arrange_data(i64* %x, i64 %tmp0, i1 (i64*, i64*)* @ule)
+  br label %merge
+
+merge:
+  ret void
+}
+
+define internal void @arrange_data(i64* %x, i64 %n, i1 (i64*, i64*)* %cmp) {
+entry:
+  %tmp0 = icmp eq i64 %n, 1
+  br i1 %tmp0, label %merge, label %for.body
+
+for.body:
+  %i = phi i64 [ 0, %entry ], [ %i.next, %cmp.false ]
+  %i.next = add nuw nsw i64 %i, 1
+  %tmp1 = getelementptr inbounds i64, i64* %x, i64 %i
+  %tmp2 = getelementptr inbounds i64, i64* %x, i64 %i.next
+  %tmp3 = call i1 %cmp(i64* %tmp1, i64* %tmp2)
+  br i1 %tmp3, label %cmp.true, label %cmp.false
+
+cmp.true:
+  call void @swap(i64* %tmp1, i64* %tmp2)
+  br label %cmp.false
+
+cmp.false:
+  %cond = icmp slt i64 %i.next, %n
+  br i1 %cond, label %for.body, label %for.end
+
+for.end:
+  %tmp4 = sub i64 %n, 1
+  call void @arrange_data(i64* %x, i64 %tmp4, i1 (i64*, i64*)* %cmp)
+  br label %merge
+
+merge:
+  ret void
+}
+
+define internal i1 @ugt(i64* %a, i64* %b) {
+entry:
+  %tmp0 = load i64, i64* %a
+  %tmp1 = load i64, i64* %b
+  %tmp2 = icmp ugt i64 %tmp0, %tmp1
+  ret i1 %tmp2
+}
+
+define internal i1 @ule(i64* %a, i64* %b) {
+entry:
+  %tmp0 = load i64, i64* %a
+  %tmp1 = load i64, i64* %b
+  %tmp2 = icmp ule i64 %tmp0, %tmp1
+  ret i1 %tmp2
+}
+
+declare void @swap(i64*, i64*)

Added: llvm/trunk/test/Transforms/CalledValuePropagation/simple-memory.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CalledValuePropagation/simple-memory.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CalledValuePropagation/simple-memory.ll (added)
+++ llvm/trunk/test/Transforms/CalledValuePropagation/simple-memory.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,62 @@
+; RUN: opt -called-value-propagation -S < %s | FileCheck %s
+
+target triple = "aarch64-unknown-linux-gnueabi"
+
+ at global_function = internal unnamed_addr global void ()* null, align 8
+ at global_array = common unnamed_addr global i64* null, align 8
+
+; This test checks that we propagate the functions through an internal global
+; variable, and attach !callees metadata to the call. Such metadata can enable
+; optimizations of this code sequence.
+;
+; For example, since both of the targeted functions have the "nounwind" and
+; "readnone" function attributes, LICM can be made to move the call and the
+; function pointer load outside the loop. This would then enable the loop
+; vectorizer to vectorize the sum reduction.
+;
+; CHECK: call void %tmp0(), !callees ![[MD:[0-9]+]]
+; CHECK: ![[MD]] = !{void ()* @invariant_1, void ()* @invariant_2}
+;
+define i64 @test_memory_entry(i64 %n, i1 %flag) {
+entry:
+  br i1 %flag, label %then, label %else
+
+then:
+  store void ()* @invariant_1, void ()** @global_function
+  br label %merge
+
+else:
+  store void ()* @invariant_2, void ()** @global_function
+  br label %merge
+
+merge:
+  %tmp1 = call i64 @test_memory(i64 %n)
+  ret i64 %tmp1
+}
+
+define internal i64 @test_memory(i64 %n) {
+entry:
+  %array = load i64*, i64** @global_array
+  br label %for.body
+
+for.body:
+  %i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
+  %r = phi i64 [ 0, %entry ], [ %tmp3, %for.body ]
+  %tmp0 = load void ()*, void ()** @global_function
+  call void %tmp0()
+  %tmp1 = getelementptr inbounds i64, i64* %array, i64 %i
+  %tmp2 = load i64, i64* %tmp1
+  %tmp3 = add i64 %tmp2, %r
+  %i.next = add nuw nsw i64 %i, 1
+  %cond = icmp slt i64 %i.next, %n
+  br i1 %cond, label %for.body, label %for.end
+
+for.end:
+  %tmp4 = phi i64 [ %tmp3, %for.body ]
+  ret i64 %tmp4
+}
+
+declare void @invariant_1() #0
+declare void @invariant_2() #0
+
+attributes #0 = { nounwind readnone }

Added: llvm/trunk/test/Transforms/CalledValuePropagation/simple-select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CalledValuePropagation/simple-select.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CalledValuePropagation/simple-select.ll (added)
+++ llvm/trunk/test/Transforms/CalledValuePropagation/simple-select.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,39 @@
+; RUN: opt -called-value-propagation -S < %s | FileCheck %s
+
+target triple = "aarch64-unknown-linux-gnueabi"
+
+ at global_function = internal unnamed_addr global void ()* null, align 8
+ at global_scalar = internal unnamed_addr global i64 zeroinitializer
+
+; This test checks that we propagate the functions through a select
+; instruction, and attach !callees metadata to the call. Such metadata can
+; enable optimizations of this code sequence.
+;
+; For example, since both of the targeted functions have the "norecurse"
+; attribute, the function attributes pass can be made to infer that
+; "@test_select" is also norecurse. This would allow the globals optimizer to
+; localize "@global_scalar". The function could then be further simplified to
+; always return the constant "1", eliminating the load and store instructions.
+;
+; CHECK: call void %tmp0(), !callees ![[MD:[0-9]+]]
+; CHECK: ![[MD]] = !{void ()* @norecurse_1, void ()* @norecurse_2}
+;
+define i64 @test_select_entry(i1 %flag) {
+entry:
+  %tmp0 = call i64 @test_select(i1 %flag)
+  ret i64 %tmp0
+}
+
+define internal i64 @test_select(i1 %flag) {
+entry:
+  %tmp0 = select i1 %flag, void ()* @norecurse_1, void ()* @norecurse_2
+  store i64 1, i64* @global_scalar
+  call void %tmp0()
+  %tmp1 = load i64, i64* @global_scalar
+  ret i64 %tmp1
+}
+
+declare void @norecurse_1() #0
+declare void @norecurse_2() #0
+
+attributes #0 = { norecurse }

Added: llvm/trunk/test/Transforms/CanonicalizeAliases/canonicalize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CanonicalizeAliases/canonicalize.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CanonicalizeAliases/canonicalize.ll (added)
+++ llvm/trunk/test/Transforms/CanonicalizeAliases/canonicalize.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,37 @@
+; RUN: opt -S -canonicalize-aliases < %s | FileCheck %s
+; RUN: opt -prepare-for-thinlto -O0 -module-summary -o - < %s | llvm-dis -o - | FileCheck %s
+; RUN: opt -S -passes=canonicalize-aliases < %s | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-DAG: @analias = alias void (), void ()* @aliasee
+; CHECK-DAG: @anotheralias = alias void (), void ()* @aliasee
+; CHECK-DAG: define void @aliasee()
+
+ at analias = alias void (), void ()* @anotheralias
+ at anotheralias = alias void (), bitcast (void ()* @aliasee to void ()*)
+
+; Function Attrs: nounwind uwtable
+define void @aliasee() #0 {
+entry:
+    ret void
+}
+
+%struct.S1 = type { i32, i32, i32 }
+
+; CHECK-DAG: @S = global %struct.S1 { i32 31, i32 32, i32 33 }
+; CHECK-DAG: @Salias = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @S, i32 0, i32 1)
+; CHECK-DAG: @Salias2 = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @S, i32 0, i32 1)
+; CHECK-DAG: @Salias3 = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @S, i32 0, i32 1)
+
+ at S = global %struct.S1 { i32 31, i32 32, i32 33 }, align 4
+ at Salias = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @S, i32 0, i32 1)
+ at Salias2 = alias i32, i32* @Salias
+ at Salias3 = alias i32, i32* @Salias2
+
+; CHECK-DAG: @Salias4 = alias %struct.S1, %struct.S1* @S
+; CHECK-DAG: @Salias5 = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @S, i32 0, i32 1)
+
+ at Salias4 = alias %struct.S1, %struct.S1* @S
+ at Salias5 = alias i32, getelementptr inbounds (%struct.S1, %struct.S1* @Salias4, i32 0, i32 1)

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-13-LoopExtractorCrash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,75 @@
+; RUN: opt < %s -loop-extract -disable-output
+
+define void @solve() {
+entry:
+	br label %loopentry.0
+
+loopentry.0:		; preds = %endif.0, %entry
+	br i1 false, label %no_exit.0, label %loopexit.0
+
+no_exit.0:		; preds = %loopentry.0
+	br i1 false, label %then.0, label %endif.0
+
+then.0:		; preds = %no_exit.0
+	br i1 false, label %shortcirc_done, label %shortcirc_next
+
+shortcirc_next:		; preds = %then.0
+	br label %shortcirc_done
+
+shortcirc_done:		; preds = %shortcirc_next, %then.0
+	br i1 false, label %then.1, label %endif.1
+
+then.1:		; preds = %shortcirc_done
+	br i1 false, label %cond_true, label %cond_false
+
+cond_true:		; preds = %then.1
+	br label %cond_continue
+
+cond_false:		; preds = %then.1
+	br label %cond_continue
+
+cond_continue:		; preds = %cond_false, %cond_true
+	br label %return
+
+after_ret.0:		; No predecessors!
+	br label %endif.1
+
+endif.1:		; preds = %after_ret.0, %shortcirc_done
+	br label %endif.0
+
+endif.0:		; preds = %endif.1, %no_exit.0
+	br label %loopentry.0
+
+loopexit.0:		; preds = %loopentry.0
+	br i1 false, label %then.2, label %endif.2
+
+then.2:		; preds = %loopexit.0
+	br i1 false, label %then.3, label %endif.3
+
+then.3:		; preds = %then.2
+	br label %return
+
+after_ret.1:		; No predecessors!
+	br label %endif.3
+
+endif.3:		; preds = %after_ret.1, %then.2
+	br label %endif.2
+
+endif.2:		; preds = %endif.3, %loopexit.0
+	br label %loopentry.1
+
+loopentry.1:		; preds = %no_exit.1, %endif.2
+	br i1 false, label %no_exit.1, label %loopexit.1
+
+no_exit.1:		; preds = %loopentry.1
+	br label %loopentry.1
+
+loopexit.1:		; preds = %loopentry.1
+	br label %return
+
+after_ret.2:		; No predecessors!
+	br label %return
+
+return:		; preds = %after_ret.2, %loopexit.1, %then.3, %cond_continue
+	ret void
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-DominanceProblem.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,33 @@
+; RUN: opt < %s -loop-extract -disable-output
+; This testcase is failing the loop extractor because not all exit blocks 
+; are dominated by all of the live-outs.
+
+define i32 @ab(i32 %alpha, i32 %beta) {
+entry:
+        br label %loopentry.1.preheader
+
+loopentry.1.preheader:          ; preds = %entry
+        br label %loopentry.1
+
+loopentry.1:            ; preds = %no_exit.1, %loopentry.1.preheader
+        br i1 false, label %no_exit.1, label %loopexit.0.loopexit1
+
+no_exit.1:              ; preds = %loopentry.1
+        %tmp.53 = load i32, i32* null                ; <i32> [#uses=1]
+        br i1 false, label %shortcirc_next.2, label %loopentry.1
+
+shortcirc_next.2:               ; preds = %no_exit.1
+        %tmp.563 = call i32 @wins( i32 0, i32 %tmp.53, i32 3 )          ; <i32> [#uses=0]
+        ret i32 0
+
+loopexit.0.loopexit1:           ; preds = %loopentry.1
+        br label %loopexit.0
+
+loopexit.0:             ; preds = %loopexit.0.loopexit1
+        ret i32 0
+}
+
+declare i32 @wins(i32, i32, i32)
+
+declare i16 @ab_code()
+

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-14-NoSwitchSupport.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,28 @@
+; RUN: opt < %s -loop-extract-single -disable-output
+
+define void @ab() {
+entry:
+        br label %codeReplTail
+
+then.1:         ; preds = %codeReplTail
+        br label %loopentry.1
+
+loopentry.1:            ; preds = %no_exit.1, %then.1
+        br i1 false, label %no_exit.1, label %loopexit.0.loopexit1
+
+no_exit.1:              ; preds = %loopentry.1
+        br label %loopentry.1
+
+loopexit.0.loopexit:            ; preds = %codeReplTail
+        ret void
+
+loopexit.0.loopexit1:           ; preds = %loopentry.1
+        ret void
+
+codeReplTail:           ; preds = %codeReplTail, %entry
+        switch i16 0, label %codeReplTail [
+                 i16 0, label %loopexit.0.loopexit
+                 i16 1, label %then.1
+        ]
+}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-MissedLiveIns.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,47 @@
+; RUN: opt < %s -loop-extract -disable-output
+
+define void @sendMTFValues() {
+entry:
+	br i1 false, label %then.1, label %endif.1
+
+then.1:		; preds = %entry
+	br i1 false, label %loopentry.6.preheader, label %else.0
+
+endif.1:		; preds = %entry
+	ret void
+
+else.0:		; preds = %then.1
+	ret void
+
+loopentry.6.preheader:		; preds = %then.1
+	br i1 false, label %endif.7.preheader, label %loopexit.9
+
+endif.7.preheader:		; preds = %loopentry.6.preheader
+	%tmp.183 = add i32 0, -1		; <i32> [#uses=1]
+	br label %endif.7
+
+endif.7:		; preds = %loopexit.15, %endif.7.preheader
+	br i1 false, label %loopentry.10, label %loopentry.12
+
+loopentry.10:		; preds = %endif.7
+	br label %loopentry.12
+
+loopentry.12:		; preds = %loopentry.10, %endif.7
+	%ge.2.1 = phi i32 [ 0, %loopentry.10 ], [ %tmp.183, %endif.7 ]		; <i32> [#uses=0]
+	br i1 false, label %loopexit.14, label %no_exit.11
+
+no_exit.11:		; preds = %loopentry.12
+	ret void
+
+loopexit.14:		; preds = %loopentry.12
+	br i1 false, label %loopexit.15, label %no_exit.14
+
+no_exit.14:		; preds = %loopexit.14
+	ret void
+
+loopexit.15:		; preds = %loopexit.14
+	br i1 false, label %endif.7, label %loopexit.9
+
+loopexit.9:		; preds = %loopexit.15, %loopentry.6.preheader
+	ret void
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-17-UpdatePHIsOutsideRegion.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt < %s -loop-extract -disable-output
+
+define void @maketree() {
+entry:
+        br i1 false, label %no_exit.1, label %loopexit.0
+
+no_exit.1:              ; preds = %endif, %expandbox.entry, %entry
+        br i1 false, label %endif, label %expandbox.entry
+
+expandbox.entry:                ; preds = %no_exit.1
+        br i1 false, label %loopexit.1, label %no_exit.1
+
+endif:          ; preds = %no_exit.1
+        br i1 false, label %loopexit.1, label %no_exit.1
+
+loopexit.1:             ; preds = %endif, %expandbox.entry
+        %ic.i.0.0.4 = phi i32 [ 0, %expandbox.entry ], [ 0, %endif ]            ; <i32> [#uses=0]
+        ret void
+
+loopexit.0:             ; preds = %entry
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-03-18-InvokeHandling.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,198 @@
+; RUN: opt < %s -loop-extract -disable-output
+
+declare i32 @_IO_getc()
+
+declare void @__errno_location()
+
+define void @yylex() personality i32 (...)* @__gcc_personality_v0 {
+entry:
+	switch i32 0, label %label.126 [
+		 i32 0, label %return
+		 i32 61, label %combine
+		 i32 33, label %combine
+		 i32 94, label %combine
+		 i32 37, label %combine
+		 i32 47, label %combine
+		 i32 42, label %combine
+		 i32 62, label %combine
+		 i32 60, label %combine
+		 i32 58, label %combine
+		 i32 124, label %combine
+		 i32 38, label %combine
+		 i32 45, label %combine
+		 i32 43, label %combine
+		 i32 34, label %string_constant
+		 i32 39, label %char_constant
+		 i32 46, label %loopexit.2
+		 i32 57, label %loopexit.2
+		 i32 56, label %loopexit.2
+		 i32 55, label %loopexit.2
+		 i32 54, label %loopexit.2
+		 i32 53, label %loopexit.2
+		 i32 52, label %loopexit.2
+		 i32 51, label %loopexit.2
+		 i32 50, label %loopexit.2
+		 i32 49, label %loopexit.2
+		 i32 48, label %loopexit.2
+		 i32 95, label %letter
+		 i32 122, label %letter
+		 i32 121, label %letter
+		 i32 120, label %letter
+		 i32 119, label %letter
+		 i32 118, label %letter
+		 i32 117, label %letter
+		 i32 116, label %letter
+		 i32 115, label %letter
+		 i32 114, label %letter
+		 i32 113, label %letter
+		 i32 112, label %letter
+		 i32 111, label %letter
+		 i32 110, label %letter
+		 i32 109, label %letter
+		 i32 108, label %letter
+		 i32 107, label %letter
+		 i32 106, label %letter
+		 i32 105, label %letter
+		 i32 104, label %letter
+		 i32 103, label %letter
+		 i32 102, label %letter
+		 i32 101, label %letter
+		 i32 100, label %letter
+		 i32 99, label %letter
+		 i32 98, label %letter
+		 i32 97, label %letter
+		 i32 90, label %letter
+		 i32 89, label %letter
+		 i32 88, label %letter
+		 i32 87, label %letter
+		 i32 86, label %letter
+		 i32 85, label %letter
+		 i32 84, label %letter
+		 i32 83, label %letter
+		 i32 82, label %letter
+		 i32 81, label %letter
+		 i32 80, label %letter
+		 i32 79, label %letter
+		 i32 78, label %letter
+		 i32 77, label %letter
+		 i32 75, label %letter
+		 i32 74, label %letter
+		 i32 73, label %letter
+		 i32 72, label %letter
+		 i32 71, label %letter
+		 i32 70, label %letter
+		 i32 69, label %letter
+		 i32 68, label %letter
+		 i32 67, label %letter
+		 i32 66, label %letter
+		 i32 65, label %letter
+		 i32 64, label %label.13
+		 i32 76, label %label.12
+		 i32 36, label %label.11
+		 i32 -1, label %label.10
+	]
+
+label.10:		; preds = %entry
+	ret void
+
+label.11:		; preds = %entry
+	ret void
+
+label.12:		; preds = %entry
+	ret void
+
+label.13:		; preds = %entry
+	ret void
+
+letter:		; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
+	ret void
+
+loopexit.2:		; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
+	switch i32 0, label %shortcirc_next.14 [
+		 i32 48, label %then.20
+		 i32 46, label %endif.38
+	]
+
+then.20:		; preds = %loopexit.2
+	switch i32 0, label %else.4 [
+		 i32 120, label %then.21
+		 i32 88, label %then.21
+	]
+
+then.21:		; preds = %then.20, %then.20
+	ret void
+
+else.4:		; preds = %then.20
+	ret void
+
+shortcirc_next.14:		; preds = %loopexit.2
+	ret void
+
+endif.38:		; preds = %loopexit.2
+	br i1 false, label %then.40, label %then.39
+
+then.39:		; preds = %endif.38
+	ret void
+
+then.40:		; preds = %endif.38
+	invoke void @__errno_location( )
+			to label %switchexit.2 unwind label %LongJmpBlkPre
+
+loopentry.6:		; preds = %endif.52
+	switch i32 0, label %switchexit.2 [
+		 i32 73, label %label.82
+		 i32 105, label %label.82
+		 i32 76, label %label.80
+		 i32 108, label %label.80
+		 i32 70, label %label.78
+		 i32 102, label %label.78
+	]
+
+label.78:		; preds = %loopentry.6, %loopentry.6
+	ret void
+
+label.80:		; preds = %loopentry.6, %loopentry.6
+	ret void
+
+label.82:		; preds = %loopentry.6, %loopentry.6
+	%c.0.15.5 = phi i32 [ %tmp.79417, %loopentry.6 ], [ %tmp.79417, %loopentry.6 ]		; <i32> [#uses=0]
+	ret void
+
+switchexit.2:		; preds = %loopentry.6, %then.40
+	br i1 false, label %endif.51, label %loopexit.6
+
+endif.51:		; preds = %switchexit.2
+	br i1 false, label %endif.52, label %then.52
+
+then.52:		; preds = %endif.51
+	ret void
+
+endif.52:		; preds = %endif.51
+	%tmp.79417 = invoke i32 @_IO_getc( )
+			to label %loopentry.6 unwind label %LongJmpBlkPre		; <i32> [#uses=2]
+
+loopexit.6:		; preds = %switchexit.2
+	ret void
+
+char_constant:		; preds = %entry
+	ret void
+
+string_constant:		; preds = %entry
+	ret void
+
+combine:		; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
+	ret void
+
+label.126:		; preds = %entry
+	ret void
+
+return:		; preds = %entry
+	ret void
+
+LongJmpBlkPre:		; preds = %endif.52, %then.40
+        %exn = landingpad { i8*, i32 }
+                 catch i8* null
+	ret void
+}
+
+declare i32 @__gcc_personality_v0(...)

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-08-12-BlockExtractPHI.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,26 @@
+; RUN: opt < %s -extract-blocks -disable-output
+
+define void @test1() {
+no_exit.0.i:
+        br i1 false, label %yylex.entry, label %yylex.entry
+
+yylex.entry:            ; preds = %no_exit.0.i, %no_exit.0.i
+        %tmp.1027 = phi i32 [ 0, %no_exit.0.i ], [ 0, %no_exit.0.i ]            ; <i32> [#uses=0]
+        ret void
+}
+
+define void @test2() {
+no_exit.0.i:
+        switch i32 0, label %yylex.entry [
+                 i32 0, label %yylex.entry
+                 i32 1, label %foo
+        ]
+
+yylex.entry:            ; preds = %no_exit.0.i, %no_exit.0.i
+        %tmp.1027 = phi i32 [ 0, %no_exit.0.i ], [ 0, %no_exit.0.i ]            ; <i32> [#uses=0]
+        ret void
+
+foo:            ; preds = %no_exit.0.i
+        ret void
+}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/2004-11-12-InvokeExtract.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,18 @@
+; RUN: opt < %s -extract-blocks -disable-output
+define i32 @foo() personality i32 (...)* @__gcc_personality_v0 {
+        br label %EB
+
+EB:             ; preds = %0
+        %V = invoke i32 @foo( )
+                        to label %Cont unwind label %Unw                ; <i32> [#uses=1]
+
+Cont:           ; preds = %EB
+        ret i32 %V
+
+Unw:            ; preds = %EB
+        %exn = landingpad { i8*, i32 }
+                 catch i8* null
+        resume { i8*, i32 } %exn
+}
+
+declare i32 @__gcc_personality_v0(...)

Added: llvm/trunk/test/Transforms/CodeExtractor/BlockAddressReference.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/BlockAddressReference.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/BlockAddressReference.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/BlockAddressReference.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,36 @@
+; RUN: opt < %s -loop-extract -S | FileCheck %s
+
+ at label = common local_unnamed_addr global i8* null
+
+; CHECK: define
+; no outlined function
+; CHECK-NOT: define
+define i32 @sterix(i32 %n) {
+entry:
+  %tobool = icmp ne i32 %n, 0
+  ; this blockaddress references a basic block that goes in the extracted loop
+  %cond = select i1 %tobool, i8* blockaddress(@sterix, %for.cond), i8* blockaddress(@sterix, %exit)
+  store i8* %cond, i8** @label
+  %cmp5 = icmp sgt i32 %n, 0
+  br i1 %cmp5, label %for.body, label %exit
+
+for.cond:
+  %mul = shl nsw i32 %s.06, 1
+  %exitcond = icmp eq i32 %inc, %n
+  br i1 %exitcond, label %exit.loopexit, label %for.body
+
+for.body:
+  %i.07 = phi i32 [ %inc, %for.cond ], [ 0, %entry ]
+  %s.06 = phi i32 [ %mul, %for.cond ], [ 1, %entry ]
+  %inc = add nuw nsw i32 %i.07, 1
+  br label %for.cond
+
+exit.loopexit:
+  %phitmp = icmp ne i32 %s.06, 2
+  %phitmp8 = zext i1 %phitmp to i32
+  br label %exit
+
+exit:
+  %s.1 = phi i32 [ 1, %entry ], [ %phitmp8, %exit.loopexit ]
+  ret i32 %s.1
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/BlockAddressSelfReference.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/BlockAddressSelfReference.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/BlockAddressSelfReference.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/BlockAddressSelfReference.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,50 @@
+; RUN: opt < %s -loop-extract -S | FileCheck %s
+
+ at choum.addr = internal unnamed_addr constant [3 x i8*] [i8* blockaddress(@choum, %bb10), i8* blockaddress(@choum, %bb14), i8* blockaddress(@choum, %bb18)]
+
+; CHECK: define
+; no outlined function
+; CHECK-NOT: define
+
+define void @choum(i32 %arg, i32* nocapture %arg1, i32 %arg2) {
+bb:
+  %tmp = icmp sgt i32 %arg, 0
+  br i1 %tmp, label %bb3, label %bb24
+
+bb3:                                              ; preds = %bb
+  %tmp4 = sext i32 %arg2 to i64
+  %tmp5 = getelementptr inbounds [3 x i8*], [3 x i8*]* @choum.addr, i64 0, i64 %tmp4
+  %tmp6 = load i8*, i8** %tmp5
+  %tmp7 = zext i32 %arg to i64
+  br label %bb8
+
+bb8:                                              ; preds = %bb18, %bb3
+  %tmp9 = phi i64 [ 0, %bb3 ], [ %tmp22, %bb18 ]
+  indirectbr i8* %tmp6, [label %bb10, label %bb14, label %bb18]
+
+bb10:                                             ; preds = %bb8
+  %tmp11 = getelementptr inbounds i32, i32* %arg1, i64 %tmp9
+  %tmp12 = load i32, i32* %tmp11
+  %tmp13 = add nsw i32 %tmp12, 1
+  store i32 %tmp13, i32* %tmp11
+  br label %bb14
+
+bb14:                                             ; preds = %bb10, %bb8
+  %tmp15 = getelementptr inbounds i32, i32* %arg1, i64 %tmp9
+  %tmp16 = load i32, i32* %tmp15
+  %tmp17 = shl nsw i32 %tmp16, 1
+  store i32 %tmp17, i32* %tmp15
+  br label %bb18
+
+bb18:                                             ; preds = %bb14, %bb8
+  %tmp19 = getelementptr inbounds i32, i32* %arg1, i64 %tmp9
+  %tmp20 = load i32, i32* %tmp19
+  %tmp21 = add nsw i32 %tmp20, -3
+  store i32 %tmp21, i32* %tmp19
+  %tmp22 = add nuw nsw i64 %tmp9, 1
+  %tmp23 = icmp eq i64 %tmp22, %tmp7
+  br i1 %tmp23, label %bb24, label %bb8
+
+bb24:                                             ; preds = %bb18, %bb
+  ret void
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/ExtractedFnEntryCount.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/ExtractedFnEntryCount.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/ExtractedFnEntryCount.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/ExtractedFnEntryCount.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,33 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+
+; This test checks to make sure that the CodeExtractor
+;  properly sets the entry count for the function that is
+;  extracted based on the root block being extracted and also
+;  takes into consideration if the block has edges coming from
+;  a block that is also being extracted.
+
+define i32 @inlinedFunc(i1 %cond) !prof !1 {
+entry:
+  br i1 %cond, label %if.then, label %return, !prof !2
+if.then:
+  br i1 %cond, label %if.then, label %return, !prof !3
+return:             ; preds = %entry
+  ret i32 0
+}
+
+
+define internal i32 @dummyCaller(i1 %cond) !prof !1 {
+entry:
+  %val = call i32 @inlinedFunc(i1 %cond)
+  ret i32 %val
+}
+
+; CHECK: @inlinedFunc.1.if.then(i1 %cond) !prof [[COUNT1:![0-9]+]]
+
+
+!llvm.module.flags = !{!0}
+; CHECK: [[COUNT1]] = !{!"function_entry_count", i64 250}
+!0 = !{i32 1, !"MaxFunctionCount", i32 1000}
+!1 = !{!"function_entry_count", i64 1000}
+!2 = !{!"branch_weights", i32 250, i32 750}
+!3 = !{!"branch_weights", i32 125, i32 125}

Added: llvm/trunk/test/Transforms/CodeExtractor/MultipleExitBranchProb.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/MultipleExitBranchProb.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/MultipleExitBranchProb.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/MultipleExitBranchProb.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,34 @@
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=2 -skip-partial-inlining-cost-analysis -S | FileCheck %s
+
+; This test checks to make sure that CodeExtractor updates
+;  the exit branch probabilities for multiple exit blocks.
+
+define i32 @inlinedFunc(i1 %cond) !prof !1 {
+entry:
+  br i1 %cond, label %if.then, label %return, !prof !2
+if.then:
+  br i1 %cond, label %return, label %return.2, !prof !3
+return.2:
+  ret i32 10
+return:             ; preds = %entry
+  ret i32 0
+}
+
+
+define internal i32 @dummyCaller(i1 %cond) !prof !1 {
+entry:
+%val = call i32 @inlinedFunc(i1 %cond)
+ret i32 %val
+
+; CHECK-LABEL: @dummyCaller
+; CHECK: call
+; CHECK-NEXT: br i1 {{.*}}return.i{{.*}}return.2{{.*}}!prof [[COUNT1:![0-9]+]]
+}
+
+!llvm.module.flags = !{!0}
+!0 = !{i32 1, !"MaxFunctionCount", i32 10000}
+!1 = !{!"function_entry_count", i64 10000}
+!2 = !{!"branch_weights", i32 5, i32 5}
+!3 = !{!"branch_weights", i32 4, i32 1}
+
+; CHECK: [[COUNT1]] = !{!"branch_weights", i32 31, i32 8}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,68 @@
+
+;  RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck  %s
+ ; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck   %s
+
+%"class.base" = type { %"struct.base"* }
+%"struct.base" = type opaque
+
+ at g = external local_unnamed_addr global i32, align 4
+
+; Function Attrs: nounwind uwtable
+define i32 @callee_sinkable_bitcast(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL:define{{.*}}@callee_sinkable_bitcast.{{[0-9]}}
+; CHECK: alloca
+; CHECK-NEXT: bitcast
+; CHECK: call void @llvm.lifetime
+bb:
+  %tmp = alloca  %"class.base", align 4
+  %tmp1 = bitcast %"class.base"* %tmp to i8*
+  %tmp2 = load i32, i32* @g, align 4, !tbaa !2
+  %tmp3 = add nsw i32 %tmp2, 1
+  %tmp4 = icmp slt i32 %arg, 0
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb
+  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %tmp1) #2
+  %tmp11 = bitcast %"class.base"* %tmp to i32*
+  store i32 %tmp3, i32* %tmp11, align 4, !tbaa !2
+  store i32 %tmp3, i32* @g, align 4, !tbaa !2
+  call void @bar(i32* nonnull %tmp11) #2
+  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %tmp1) #2
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb
+  %tmp7 = phi i32 [ 1, %bb5 ], [ 0, %bb ]
+  ret i32 %tmp7
+}
+
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
+
+declare void @bar(i32*) local_unnamed_addr #2
+declare void @bar2(i32*, i32*) local_unnamed_addr #1
+
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
+
+; Function Attrs: nounwind uwtable
+define i32 @caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 @callee_sinkable_bitcast(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind uwtable}
+attributes #1 = { argmemonly nounwind }
+attributes #2 = { nounwind }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}
+!2 = !{!3, !3, i64 0}
+!3 = !{!"int", !4, i64 0}
+!4 = !{!"omnipotent char", !5, i64 0}
+!5 = !{!"Simple C/C++ TBAA"}
+
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca2.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca2.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca2.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,65 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck  %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck   %s
+
+%"class.base" = type { %"struct.base"* }
+%"struct.base" = type opaque
+
+ at g = external local_unnamed_addr global i32, align 4
+
+define i32 @callee_no_bitcast(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL:define{{.*}}@callee_no_bitcast.{{[0-9]}}
+; CHECK: alloca
+; CHECK: call void @llvm.lifetime
+bb:
+  %tmp = alloca i8, align 4
+  %tmp2 = load i32, i32* @g, align 4, !tbaa !2
+  %tmp3 = add nsw i32 %tmp2, 1
+  %tmp4 = icmp slt i32 %arg, 0
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb
+  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %tmp) #2
+  store i32 %tmp3, i32* @g, align 4, !tbaa !2
+  %tmp11 = bitcast i8 * %tmp to i32*
+  call void @bar(i32* nonnull %tmp11) #2
+  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %tmp) #2
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb
+  %tmp7 = phi i32 [ 1, %bb5 ], [ 0, %bb ]
+  ret i32 %tmp7
+}
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
+
+declare void @bar(i32*) local_unnamed_addr #2
+declare void @bar2(i32*, i32*) local_unnamed_addr #1
+
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
+
+; Function Attrs: nounwind uwtable
+define i32 @caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 @callee_no_bitcast(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind uwtable}
+attributes #1 = { argmemonly nounwind }
+attributes #2 = { nounwind }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}
+!2 = !{!3, !3, i64 0}
+!3 = !{!"int", !4, i64 0}
+!4 = !{!"omnipotent char", !5, i64 0}
+!5 = !{!"Simple C/C++ TBAA"}
+
+
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca4.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca4.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca4.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca4.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,70 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck  %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck   %s
+
+%"class.base" = type { %"struct.base"* }
+%"struct.base" = type opaque
+
+ at g = external local_unnamed_addr global i32, align 4
+
+; CHECK-LABEL: define{{.*}}@caller(
+; CHECK: call void @llvm.lifetime.start.p0i8(i64 -1, i8* %tmp.i)
+; CHECK-NEXT: call void @callee_unknown_use1.{{.*}}(i8* %tmp.i
+
+define i32 @callee_unknown_use1(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL:define{{.*}}@callee_unknown_use1.{{[0-9]}}
+; CHECK-NOT: alloca
+bb:
+  %tmp = alloca  i8, align 4
+  %tmp2 = load i32, i32* @g, align 4, !tbaa !2
+  %tmp3 = add nsw i32 %tmp2, 1
+  %tmp4 = icmp slt i32 %arg, 0
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb
+  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %tmp) #2
+  store i32 %tmp3, i32* @g, align 4, !tbaa !2
+  %tmp11 = bitcast i8* %tmp to i32*
+  call void @bar(i32* nonnull %tmp11) #2
+  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %tmp) #2
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb
+  %tmp7 = phi i32 [ 1, %bb5 ], [ 0, %bb ]
+  %tmp1 = bitcast i8* %tmp to i32*
+  ret i32 %tmp7
+}
+
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
+
+declare void @bar(i32*) local_unnamed_addr #2
+declare void @bar2(i32*, i32*) local_unnamed_addr #1
+
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
+
+; Function Attrs: nounwind uwtable
+define i32 @caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 @callee_unknown_use1(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind uwtable}
+attributes #1 = { argmemonly nounwind }
+attributes #2 = { nounwind }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}
+!2 = !{!3, !3, i64 0}
+!3 = !{!"int", !4, i64 0}
+!4 = !{!"omnipotent char", !5, i64 0}
+!5 = !{!"Simple C/C++ TBAA"}
+
+
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca5.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca5.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca5.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAlloca5.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,66 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck  %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck   %s
+
+%"class.base" = type { %"struct.base"* }
+%"struct.base" = type opaque
+
+ at g = external local_unnamed_addr global i32, align 4
+
+define i32 @callee_unknown_use2(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL:define{{.*}}@callee_unknown_use2.{{[0-9]}}
+; CHECK-NOT: alloca
+bb:
+  %tmp = alloca i32, align 4
+  %tmp1 = bitcast i32* %tmp to i8*
+  %tmp2 = load i32, i32* @g, align 4, !tbaa !2
+  %tmp3 = add nsw i32 %tmp2, 1
+  %tmp4 = icmp slt i32 %arg, 0
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb
+  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %tmp1) #2
+  store i32 %tmp3, i32* %tmp, align 4, !tbaa !2
+  store i32 %tmp3, i32* @g, align 4, !tbaa !2
+  call void @bar(i32* nonnull %tmp) #2
+  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %tmp1) #2
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb
+  %tmp7 = phi i32 [ 1, %bb5 ], [ 0, %bb ]
+  %tmp10 = bitcast i8* %tmp1 to i32*
+  ret i32 %tmp7
+}
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
+
+declare void @bar(i32*) local_unnamed_addr #2
+declare void @bar2(i32*, i32*) local_unnamed_addr #1
+
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
+
+; Function Attrs: nounwind uwtable
+define i32 @caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 @callee_unknown_use2(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind uwtable}
+attributes #1 = { argmemonly nounwind }
+attributes #2 = { nounwind }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}
+!2 = !{!3, !3, i64 0}
+!3 = !{!"int", !4, i64 0}
+!4 = !{!"omnipotent char", !5, i64 0}
+!5 = !{!"Simple C/C++ TBAA"}
+
+
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAnd.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAnd.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAnd.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAnd.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,56 @@
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S | FileCheck %s
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -max-num-inline-blocks=2 -S | FileCheck --check-prefix=LIMIT %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -max-num-inline-blocks=2 -S | FileCheck  --check-prefix=LIMIT %s
+
+; Function Attrs: nounwind uwtable
+define i32 @bar(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb5
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @channels() #2
+  %tmp3 = icmp slt i32 %tmp2, %arg
+  br i1 %tmp3, label %bb4, label %bb5
+
+bb4:                                              ; preds = %bb1
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  br label %bb5
+
+bb5:                                              ; preds = %bb4, %bb1, %bb
+  %tmp6 = phi i32 [ 0, %bb4 ], [ 1, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp6
+}
+
+declare i32 @channels(...) local_unnamed_addr #1
+
+declare void @foo(...) local_unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call void @bar.1.
+; LIMIT-LABEL: @dummy_caller
+; LIMIT: br i1
+; LIMIT-NOT: br
+; LIMIT: call void @bar.1.
+  %tmp = tail call i32 @bar(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { nounwind }
+attributes #2 = { nounwind }
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAndOr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAndOr.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAndOr.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAndOr.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,63 @@
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S | FileCheck %s
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=3 -S | FileCheck --check-prefix=LIMIT %s
+; RUN: opt < %s -passes=partial-inliner -max-num-inline-blocks=3 -S | FileCheck  --check-prefix=LIMIT %s
+
+; Function Attrs: nounwind uwtable
+define i32 @bar(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb4
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @n() #2
+  %tmp3 = icmp slt i32 %tmp2, %arg
+  br i1 %tmp3, label %bb7, label %bb4
+
+bb4:                                              ; preds = %bb1, %bb
+  %tmp5 = tail call i32 (...) @m() #2
+  %tmp6 = icmp slt i32 %tmp5, %arg
+  br i1 %tmp6, label %bb7, label %bb8
+
+bb7:                                              ; preds = %bb4, %bb1
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  br label %bb8
+
+bb8:                                              ; preds = %bb7, %bb4
+  %tmp9 = phi i32 [ 0, %bb7 ], [ 1, %bb4 ]
+  ret i32 %tmp9
+}
+
+declare i32 @n(...) local_unnamed_addr #1
+
+declare i32 @m(...) local_unnamed_addr #1
+
+declare void @foo(...) local_unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call void @bar.1.
+; LIMIT-LABEL: @dummy_caller
+; LIMIT-NOT: br i1
+; LIMIT: call i32 @bar
+  %tmp = tail call i32 @bar(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind } 
+attributes #1 = { nounwind }
+attributes #2 = { nounwind }
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAttributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAttributes.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAttributes.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineAttributes.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,85 @@
+; RUN: opt < %s -S -partial-inliner -skip-partial-inlining-cost-analysis=true | FileCheck %s
+
+
+define i32 @callee_most(i32 %v) unnamed_addr  #0 #1 {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:
+  %v2 = phi i32 [ %v, %entry ], [ %sub, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+define i32 @callee_noinline(i32 %v) optnone noinline {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:
+  %v2 = phi i32 [ %v, %entry ], [ %sub, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+define i32 @callee_writeonly(i32 %v) writeonly {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:
+  %v2 = phi i32 [ %v, %entry ], [ %sub, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+; CHECK-LABEL: @caller
+; CHECK: call void @callee_most.2.if.then(i32 %v
+; CHECK: call i32 @callee_noinline(i32 %v)
+; CHECK: call void @callee_writeonly.1.if.then(i32 %v
+define i32 @caller(i32 %v) {
+entry:
+  %c1 = call i32 @callee_most(i32 %v)
+  %c2 = call i32 @callee_noinline(i32 %v)
+  %c3 = call i32 @callee_writeonly(i32 %v)
+  ret i32 %c3
+}
+
+; CHECK: define internal void @callee_writeonly.1.if.then(i32 %v, i32* %sub.out) { 
+; CHECK: define internal void @callee_most.2.if.then(i32 %v, i32* %sub.out)  [[FN_ATTRS:#[0-9]+]]
+
+; attributes to preserve
+attributes #0 = {
+  inlinehint minsize noduplicate noimplicitfloat norecurse noredzone nounwind
+  nonlazybind optsize safestack sanitize_address sanitize_hwaddress sanitize_memory
+  sanitize_thread ssp sspreq sspstrong strictfp uwtable "foo"="bar"
+  "patchable-function"="prologue-short-redirect" "probe-stack"="_foo_guard" "stack-probe-size"="4096" }
+
+; CHECK: attributes [[FN_ATTRS]] = { inlinehint minsize noduplicate noimplicitfloat norecurse noredzone nounwind nonlazybind optsize safestack sanitize_address sanitize_hwaddress sanitize_memory sanitize_thread ssp sspreq sspstrong strictfp uwtable "foo"="bar" "patchable-function"="prologue-short-redirect" "probe-stack"="_foo_guard" "stack-probe-size"="4096" }
+
+; attributes to drop
+attributes #1 = {
+  alignstack=16 convergent inaccessiblememonly inaccessiblemem_or_argmemonly naked
+  noreturn readonly argmemonly returns_twice speculatable "thunk"
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineCallRef.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineCallRef.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineCallRef.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineCallRef.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,56 @@
+; RUN: opt < %s -partial-inliner -S  | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S  | FileCheck %s
+
+
+; Function Attrs: nounwind
+declare void @foo(...) local_unnamed_addr #0
+
+; Function Attrs: noinline
+define i32 @caller(i32 (i32)* nocapture %arg, i32 (i32)* nocapture %arg1, i32 %arg2) local_unnamed_addr #1 {
+bb:
+  %tmp = tail call i32 %arg(i32 %arg2) #0
+  %tmp3 = tail call i32 %arg1(i32 %arg2) #0
+  %tmp4 = add nsw i32 %tmp3, %tmp
+  ret i32 %tmp4
+}
+
+; Function Attrs: nounwind
+define i32 @bar(i32 %arg) #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb2
+
+bb1:                                              ; preds = %bb
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  tail call void (...) @foo() #0
+  br label %bb2
+
+bb2:                                              ; preds = %bb1, %bb
+  %tmp3 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp3
+}
+
+; Function Attrs: nounwind
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; check that caller is not wrongly inlined by partial inliner
+; CHECK: call i32 @caller
+; CHECK-NOT: call .* @bar
+  %tmp = tail call i32 @caller(i32 (i32)* nonnull @bar, i32 (i32)* nonnull @bar, i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { noinline }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 5.0.0 (trunk 300897) (llvm/trunk 300947)"}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineDebug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineDebug.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineDebug.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineDebug.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,106 @@
+; RUN: opt < %s -S -partial-inliner -skip-partial-inlining-cost-analysis=true | FileCheck %s
+
+; CHECK-LABEL: @callee
+; CHECK: %mul = mul nsw i32 %v, 10, !dbg ![[DBG1:[0-9]+]]
+define i32 @callee(i32 %v) !dbg !16 {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10, !dbg !17
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10, !dbg !23
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+; CHECK-LABEL: @caller
+; CHECK: codeRepl.i:
+; CHECK-NOT: br label
+; CHECK: call void @callee.2.if.then(i32 %v, i32* %mul.loc.i), !dbg ![[DBG2:[0-9]+]]
+define i32 @caller(i32 %v) !dbg !8 {
+entry:
+  %call = call i32 @callee(i32 %v), !dbg !14
+  ret i32 %call
+}
+
+
+; CHECK-LABEL: @callee2
+; CHECK: %sub = sub i32 %v, 10, !dbg ![[DBG3:[0-9]+]]
+define i32 @callee2(i32 %v) !dbg !18 {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10, !dbg !20
+  br label %if.end
+
+if.end:
+  %v2 = phi i32 [ %v, %entry ], [ %sub, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+; CHECK-LABEL: @caller2
+; CHECK: codeRepl.i:
+; CHECK-NOT: br label
+; CHECK: call void @callee2.1.if.then(i32 %v, i32* %sub.loc.i), !dbg ![[DBG4:[0-9]+]]
+define i32 @caller2(i32 %v) !dbg !21 {
+entry:
+  %call = call i32 @callee2(i32 %v), !dbg !22
+  ret i32 %call
+}
+
+; CHECK-LABEL: define internal void @callee2.1.if.then
+; CHECK: br label %if.then, !dbg ![[DBG5:[0-9]+]]
+
+; CHECK-LABEL: define internal void @callee.2.if.then
+; CHECK: br label %if.then, !dbg ![[DBG6:[0-9]+]]
+
+; CHECK: ![[DBG1]] = !DILocation(line: 10, column: 7,
+; CHECK: ![[DBG2]] = !DILocation(line: 10, column: 7,
+; CHECK: ![[DBG3]] = !DILocation(line: 110, column: 17,
+; CHECK: ![[DBG4]] = !DILocation(line: 110, column: 17,
+; CHECK: ![[DBG5]] = !DILocation(line: 110, column: 17,
+; CHECK: ![[DBG6]] = !DILocation(line: 10, column: 7,
+
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5, !6}
+!llvm.ident = !{!7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0 (trunk 177881)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "test.c", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 4}
+!6 = !{i32 1, !"min_enum_size", i32 4}
+!7 = !{!"clang version 6.0.0"}
+!8 = distinct !DISubprogram(name: "caller", scope: !1, file: !1, line: 3, type: !9, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
+!9 = !DISubroutineType(types: !10)
+!10 = !{!11, !11}
+!11 = !DIBasicType(name: "int", size: 19, encoding: DW_ATE_signed)
+!12 = !{!13}
+!13 = !DILocalVariable(name: "v", arg: 1, scope: !8, file: !1, line: 3, type: !11)
+!14 = !DILocation(line: 5, column: 10, scope: !8)
+!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 9, column: 7)
+!16 = distinct !DISubprogram(name: "callee", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
+!17 = !DILocation(line: 10, column: 7, scope: !15)
+!18 = distinct !DISubprogram(name: "callee2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
+!19 = distinct !DILexicalBlock(scope: !18, file: !1, line: 100, column: 1)
+!20 = !DILocation(line: 110, column: 17, scope: !19)
+!21 = distinct !DISubprogram(name: "caller2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
+!22 = !DILocation(line: 110, column: 17, scope: !21)
+!23 = !DILocation(line: 15, column: 7, scope: !15)

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryPHICost.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryPHICost.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryPHICost.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryPHICost.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,40 @@
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S | FileCheck %s
+
+; Check that we do not overcompute the outlined region cost, where the PHIs in
+; the outlined region entry (BB4) are moved outside the region by CodeExtractor.
+
+define i32 @bar(i32 %arg) {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb2
+
+bb1:
+  br i1 undef, label %bb4, label %bb2
+
+bb2:                                              ; preds = %bb, %bb1
+  br i1 undef, label %bb4, label %bb5
+
+bb4:                                              ; preds = %bb1, %bb2
+  %xx1 = phi i32 [ 1, %bb1 ], [ 9, %bb2 ]
+  %xx2 = phi i32 [ 1, %bb1 ], [ 9, %bb2 ]
+  %xx3 = phi i32 [ 1, %bb1 ], [ 9, %bb2 ]
+  tail call void (...) @foo() #2
+  br label %bb5
+
+bb5:                                              ; preds = %bb4, %bb2
+  %tmp6 = phi i32 [ 1, %bb2 ], [ 9, %bb4 ]
+  ret i32 %tmp6
+}
+
+declare void @foo(...)
+
+define i32 @dummy_caller(i32 %arg) {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call void @bar.1.
+  %tmp = tail call i32 @bar(i32 %arg)
+  ret i32 %tmp
+}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryUpdate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryUpdate.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryUpdate.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineEntryUpdate.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,41 @@
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -partial-inliner -S  | FileCheck %s
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -passes=partial-inliner -S  | FileCheck %s
+
+define i32 @Func(i1 %cond, i32* align 4 %align.val) !prof !1 {
+; CHECK: @Func({{.*}}) !prof [[REMAINCOUNT:![0-9]+]]
+entry:
+  br i1 %cond, label %if.then, label %return
+if.then:
+  ; Dummy store to have more than 0 uses
+  store i32 10, i32* %align.val, align 4
+  br label %return
+return:             ; preds = %entry
+  ret i32 0
+}
+
+define internal i32 @Caller1(i1 %cond, i32* align 2 %align.val) !prof !3{
+entry:
+; CHECK-LABEL: @Caller1
+; CHECK: br
+; CHECK: call void @Func.1.
+; CHECK: br
+; CHECK: call void @Func.1.
+  %val = call i32 @Func(i1 %cond, i32* %align.val)
+  %val2 = call i32 @Func(i1 %cond, i32* %align.val)
+  ret i32 %val
+}
+
+define internal i32 @Caller2(i1 %cond, i32* align 2 %align.val) !prof !2{
+entry:
+; CHECK-LABEL: @Caller2
+; CHECK: br
+; CHECK: call void @Func.1.
+  %val = call i32 @Func(i1 %cond, i32* %align.val)
+  ret i32 %val
+}
+
+; CHECK: [[REMAINCOUNT]] = !{!"function_entry_count", i64 150}
+!1 = !{!"function_entry_count", i64 200}
+!2 = !{!"function_entry_count", i64 10}
+!3 = !{!"function_entry_count", i64 20}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineHighCost.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineHighCost.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineHighCost.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineHighCost.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,107 @@
+; The outlined region has high frequency  and the outlining
+; call sequence is expensive (input, output, multiple exit etc)
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=2 -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -max-num-inline-blocks=2 -S | FileCheck %s
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -max-num-inline-blocks=2 -S | FileCheck --check-prefix=NOCOST %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -max-num-inline-blocks=2 -S | FileCheck  --check-prefix=NOCOST %s
+
+
+; Function Attrs: nounwind
+define i32 @bar_hot_outline_region(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb16, !prof !1
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @foo() #0
+  %tmp3 = tail call i32 (...) @foo() #0
+  %tmp4 = tail call i32 (...) @foo() #0
+  %tmp5 = tail call i32 (...) @foo() #0
+  %tmp6 = tail call i32 (...) @foo() #0
+  %tmp7 = tail call i32 (...) @foo() #0
+  %tmp8 = add nsw i32 %arg, 1
+  %tmp9 = tail call i32 @goo(i32 %tmp8) #0
+  %tmp10 = tail call i32 (...) @foo() #0
+  %tmp11 = icmp eq i32 %tmp10, 0
+  br i1 %tmp11, label %bb12, label %bb16
+
+bb12:                                             ; preds = %bb1
+  %tmp13 = tail call i32 (...) @foo() #0
+  %tmp14 = icmp eq i32 %tmp13, 0
+  %tmp15 = select i1 %tmp14, i32 0, i32 3
+  br label %bb16
+
+bb16:                                             ; preds = %bb12, %bb1, %bb
+  %tmp17 = phi i32 [ 2, %bb1 ], [ %tmp15, %bb12 ], [ 0, %bb ]
+  ret i32 %tmp17
+}
+
+define i32 @bar_cold_outline_region(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb16, !prof !2
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @foo() #0
+  %tmp3 = tail call i32 (...) @foo() #0
+  %tmp4 = tail call i32 (...) @foo() #0
+  %tmp5 = tail call i32 (...) @foo() #0
+  %tmp6 = tail call i32 (...) @foo() #0
+  %tmp7 = tail call i32 (...) @foo() #0
+  %tmp8 = add nsw i32 %arg, 1
+  %tmp9 = tail call i32 @goo(i32 %tmp8) #0
+  %tmp10 = tail call i32 (...) @foo() #0
+  %tmp11 = icmp eq i32 %tmp10, 0
+  br i1 %tmp11, label %bb12, label %bb16
+
+bb12:                                             ; preds = %bb1
+  %tmp13 = tail call i32 (...) @foo() #0
+  %tmp14 = icmp eq i32 %tmp13, 0
+  %tmp15 = select i1 %tmp14, i32 0, i32 3
+  br label %bb16
+
+bb16:                                             ; preds = %bb12, %bb1, %bb
+  %tmp17 = phi i32 [ 2, %bb1 ], [ %tmp15, %bb12 ], [ 0, %bb ]
+  ret i32 %tmp17
+}
+
+; Function Attrs: nounwind
+declare i32 @foo(...) local_unnamed_addr #0
+
+; Function Attrs: nounwind
+declare i32 @goo(i32) local_unnamed_addr #0
+
+; Function Attrs: nounwind
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK-NOT: br i1
+; CHECK-NOT: call{{.*}}bar_hot_outline_region. 
+; NOCOST-LABEL: @dummy_caller
+; NOCOST: br i1
+; NOCOST: call{{.*}}bar_hot_outline_region.
+
+  %tmp = tail call i32 @bar_hot_outline_region(i32 %arg)
+  ret i32 %tmp
+}
+
+define i32 @dummy_caller2(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller2
+; CHECK: br i1
+; CHECK: call{{.*}}bar_cold_outline_region.
+; NOCOST-LABEL: @dummy_caller2
+; NOCOST: br i1
+; NOCOST: call{{.*}}bar_cold_outline_region.
+
+  %tmp = tail call i32 @bar_cold_outline_region(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 5.0.0 (trunk 301898)"}
+!1 = !{!"branch_weights", i32 2000, i32 1}
+!2 = !{!"branch_weights", i32 1, i32 100}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineInvokeProducesOutVal.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineInvokeProducesOutVal.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineInvokeProducesOutVal.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineInvokeProducesOutVal.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,51 @@
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+
+; Function Attrs: nounwind uwtable
+define dso_local i8* @bar(i32 %arg) local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb1, label %bb5
+
+bb1:                                              ; preds = %bb
+  %call26 = invoke i8* @invoke_callee() #2
+          to label %cont unwind label %lpad
+lpad:                                            ; preds = %if.end
+  %0 = landingpad { i8*, i32 }
+         cleanup
+  resume { i8*, i32 } undef
+
+cont:
+    br label %bb5
+
+bb5:                                              ; preds = %bb4, %bb1, %bb
+  %retval = phi i8* [ %call26, %cont ], [ undef, %bb]
+  ret i8* %retval
+}
+
+; CHECK-LABEL: @dummy_caller
+; CHECK-LABEL: bb:
+; CHECK-NEXT:  [[CALL26LOC:%.*]] = alloca i8*
+; CHECK-LABEL: codeRepl.i:
+; CHECK-NEXT:   %lt.cast.i = bitcast i8** [[CALL26LOC]] to i8*
+; CHECK-NEXT:   call void @llvm.lifetime.start.p0i8(i64 -1, i8* %lt.cast.i)
+; CHECK-NEXT:   call void @bar.1.bb1(i8** [[CALL26LOC]])
+; CHECK-NEXT:   %call26.reload.i = load i8*, i8** [[CALL26LOC]]
+; CHECK-NEXT:   call void @llvm.lifetime.end.p0i8(i64 -1, i8* %lt.cast.i)
+define i8* @dummy_caller(i32 %arg) {
+bb:
+  %tmp = tail call i8* @bar(i32 %arg)
+  ret i8* %tmp
+}
+
+; CHECK-LABEL: define internal void @bar.1.bb1
+; CHECK-LABEL: bb1:
+; CHECK-NEXT:    %call26 = invoke i8* @invoke_callee()
+; CHECK-NEXT:            to label %cont unwind label %lpad
+; CHECK-LABEL: cont:
+; CHECK-NEXT:    store i8* %call26, i8** %call26.out
+; CHECK-NEXT:    br label %bb5.exitStub
+
+; Function Attrs: nobuiltin
+declare dso_local noalias nonnull i8* @invoke_callee() local_unnamed_addr #1
+
+declare dso_local i32 @__gxx_personality_v0(...)

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineLiveAcross.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineLiveAcross.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineLiveAcross.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineLiveAcross.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,61 @@
+; RUN: opt -S  -partial-inliner -max-num-inline-blocks=2 -skip-partial-inlining-cost-analysis < %s  | FileCheck %s
+; RUN: opt -S -passes=partial-inliner -max-num-inline-blocks=2 -skip-partial-inlining-cost-analysis < %s  | FileCheck %s
+define i32 @test(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 (...) @bar() #1
+  %tmp1 = icmp slt i32 %arg, 0
+  br i1 %tmp1, label %bb6, label %bb2
+
+bb2:                                              ; preds = %bb
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  %tmp3 = tail call i32 (...) @bar() #1
+  %tmp4 = icmp eq i32 %tmp3, 10
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb2
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb2, %bb
+  %tmp7 = phi i32 [ %tmp, %bb5 ], [ 0, %bb ], [ %tmp, %bb2 ]
+  ret i32 %tmp7
+}
+
+declare i32 @bar(...) local_unnamed_addr #1
+
+declare void @foo(...) local_unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL: @dummy_caller
+; CHECK: codeRepl.i:
+; CHECK:  call void @test.1.bb2()
+; CHECK-NOT: load
+; CHECK  br
+
+bb:
+  %tmp = tail call i32 @test(i32 %arg)
+  ret i32 %tmp
+}
+
+; CHECK-LABEL: define internal void @test.1.bb2()
+; CHECK: .exitStub:
+; CHECK-NOT:  store i32 %tmp7, i32* %tmp7.out
+; CHECK: ret
+
+
+attributes #0 = { nounwind uwtable }
+attributes #1 = { nounwind uwtable }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoInline.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoInline.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoInline.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoInline.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,45 @@
+; RUN: opt < %s -partial-inliner -S -stats -pass-remarks=partial-inlining 2>&1 | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S -stats -pass-remarks=partial-inlining 2>&1 | FileCheck %s
+
+ at stat = external global i32, align 4
+
+define i32 @inline_fail(i32 %count, ...) {
+entry:
+  %vargs = alloca i8*, align 8
+  %vargs1 = bitcast i8** %vargs to i8*
+  call void @llvm.va_start(i8* %vargs1)
+  %stat1 = load i32, i32* @stat, align 4
+  %cmp = icmp slt i32 %stat1, 0
+  br i1 %cmp, label %bb2, label %bb1
+
+bb1:                                              ; preds = %entry
+  %vg1 = add nsw i32 %stat1, 1
+  store i32 %vg1, i32* @stat, align 4
+  %va1 = va_arg i8** %vargs, i32
+  call void @foo(i32 %count, i32 %va1) #2
+  br label %bb2
+
+bb2:                                              ; preds = %bb1, %entry
+  %res = phi i32 [ 1, %bb1 ], [ 0, %entry ]
+  call void @llvm.va_end(i8* %vargs1)
+  ret i32 %res
+}
+
+define i32 @caller(i32 %arg) {
+bb:
+  %res = tail call i32 (i32, ...) @inline_fail(i32 %arg, i32 %arg)
+  ret i32 %res
+}
+
+declare void @foo(i32, i32)
+declare void @llvm.va_start(i8*)
+declare void @llvm.va_end(i8*)
+
+; Check that no remarks have been emitted, inline_fail has not been partial
+; inlined, no code has been extracted and the partial-inlining counter
+; has not been incremented.
+
+; CHECK-NOT: remark
+; CHECK: tail call i32 (i32, ...) @inline_fail(i32 %arg, i32 %arg)
+; CHECK-NOT: inline_fail.1_bb1
+; CHECK-NOT: partial-inlining

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoLiveOut.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoLiveOut.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoLiveOut.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNoLiveOut.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,62 @@
+; RUN: opt -S -partial-inliner -max-num-inline-blocks=2 -skip-partial-inlining-cost-analysis  < %s  | FileCheck %s
+; RUN: opt -S -passes=partial-inliner -max-num-inline-blocks=2  -skip-partial-inlining-cost-analysis < %s  | FileCheck %s
+
+define i32 @test(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = tail call i32 (...) @bar() #1
+  %tmp1 = icmp slt i32 %arg, 0
+  br i1 %tmp1, label %bb6, label %bb2
+
+bb2:                                              ; preds = %bb
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  %tmp3 = tail call i32 (...) @bar() #1
+  %tmp4 = icmp eq i32 %tmp3, 10
+  br i1 %tmp4, label %bb6, label %bb5
+
+bb5:                                              ; preds = %bb2
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  br label %bb6
+
+bb6:                                              ; preds = %bb5, %bb2, %bb
+  %tmp7 = phi i32 [ 1, %bb5 ], [ 0, %bb ], [ 1, %bb2 ]
+  ret i32 %tmp7
+}
+
+; Function Attrs: nounwind uwtable
+declare i32 @bar(...) local_unnamed_addr #0
+
+; Function Attrs: nounwind uwtable
+declare void @foo(...) local_unnamed_addr #0
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+; CHECK-LABEL: @dummy_caller
+; CHECK: codeRepl.i:
+; CHECK:  call void @test.1.bb2()
+; CHECK-NOT: load
+; CHECK  br
+bb:
+  %tmp = tail call i32 @test(i32 %arg)
+  ret i32 %tmp
+}
+
+; CHECK-LABEL: define internal void @test.1.bb2()
+; CHECK: .exitStub:
+; CHECK-NOT:  store i32 %tmp7, i32* %tmp7.out
+; CHECK: ret
+
+attributes #0 = { nounwind uwtable }
+attributes #1 = { nounwind }
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 303574)"}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNotViable.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNotViable.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNotViable.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineNotViable.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,63 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+;
+
+define i32 @callee_indr_branch(i32 %v) {
+entry:
+  %cmp = icmp sgt i32 %v, 2000
+  %addr = select i1 %cmp, i8* blockaddress(@callee_indr_branch, %if.then), i8* blockaddress(@callee_indr_branch, %if.end)
+  indirectbr i8* %addr, [ label %if.then, label %if.end]
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+declare void @use_fp(i8 *)
+declare void @llvm.localescape(...)
+declare i8* @llvm.frameaddress(i32)
+declare i8* @llvm.localrecover(i8*, i8*, i32)
+
+
+
+define i32 @callee_frameescape(i32 %v) {
+entry:
+  %a = alloca i32
+  call void (...) @llvm.localescape(i32* %a)
+  %cmp = icmp sgt i32 %v, 2000
+  br i1 %cmp, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10
+  br label %if.then2
+
+if.then2:
+  %sub = sub i32 %v, 10
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then2 ]
+  %add = add nsw i32 %v2, 200
+  ret i32 %add
+}
+
+
+; CHECK-LABEL: @caller
+; CHECK: %r1 = call i32 @callee_indr_branch(i32 %v)
+; CHECK-NEXT: %r2 = call i32 @callee_frameescape(i32 %v)
+define i32 @caller(i32 %v) {
+entry:
+  %r1 = call i32 @callee_indr_branch(i32 %v)
+  %r2 = call i32 @callee_frameescape(i32 %v)
+  %res = add i32 %r1, %r2
+  ret i32 %res
+}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineORECrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineORECrash.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineORECrash.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineORECrash.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,170 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -inline-threshold=0 -disable-output
+
+target datalayout = "e-m:e-i64:64-n32:64"
+target triple = "powerpc64le-unknown-linux-gnu"
+
+%0 = type { i32 (...)**, %1, %1, %3, %3, %3, i8, float, %4*, %5*, %5*, i32, i32, i32, i32, float, float, float, i8*, i32, float, float, float, i8, [7 x i8] }
+%1 = type { %2, %3 }
+%2 = type { [3 x %3] }
+%3 = type { [4 x float] }
+%4 = type <{ i8*, i16, i16, [4 x i8], i8*, i32, %3, %3, [4 x i8] }>
+%5 = type { i32 (...)**, i32, i8* }
+%6 = type <{ %7, [4 x i8], %19*, %20*, %30, %35, %3, float, i8, i8, i8, i8, %37, i32, [4 x i8] }>
+%7 = type <{ %8, [7 x i8], void (%16*, float)*, void (%16*, float)*, i8*, %17 }>
+%8 = type <{ i32 (...)**, %9, %11*, %12, %13*, %14*, %15*, i8 }>
+%9 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %0**, i8, [7 x i8] }>
+%11 = type { i32 (...)** }
+%12 = type { float, i32, i32, float, i8, %15*, i8, i8, i8, float, i8, float, %13* }
+%13 = type opaque
+%14 = type { i32 (...)** }
+%15 = type { i32 (...)** }
+%16 = type <{ %8, [7 x i8], void (%16*, float)*, void (%16*, float)*, i8*, %17, [4 x i8] }>
+%17 = type { %18 }
+%18 = type { float, float, float, float, float, i32, float, float, float, float, float, i32, float, float, float, i32, i32 }
+%19 = type { i32 (...)** }
+%20 = type <{ i32 (...)**, %21, %25, %9, i8, [7 x i8] }>
+%21 = type { %22 }
+%22 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %24*, i8, [7 x i8] }>
+%24 = type { i32, i32 }
+%25 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %27**, i8, [7 x i8] }>
+%27 = type { i32, [4 x i8], [4 x %29], i8*, i8*, i32, float, float, i32 }
+%29 = type <{ %3, %3, %3, %3, %3, float, float, float, i32, i32, i32, i32, [4 x i8], i8*, float, i8, [3 x i8], float, float, i32, %3, %3, [4 x i8] }>
+%30 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %32**, i8, [7 x i8] }>
+%32 = type { i32 (...)**, i32, i32, i32, i8, %33*, %33*, float, float, %3, %3, %3 }
+%33 = type <{ %0, %2, %3, %3, float, %3, %3, %3, %3, %3, %3, %3, float, float, i8, [3 x i8], float, float, float, float, float, float, %34*, %30, i32, i32, i32, [4 x i8] }>
+%34 = type { i32 (...)** }
+%35 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %33**, i8, [7 x i8] }>
+%37 = type <{ i8, [3 x i8], i32, i32, [4 x i8], %39**, i8, [7 x i8] }>
+%39 = type { i32 (...)** }
+%40 = type <{ i32 (...)**, %9, %11*, %12, %13*, %14*, %15*, i8, [7 x i8] }>
+
+ at gDisableDeactivation = external local_unnamed_addr global i8, align 1
+ at 0 = external dso_local unnamed_addr constant [29 x i8], align 1
+ at 1 = external dso_local unnamed_addr constant [14 x i8], align 1
+ at 2 = external dso_local unnamed_addr constant [22 x i8], align 1
+ at gDeactivationTime = external local_unnamed_addr global float, align 4
+
+declare void @_ZN15CProfileManager12Stop_ProfileEv() local_unnamed_addr
+
+declare void @_ZN15CProfileManager13Start_ProfileEPKc(i8*) local_unnamed_addr
+
+declare void @_ZN17btCollisionObject18setActivationStateEi(%0*, i32 signext) local_unnamed_addr
+
+declare hidden void @__clang_call_terminate(i8*) local_unnamed_addr
+
+declare i32 @__gxx_personality_v0(...)
+
+; Function Attrs: argmemonly nounwind
+declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #0
+
+define void @_ZN23btDiscreteDynamicsWorld28internalSingleStepSimulationEf(%6*, float) unnamed_addr align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !prof !27 {
+  invoke void null(%6* nonnull %0, float %1)
+          to label %5 unwind label %3
+
+; <label>:3:                                      ; preds = %2
+  %4 = landingpad { i8*, i32 }
+          cleanup
+  br label %16
+
+; <label>:5:                                      ; preds = %2
+  %6 = invoke %15* null(%40* null)
+          to label %11 unwind label %13
+
+; <label>:7:                                      ; preds = %5
+  invoke void null(%40* null)
+          to label %8 unwind label %13
+
+; <label>:8:                                      ; preds = %7
+  invoke void null(%6* nonnull %0)
+          to label %9 unwind label %13
+
+; <label>:9:                                      ; preds = %8
+  invoke void null(%6* nonnull %0, %17* nonnull dereferenceable(68) null)
+          to label %10 unwind label %13
+
+; <label>:10:                                     ; preds = %9
+  invoke void null(%6* nonnull %0, float %1)
+          to label %11 unwind label %13
+
+; <label>:11:
+  invoke void @_ZN23btDiscreteDynamicsWorld21updateActivationStateEf(%6* nonnull %0, float %1)
+          to label %12 unwind label %13
+
+; <label>:12:
+  ret void  
+ 
+; <label>:13:
+  %14 = landingpad { i8*, i32 }
+          cleanup
+  %15 = extractvalue { i8*, i32 } %14, 0
+  br label %16
+
+
+; <label>:16:
+  call void @_ZN15CProfileManager12Stop_ProfileEv()
+  resume { i8*, i32 } zeroinitializer
+}
+
+define void @_ZN23btDiscreteDynamicsWorld21updateActivationStateEf(%6* nocapture readonly, float) local_unnamed_addr align 2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) !prof !27 {
+  %3 = icmp sgt i32 0, 0
+  br i1 %3, label %4, label %5, !prof !29
+
+; <label>:4:                                      ; preds = %2
+  br i1 false, label %5, label %6, !prof !30
+
+; <label>:5:                                      ; preds = %7, %4, %2
+  ret void
+
+; <label>:6:                                      ; preds = %4
+  invoke void @_ZN17btCollisionObject18setActivationStateEi(%0* nonnull null, i32 signext 0)
+          to label %7 unwind label %8
+
+; <label>:7:                                      ; preds = %6
+  invoke void @_ZN17btCollisionObject18setActivationStateEi(%0* nonnull null, i32 signext 1)
+          to label %5 unwind label %8
+
+; <label>:8:                                      ; preds = %7, %6
+  %9 = landingpad { i8*, i32 }
+          cleanup
+  resume { i8*, i32 } %9
+}
+
+; Function Attrs: noreturn nounwind
+declare void @llvm.trap() #1
+
+attributes #0 = { argmemonly nounwind }
+attributes #1 = { noreturn nounwind }
+
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"ProfileSummary", !1}
+!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
+!2 = !{!"ProfileFormat", !"InstrProf"}
+!3 = !{!"TotalCount", i64 6540578580}
+!4 = !{!"MaxCount", i64 629805108}
+!5 = !{!"MaxInternalCount", i64 40670372}
+!6 = !{!"MaxFunctionCount", i64 629805108}
+!7 = !{!"NumCounts", i64 8554}
+!8 = !{!"NumFunctions", i64 3836}
+!9 = !{!"DetailedSummary", !10}
+!10 = !{!11, !12, !13, !14, !15, !16, !16, !17, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26}
+!11 = !{i32 10000, i64 629805108, i32 1}
+!12 = !{i32 100000, i64 366853677, i32 2}
+!13 = !{i32 200000, i64 196816893, i32 4}
+!14 = !{i32 300000, i64 192575561, i32 7}
+!15 = !{i32 400000, i64 130688163, i32 11}
+!16 = !{i32 500000, i64 74857169, i32 19}
+!17 = !{i32 600000, i64 48184151, i32 30}
+!18 = !{i32 700000, i64 21298588, i32 49}
+!19 = !{i32 800000, i64 10721033, i32 90}
+!20 = !{i32 900000, i64 3301634, i32 202}
+!21 = !{i32 950000, i64 1454952, i32 362}
+!22 = !{i32 990000, i64 343872, i32 675}
+!23 = !{i32 999000, i64 46009, i32 1112}
+!24 = !{i32 999900, i64 6067, i32 1435}
+!25 = !{i32 999990, i64 700, i32 1721}
+!26 = !{i32 999999, i64 72, i32 1955}
+!27 = !{!"function_entry_count", i64 700}
+!28 = !{!"branch_weights", i32 701, i32 1}
+!29 = !{!"branch_weights", i32 954001, i32 701}
+!30 = !{!"branch_weights", i32 1, i32 954001}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOptRemark.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOptRemark.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOptRemark.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOptRemark.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,138 @@
+; RUN: opt -S -partial-inliner -pass-remarks=partial-inlining  -disable-output < %s 2>&1 | FileCheck %s
+; RUN: opt -S -passes=partial-inliner  -pass-remarks=partial-inlining -disable-output < %s 2>&1 | FileCheck %s
+; RUN: opt -S -partial-inliner -pass-remarks=partial-inlining  -disable-output -max-partial-inlining=1 < %s 2>&1 | FileCheck %s
+; RUN: opt -S -passes=partial-inliner  -pass-remarks=partial-inlining -disable-output -max-partial-inlining=1 < %s 2>&1 | FileCheck %s
+
+; RUN: opt -S -partial-inliner -pass-remarks=partial-inlining  -disable-partial-inlining < %s 2>&1 | FileCheck --check-prefix=LIMIT %s
+; RUN: opt -S -passes=partial-inliner  -pass-remarks=partial-inlining  --disable-partial-inlining < %s 2>&1 | FileCheck  --check-prefix=LIMIT %s
+; RUN: opt -S -partial-inliner -pass-remarks=partial-inlining   -max-partial-inlining=0 < %s 2>&1 | FileCheck --check-prefix=LIMIT  %s
+; RUN: opt -S -passes=partial-inliner  -pass-remarks=partial-inlining  -max-partial-inlining=0 < %s 2>&1 | FileCheck --check-prefix=LIMIT  %s
+; RUN: opt -S -partial-inliner -pass-remarks=partial-inlining   -inline-threshold=0 < %s 2>&1 | FileCheck --check-prefix=LIMIT  %s
+; RUN: opt -S -passes=partial-inliner  -pass-remarks=partial-inlining  -inline-threshold=0 < %s 2>&1 | FileCheck --check-prefix=LIMIT  %s
+
+define i32 @bar(i32 %arg) local_unnamed_addr #0 !dbg !5 {
+bb:
+  %tmp = icmp slt i32 %arg, 0, !dbg !7
+  br i1 %tmp, label %bb1, label %bb2, !dbg !8
+
+bb1:                                              ; preds = %bb
+  tail call void (...) @foo() #0, !dbg !9
+  tail call void (...) @foo() #0, !dbg !10
+  tail call void (...) @foo() #0, !dbg !11
+  tail call void (...) @foo() #0, !dbg !12
+  tail call void (...) @foo() #0, !dbg !13
+  tail call void (...) @foo() #0, !dbg !14
+  tail call void (...) @foo() #0, !dbg !15
+  tail call void (...) @foo() #0, !dbg !16
+  tail call void (...) @foo() #0, !dbg !17
+  br label %bb2, !dbg !18
+
+bb2:                                              ; preds = %bb1, %bb
+  %tmp3 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp3, !dbg !19
+}
+
+define i32 @bar_noinline(i32 %arg) local_unnamed_addr #1 !dbg !23 {
+bb:
+  %tmp = icmp slt i32 %arg, 0, !dbg !24
+  br i1 %tmp, label %bb1, label %bb2, !dbg !24
+
+bb1:                                              ; preds = %bb
+  tail call void (...) @foo() #0, !dbg !24
+  tail call void (...) @foo() #0, !dbg !24
+  tail call void (...) @foo() #0, !dbg !24
+  br label %bb2, !dbg !24
+
+bb2:                                              ; preds = %bb1, %bb
+  %tmp3 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp3, !dbg !24
+}
+
+define i32 @bar_alwaysinline(i32 %arg) local_unnamed_addr #2 !dbg !25 {
+bb:
+  %tmp = icmp slt i32 %arg, 0, !dbg !26
+  br i1 %tmp, label %bb1, label %bb2, !dbg !26
+
+bb1:                                              ; preds = %bb
+  tail call void (...) @foo() #0, !dbg !26
+  tail call void (...) @foo() #0, !dbg !26
+  tail call void (...) @foo() #0, !dbg !26
+  br label %bb2, !dbg !26
+
+bb2:                                              ; preds = %bb1, %bb
+  %tmp3 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp3, !dbg !26
+}
+
+define i32 @bar_cold(i32 %arg) local_unnamed_addr #3 !dbg !27 {
+bb:
+  %tmp = icmp slt i32 %arg, 0, !dbg !28
+  br i1 %tmp, label %bb1, label %bb2, !dbg !28
+
+bb1:                                              ; preds = %bb
+  tail call void (...) @foo() #0, !dbg !28
+  tail call void (...) @foo() #0, !dbg !28
+  tail call void (...) @foo() #0, !dbg !28
+  br label %bb2, !dbg !28
+
+bb2:                                              ; preds = %bb1, %bb
+  %tmp3 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp3, !dbg !28
+}
+
+; Function Attrs: nounwind
+declare void @foo(...) local_unnamed_addr #0
+
+; Function Attrs: nounwind
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 !dbg !20 {
+bb:
+; CHECK:remark{{.*}}bar partially inlined into dummy_caller
+; CHECK-NOT:remark{{.*}}bar_noinline partially inlined into dummy_caller
+; CHECK-NOT:remark{{.*}}bar_alwaysinline partially inlined into dummy_caller
+; CHECK-NOT:remark{{.*}}bar_cold partially inlined into dummy_caller
+; LIMIT-NOT:remark{{.*}}bar partially inlined into dummy_caller
+  %tmp = tail call i32 @bar(i32 %arg), !dbg !21
+  %tmp2 = tail call i32 @bar_noinline(i32 %arg), !dbg !21
+  %tmp3 = tail call i32 @bar_alwaysinline(i32 %arg), !dbg !21
+  %tmp4 = tail call i32 @bar_cold(i32 %arg), !dbg !21
+  ret i32 %tmp, !dbg !22
+}
+
+attributes #0 = { nounwind }
+attributes #1 = { noinline nounwind }
+attributes #2 = { alwaysinline nounwind }
+attributes #3 = { cold nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3}
+!llvm.ident = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug, enums: !2)
+!1 = !DIFile(filename: "t.c", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = !{!"clang "}
+!5 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !6, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!6 = !DISubroutineType(types: !2)
+!7 = !DILocation(line: 4, column: 14, scope: !5)
+!8 = !DILocation(line: 4, column: 6, scope: !5)
+!9 = !DILocation(line: 5, column: 5, scope: !5)
+!10 = !DILocation(line: 6, column: 5, scope: !5)
+!11 = !DILocation(line: 7, column: 5, scope: !5)
+!12 = !DILocation(line: 8, column: 5, scope: !5)
+!13 = !DILocation(line: 9, column: 5, scope: !5)
+!14 = !DILocation(line: 10, column: 5, scope: !5)
+!15 = !DILocation(line: 11, column: 5, scope: !5)
+!16 = !DILocation(line: 12, column: 5, scope: !5)
+!17 = !DILocation(line: 13, column: 5, scope: !5)
+!18 = !DILocation(line: 14, column: 5, scope: !5)
+!19 = !DILocation(line: 17, column: 1, scope: !5)
+!20 = distinct !DISubprogram(name: "dummy_caller", scope: !1, file: !1, line: 19, type: !6, isLocal: false, isDefinition: true, scopeLine: 19, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!21 = !DILocation(line: 21, column: 11, scope: !20)
+!22 = !DILocation(line: 21, column: 4, scope: !20)
+!23 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !6, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!24 = !DILocation(line: 4, column: 6, scope: !23)
+!25 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !6, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!26 = !DILocation(line: 4, column: 6, scope: !25)
+!27 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !6, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
+!28 = !DILocation(line: 4, column: 6, scope: !27)

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOr.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOr.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOr.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,97 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=2 -S | FileCheck --check-prefix=LIMIT %s
+; RUN: opt < %s -passes=partial-inliner -max-num-inline-blocks=2 -S | FileCheck  --check-prefix=LIMIT %s
+
+; Function Attrs: nounwind uwtable
+define i32 @bar(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb4, label %bb1
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @channels() #1
+  %tmp3 = icmp slt i32 %tmp2, %arg
+  br i1 %tmp3, label %bb4, label %bb5
+
+bb4:                                              ; preds = %bb1, %bb
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  br label %bb5
+
+bb5:                                              ; preds = %bb4, %bb1
+  %.0 = phi i32 [ 0, %bb4 ], [ 1, %bb1 ]
+  ret i32 %.0
+}
+
+declare i32 @channels(...) local_unnamed_addr
+
+declare void @foo(...) local_unnamed_addr
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call void @bar.2.
+; LIMIT-LABEL: @dummy_caller
+; LIMIT-NOT: br
+; LIMIT: call i32 @bar(
+  %tmp = tail call i32 @bar(i32 %arg)
+  ret i32 %tmp
+}
+
+define i32 @bar_multi_ret(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb4, label %bb1
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @channels() #1
+  %tmp3 = icmp slt i32 %tmp2, %arg
+  br i1 %tmp3, label %bb4, label %bb5
+
+bb4:                                              ; preds = %bb1, %bb
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  tail call void (...) @foo() #1
+  %tmp4 = icmp slt i32 %arg, 10
+  br i1 %tmp4, label %bb6, label %bb5
+bb6:
+  tail call void (...) @foo() #1
+  %tmp5 = icmp slt i32 %arg, 3
+  br i1 %tmp5, label %bb7, label %bb5
+bb7:
+  tail call void (...) @foo() #1
+  br label %bb8
+bb8:
+  ret i32 0 
+
+bb5:                                              ; preds = %bb4, %bb1
+  %.0 = phi i32 [ 0, %bb4 ], [ 1, %bb1 ], [0, %bb6]
+  ret i32 %.0
+}
+
+define i32 @dummy_caller2(i32 %arg) local_unnamed_addr #0 {
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call {{.*}} @bar_multi_ret.1.
+  %tmp = tail call i32 @bar_multi_ret(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind uwtable }
+attributes #1 = { nounwind }
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 5.0.0 (trunk 300576)"}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOrAnd.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOrAnd.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOrAnd.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineOrAnd.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,71 @@
+; RUN: opt < %s -partial-inliner -S | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S | FileCheck %s
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=3 -skip-partial-inlining-cost-analysis  -S | FileCheck --check-prefix=LIMIT3 %s
+; RUN: opt < %s -passes=partial-inliner -max-num-inline-blocks=3 -skip-partial-inlining-cost-analysis -S | FileCheck  --check-prefix=LIMIT3 %s
+; RUN: opt < %s -partial-inliner -max-num-inline-blocks=2 -S | FileCheck --check-prefix=LIMIT2 %s
+; RUN: opt < %s -passes=partial-inliner -max-num-inline-blocks=2 -S | FileCheck  --check-prefix=LIMIT2 %s
+
+
+; Function Attrs: nounwind uwtable
+define i32 @bar(i32 %arg) local_unnamed_addr #0 {
+bb:
+  %tmp = icmp slt i32 %arg, 0
+  br i1 %tmp, label %bb4, label %bb1
+
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 (...) @n() #2
+  %tmp3 = icmp slt i32 %tmp2, %arg
+  br i1 %tmp3, label %bb4, label %bb8
+
+bb4:                                              ; preds = %bb1, %bb
+  %tmp5 = tail call i32 (...) @m() #2
+  %tmp6 = icmp sgt i32 %tmp5, %arg
+  br i1 %tmp6, label %bb7, label %bb8
+
+bb7:                                              ; preds = %bb4
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  tail call void (...) @foo() #2
+  br label %bb8
+
+bb8:                                              ; preds = %bb7, %bb4, %bb1
+  %tmp9 = phi i32 [ 0, %bb7 ], [ 1, %bb4 ], [ 1, %bb1 ]
+  ret i32 %tmp9
+}
+
+declare i32 @n(...) local_unnamed_addr #1
+
+declare i32 @m(...) local_unnamed_addr #1
+
+declare void @foo(...) local_unnamed_addr #1
+
+; Function Attrs: nounwind uwtable
+define i32 @dummy_caller(i32 %arg) local_unnamed_addr #0 {
+bb:
+; CHECK-LABEL: @dummy_caller
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: br i1
+; CHECK: call void @bar.1.
+; LIMIT3-LABEL: @dummy_caller
+; LIMIT3: br i1
+; LIMIT3: br i1
+; LIMIT3-NOT: br i1
+; LIMIT3: call void @bar.1.
+; LIMIT2-LABEL: @dummy_caller
+; LIMIT2-NOT: br i1
+; LIMIT2: call i32 @bar(
+  %tmp = tail call i32 @bar(i32 %arg)
+  ret i32 %tmp
+}
+
+attributes #0 = { nounwind } 
+attributes #1 = { nounwind }
+attributes #2 = { nounwind }
+

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGOMultiRegion.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGOMultiRegion.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGOMultiRegion.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGOMultiRegion.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,169 @@
+; RUN: opt -S -partial-inliner -min-block-execution=1 -skip-partial-inlining-cost-analysis < %s | FileCheck %s
+; RUN: opt -S -passes=partial-inliner -min-block-execution=1 -skip-partial-inlining-cost-analysis < %s | FileCheck %s
+; Require a dummy block (if.then.b) as successor to if.then due to PI requirement
+; of region containing more than one BB.
+define signext i32 @bar(i32 signext %value, i32 signext %ub) #0 !prof !30 {
+entry:
+  %value.addr = alloca i32, align 4
+  %ub.addr = alloca i32, align 4
+  %sum = alloca i32, align 4
+  %i = alloca i32, align 4
+  store i32 %value, i32* %value.addr, align 4
+  store i32 %ub, i32* %ub.addr, align 4
+  store i32 0, i32* %sum, align 4
+  store i32 0, i32* %i, align 4
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  %0 = load i32, i32* %i, align 4
+  %1 = load i32, i32* %ub.addr, align 4
+  %cmp = icmp slt i32 %0, %1
+  br i1 %cmp, label %for.body, label %for.cond2, !prof !31
+
+for.body:                                         ; preds = %for.cond
+  %2 = load i32, i32* %value.addr, align 4
+  %rem = srem i32 %2, 20
+  %cmp1 = icmp eq i32 %rem, 0
+  br i1 %cmp1, label %if.then, label %if.else, !prof !32
+
+if.then:                                          ; preds = %for.body
+  %3 = load i32, i32* %value.addr, align 4
+  %4 = load i32, i32* %i, align 4
+  %mul = mul nsw i32 %4, 5
+  %add = add nsw i32 %3, %mul
+  %5 = load i32, i32* %sum, align 4
+  %add2 = add nsw i32 %5, %add
+  store i32 %add2, i32* %sum, align 4
+  br label %if.then.b
+
+if.then.b:                                        ; preds = %if.then
+  br label %if.end
+
+if.else:                                          ; preds = %for.body
+  %6 = load i32, i32* %value.addr, align 4
+  %7 = load i32, i32* %i, align 4
+  %sub = sub nsw i32 %6, %7
+  %8 = load i32, i32* %sum, align 4
+  %add3 = add nsw i32 %8, %sub
+  store i32 %add3, i32* %sum, align 4
+  br label %if.end
+
+if.end:                                           ; preds = %if.else, %if.then
+  br label %for.inc
+
+for.inc:                                          ; preds = %if.end
+  %9 = load i32, i32* %i, align 4
+  %inc = add nsw i32 %9, 1
+  store i32 %inc, i32* %i, align 4
+  br label %for.cond
+
+for.cond2:                                         ; preds = %for.cond
+  %10 = load i32, i32* %i, align 4
+  %11 = load i32, i32* %ub.addr, align 4
+  %cmp2 = icmp slt i32 %10, %11
+  br i1 %cmp2, label %for.body2, label %for.end, !prof !31
+
+for.body2:                                         ; preds = %for.cond2
+  %12 = load i32, i32* %value.addr, align 4
+  %rem2 = srem i32 %12, 20
+  %cmp3 = icmp eq i32 %rem2, 0
+  br i1 %cmp3, label %if.then2, label %if.else2, !prof !32
+
+if.then2:                                          ; preds = %for.body2
+  %13 = load i32, i32* %value.addr, align 4
+  %14 = load i32, i32* %i, align 4
+  %mul2 = mul nsw i32 %14, 5
+  %add4 = add nsw i32 %13, %mul2
+  %15 = load i32, i32* %sum, align 4
+  %add5 = add nsw i32 %15, %add4
+  store i32 %add5, i32* %sum, align 4
+  br label %if.then2.b
+
+if.then2.b:                                        ; preds = %if.then2
+  br label %if.end2
+
+if.else2:                                          ; preds = %for.body2
+  %16 = load i32, i32* %value.addr, align 4
+  %17 = load i32, i32* %i, align 4
+  %sub2 = sub nsw i32 %16, %17
+  %18 = load i32, i32* %sum, align 4
+  %add6 = add nsw i32 %18, %sub2
+  store i32 %add6, i32* %sum, align 4
+  br label %if.end2
+
+if.end2:                                           ; preds = %if.else2, %if.then2
+  br label %for.inc2
+
+for.inc2:                                          ; preds = %if.end2
+  %19 = load i32, i32* %i, align 4
+  %inc2 = add nsw i32 %19, 1
+  store i32 %inc2, i32* %i, align 4
+  br label %for.cond2
+
+for.end:                                          ; preds = %for.cond2
+  %20 = load i32, i32* %sum, align 4
+  ret i32 %20
+}
+
+define signext i32 @foo(i32 signext %value, i32 signext %ub) #0 !prof !30 {
+; CHECK-LABEL: @foo
+; CHECK-NOT: call signext i32 @bar
+; CHECK: codeRepl1.i:
+; CHECK: call void @bar.1.if.then
+; CHECK: codeRepl.i:
+; CHECK: call void @bar.1.if.then2
+entry:
+  %value.addr = alloca i32, align 4
+  %ub.addr = alloca i32, align 4
+  store i32 %value, i32* %value.addr, align 4
+  store i32 %ub, i32* %ub.addr, align 4
+  %0 = load i32, i32* %value.addr, align 4
+  %1 = load i32, i32* %ub.addr, align 4
+  %call = call signext i32 @bar(i32 signext %0, i32 signext %1)
+  ret i32 %call
+}
+
+; CHECK-LABEL: define internal void @bar.1.if.then2
+; CHECK: .exitStub:
+; CHECK: ret void
+
+; CHECK-LABEL: define internal void @bar.1.if.then
+; CHECK: .exitStub:
+; CHECK: ret void
+
+!llvm.module.flags = !{!0, !1, !2}
+!llvm.ident = !{!29}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 7, !"PIC Level", i32 2}
+!2 = !{i32 1, !"ProfileSummary", !3}
+!3 = !{!4, !5, !6, !7, !8, !9, !10, !11}
+!4 = !{!"ProfileFormat", !"InstrProf"}
+!5 = !{!"TotalCount", i64 103}
+!6 = !{!"MaxCount", i64 100}
+!7 = !{!"MaxInternalCount", i64 1}
+!8 = !{!"MaxFunctionCount", i64 100}
+!9 = !{!"NumCounts", i64 5}
+!10 = !{!"NumFunctions", i64 3}
+!11 = !{!"DetailedSummary", !12}
+!12 = !{!13, !14, !15, !16, !17, !18, !18, !19, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28}
+!13 = !{i32 10000, i64 100, i32 1}
+!14 = !{i32 100000, i64 100, i32 1}
+!15 = !{i32 200000, i64 100, i32 1}
+!16 = !{i32 300000, i64 100, i32 1}
+!17 = !{i32 400000, i64 100, i32 1}
+!18 = !{i32 500000, i64 100, i32 1}
+!19 = !{i32 600000, i64 100, i32 1}
+!20 = !{i32 700000, i64 100, i32 1}
+!21 = !{i32 800000, i64 100, i32 1}
+!22 = !{i32 900000, i64 100, i32 1}
+!23 = !{i32 950000, i64 100, i32 1}
+!24 = !{i32 990000, i64 1, i32 4}
+!25 = !{i32 999000, i64 1, i32 4}
+!26 = !{i32 999900, i64 1, i32 4}
+!27 = !{i32 999990, i64 1, i32 4}
+!28 = !{i32 999999, i64 1, i32 4}
+!29 = !{!"clang version 6.0.0 (123456)"}
+!30 = !{!"function_entry_count", i64 2}
+!31 = !{!"branch_weights", i32 100, i32 1}
+!32 = !{!"branch_weights", i32 0, i32 100}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGORegion.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGORegion.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGORegion.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlinePGORegion.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,120 @@
+; RUN: opt -S -partial-inliner -min-block-execution=1 -skip-partial-inlining-cost-analysis < %s | FileCheck %s
+; RUN: opt -S -passes=partial-inliner -min-block-execution=1 -skip-partial-inlining-cost-analysis < %s | FileCheck %s
+; Require a dummy block (if.then.b) as successor to if.then due to PI requirement
+; of region containing more than one BB.
+define signext i32 @bar(i32 signext %value, i32 signext %ub) #0 !prof !30 {
+entry:
+  %value.addr = alloca i32, align 4
+  %ub.addr = alloca i32, align 4
+  %sum = alloca i32, align 4
+  %i = alloca i32, align 4
+  store i32 %value, i32* %value.addr, align 4
+  store i32 %ub, i32* %ub.addr, align 4
+  store i32 0, i32* %sum, align 4
+  store i32 0, i32* %i, align 4
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc, %entry
+  %0 = load i32, i32* %i, align 4
+  %1 = load i32, i32* %ub.addr, align 4
+  %cmp = icmp slt i32 %0, %1
+  br i1 %cmp, label %for.body, label %for.end, !prof !31
+
+for.body:                                         ; preds = %for.cond
+  %2 = load i32, i32* %value.addr, align 4
+  %rem = srem i32 %2, 20
+  %cmp1 = icmp eq i32 %rem, 0
+  br i1 %cmp1, label %if.then, label %if.else, !prof !32
+
+if.then:                                          ; preds = %for.body
+  %3 = load i32, i32* %value.addr, align 4
+  %4 = load i32, i32* %i, align 4
+  %mul = mul nsw i32 %4, 5
+  %add = add nsw i32 %3, %mul
+  %5 = load i32, i32* %sum, align 4
+  %add2 = add nsw i32 %5, %add
+  store i32 %add2, i32* %sum, align 4
+  br label %if.then.b
+
+if.then.b:                                        ; preds = %if.then
+  br label %if.end
+
+if.else:                                          ; preds = %for.body
+  %6 = load i32, i32* %value.addr, align 4
+  %7 = load i32, i32* %i, align 4
+  %sub = sub nsw i32 %6, %7
+  %8 = load i32, i32* %sum, align 4
+  %add3 = add nsw i32 %8, %sub
+  store i32 %add3, i32* %sum, align 4
+  br label %if.end
+
+if.end:                                           ; preds = %if.else, %if.then
+  br label %for.inc
+
+for.inc:                                          ; preds = %if.end
+  %9 = load i32, i32* %i, align 4
+  %inc = add nsw i32 %9, 1
+  store i32 %inc, i32* %i, align 4
+  br label %for.cond
+
+for.end:                                          ; preds = %for.cond
+  %10 = load i32, i32* %sum, align 4
+  ret i32 %10
+}
+
+define signext i32 @foo(i32 signext %value, i32 signext %ub) #0 !prof !30 {
+; CHECK-LABEL: @foo
+; CHECK: codeRepl.i:
+; CHECK-NOT: call signext i32 @bar
+; CHECK: call void @bar.1.if.then
+entry:
+  %value.addr = alloca i32, align 4
+  %ub.addr = alloca i32, align 4
+  store i32 %value, i32* %value.addr, align 4
+  store i32 %ub, i32* %ub.addr, align 4
+  %0 = load i32, i32* %value.addr, align 4
+  %1 = load i32, i32* %ub.addr, align 4
+  %call = call signext i32 @bar(i32 signext %0, i32 signext %1)
+  ret i32 %call
+}
+
+; CHECK-LABEL: define internal void @bar.1.if.then
+; CHECK: .exitStub:
+; CHECK: ret void
+
+!llvm.module.flags = !{!0, !1, !2}
+!llvm.ident = !{!29}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 7, !"PIC Level", i32 2}
+!2 = !{i32 1, !"ProfileSummary", !3}
+!3 = !{!4, !5, !6, !7, !8, !9, !10, !11}
+!4 = !{!"ProfileFormat", !"InstrProf"}
+!5 = !{!"TotalCount", i64 103}
+!6 = !{!"MaxCount", i64 100}
+!7 = !{!"MaxInternalCount", i64 1}
+!8 = !{!"MaxFunctionCount", i64 100}
+!9 = !{!"NumCounts", i64 5}
+!10 = !{!"NumFunctions", i64 3}
+!11 = !{!"DetailedSummary", !12}
+!12 = !{!13, !14, !15, !16, !17, !18, !18, !19, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28}
+!13 = !{i32 10000, i64 100, i32 1}
+!14 = !{i32 100000, i64 100, i32 1}
+!15 = !{i32 200000, i64 100, i32 1}
+!16 = !{i32 300000, i64 100, i32 1}
+!17 = !{i32 400000, i64 100, i32 1}
+!18 = !{i32 500000, i64 100, i32 1}
+!19 = !{i32 600000, i64 100, i32 1}
+!20 = !{i32 700000, i64 100, i32 1}
+!21 = !{i32 800000, i64 100, i32 1}
+!22 = !{i32 900000, i64 100, i32 1}
+!23 = !{i32 950000, i64 100, i32 1}
+!24 = !{i32 990000, i64 1, i32 4}
+!25 = !{i32 999000, i64 1, i32 4}
+!26 = !{i32 999900, i64 1, i32 4}
+!27 = !{i32 999990, i64 1, i32 4}
+!28 = !{i32 999999, i64 1, i32 4}
+!29 = !{!"clang version 6.0.0 (123456)"}
+!30 = !{!"function_entry_count", i64 2}
+!31 = !{!"branch_weights", i32 100, i32 1}
+!32 = !{!"branch_weights", i32 0, i32 100}

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArg.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArg.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArg.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArg.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,107 @@
+; RUN: opt < %s -partial-inliner -S -skip-partial-inlining-cost-analysis | FileCheck %s
+; RUN: opt < %s -passes=partial-inliner -S -skip-partial-inlining-cost-analysis | FileCheck %s
+
+ at stat = external global i32, align 4
+
+define i32 @vararg(i32 %count, ...) {
+entry:
+  %vargs = alloca i8*, align 8
+  %stat1 = load i32, i32* @stat, align 4
+  %cmp = icmp slt i32 %stat1, 0
+  br i1 %cmp, label %bb2, label %bb1
+
+bb1:                                              ; preds = %entry
+  %vg1 = add nsw i32 %stat1, 1
+  store i32 %vg1, i32* @stat, align 4
+  %vargs1 = bitcast i8** %vargs to i8*
+  call void @llvm.va_start(i8* %vargs1)
+  %va1 = va_arg i8** %vargs, i32
+  call void @foo(i32 %count, i32 %va1) #2
+  call void @llvm.va_end(i8* %vargs1)
+  br label %bb2
+
+bb2:                                              ; preds = %bb1, %entry
+  %res = phi i32 [ 1, %bb1 ], [ 0, %entry ]
+  ret i32 %res
+}
+
+declare void @foo(i32, i32)
+declare void @llvm.va_start(i8*)
+declare void @llvm.va_end(i8*)
+
+define i32 @caller1(i32 %arg) {
+bb:
+  %tmp = tail call i32 (i32, ...) @vararg(i32 %arg)
+  ret i32 %tmp
+}
+; CHECK-LABEL: @caller1
+; CHECK: codeRepl.i:
+; CHECK-NEXT:  call void (i32, i8**, i32, ...) @vararg.3.bb1(i32 %stat1.i, i8** %vargs.i, i32 %arg)
+
+define i32 @caller2(i32 %arg, float %arg2) {
+bb:
+  %tmp = tail call i32 (i32, ...) @vararg(i32 %arg, i32 10, float %arg2)
+  ret i32 %tmp
+}
+
+; CHECK-LABEL: @caller2
+; CHECK: codeRepl.i:
+; CHECK-NEXT:  call void (i32, i8**, i32, ...) @vararg.3.bb1(i32 %stat1.i, i8** %vargs.i, i32 %arg, i32 10, float %arg2)
+
+; Test case to check that we do not extract a vararg function, if va_end is in
+; a block that is not outlined.
+define i32 @vararg_not_legal(i32 %count, ...) {
+entry:
+  %vargs = alloca i8*, align 8
+  %vargs0 = bitcast i8** %vargs to i8*
+  %stat1 = load i32, i32* @stat, align 4
+  %cmp = icmp slt i32 %stat1, 0
+  br i1 %cmp, label %bb2, label %bb1
+
+bb1:                                              ; preds = %entry
+  %vg1 = add nsw i32 %stat1, 1
+  store i32 %vg1, i32* @stat, align 4
+  %vargs1 = bitcast i8** %vargs to i8*
+  call void @llvm.va_start(i8* %vargs1)
+  %va1 = va_arg i8** %vargs, i32
+  call void @foo(i32 %count, i32 %va1)
+  br label %bb2
+
+bb2:                                              ; preds = %bb1, %entry
+  %res = phi i32 [ 1, %bb1 ], [ 0, %entry ]
+  %ptr = phi i8* [ %vargs1, %bb1 ], [ %vargs0, %entry]
+  call void @llvm.va_end(i8* %ptr)
+  ret i32 %res
+}
+
+; CHECK-LABEL: @caller3
+; CHECK: tail call i32 (i32, ...) @vararg_not_legal(i32 %arg, i32 %arg)
+define i32 @caller3(i32 %arg) {
+bb:
+  %res = tail call i32 (i32, ...) @vararg_not_legal(i32 %arg, i32 %arg)
+  ret i32 %res
+}
+
+declare i32* @err(i32*)
+
+define signext i32 @vararg2(i32 * %l, ...) {
+entry:
+  br i1 undef, label %cleanup, label %cond.end
+
+cond.end:                                         ; preds = %entry
+  %call51 = call i32* @err(i32* nonnull %l)
+  unreachable
+
+cleanup:                                          ; preds = %entry
+  ret i32 0
+}
+
+define i32* @caller_with_signext(i32* %foo) {
+entry:
+  %call1 = tail call signext i32 (i32*, ...) @vararg2(i32* %foo, i32 signext 8)
+  unreachable
+}
+
+; CHECK-LABEL: @caller_with_signext
+; CHECK: codeRepl.i:
+; CHECK-NEXT:  call void (i32*, ...) @vararg2.1.cond.end(i32* %foo, i32 signext 8)

Added: llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArgsDebug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArgsDebug.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArgsDebug.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/PartialInlineVarArgsDebug.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,68 @@
+; RUN: opt < %s -S -partial-inliner -skip-partial-inlining-cost-analysis=true | FileCheck %s
+
+; CHECK-LABEL: @callee
+; CHECK: %mul = mul nsw i32 %v, 10, !dbg ![[DBG1:[0-9]+]]
+define i32 @callee(i32 %v, ...) !dbg !16 {
+entry:
+  %cmp = icmp sgt i32 %v, 2000, !dbg !17
+  br i1 %cmp, label %if.then, label %if.end, !dbg !19
+
+if.then:                                          ; preds = %entry
+  %mul = mul nsw i32 %v, 10, !dbg !20
+  br label %if.end, !dbg !21
+
+if.end:                                           ; preds = %if.then, %entry
+  %v2 = phi i32 [ %v, %entry ], [ %mul, %if.then ]
+  %add = add nsw i32 %v2, 200, !dbg !22
+  ret i32 %add, !dbg !23
+}
+
+; CHECK-LABEL: @caller
+; CHECK: codeRepl.i:
+; CHECK-NOT: br label
+; CHECK: call void (i32, i32*, ...) @callee.1.if.then(i32 %v, i32* %mul.loc.i, i32 99), !dbg ![[DBG2:[0-9]+]]
+define i32 @caller(i32 %v) !dbg !8 {
+entry:
+  %call = call i32 (i32, ...) @callee(i32 %v, i32 99), !dbg !14
+  ret i32 %call, !dbg !15
+}
+
+; CHECK-LABEL: define internal void @callee.1.if.then
+; CHECK: br label %if.then, !dbg ![[DBG3:[0-9]+]]
+
+; CHECK: ![[DBG1]] = !DILocation(line: 10, column: 7,
+; CHECK: ![[DBG2]] = !DILocation(line: 10, column: 7,
+; CHECK: ![[DBG3]] = !DILocation(line: 10, column: 7,
+
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5, !6}
+!llvm.ident = !{!7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0 (trunk 177881)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "test.c", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 4}
+!6 = !{i32 1, !"min_enum_size", i32 4}
+!7 = !{!"clang version 6.0.0"}
+!8 = distinct !DISubprogram(name: "caller", scope: !1, file: !1, line: 3, type: !9, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
+!9 = !DISubroutineType(types: !10)
+!10 = !{!11, !11}
+!11 = !DIBasicType(name: "int", size: 19, encoding: DW_ATE_signed)
+!12 = !{!13}
+!13 = !DILocalVariable(name: "v", arg: 1, scope: !8, file: !1, line: 3, type: !11)
+!14 = !DILocation(line: 5, column: 10, scope: !8)
+!15 = !DILocation(line: 5, column: 3, scope: !8)
+!16 = distinct !DISubprogram(name: "callee", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !26)
+!26 = !{!27}
+!27 = !DILocalVariable(name: "v", arg: 1, scope: !16, file: !1, line: 8, type: !11)
+!17 = !DILocation(line: 9, column: 9, scope: !18)
+!18 = distinct !DILexicalBlock(scope: !16, file: !1, line: 9, column: 7)
+!19 = !DILocation(line: 9, column: 7, scope: !16)
+!20 = !DILocation(line: 10, column: 7, scope: !18)
+!21 = !DILocation(line: 10, column: 5, scope: !18)
+!22 = !DILocation(line: 11, column: 5, scope: !16)
+!36 = !DILocation(line: 12, column: 10, scope: !16)
+!23 = !DILocation(line: 12, column: 3, scope: !16)

Added: llvm/trunk/test/Transforms/CodeExtractor/SingleCondition.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/SingleCondition.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/SingleCondition.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/SingleCondition.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,23 @@
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -partial-inliner -S  | FileCheck %s
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -passes=partial-inliner -S  | FileCheck %s
+
+define internal i32 @inlinedFunc(i1 %cond, i32* align 4 %align.val) {
+entry:
+  br i1 %cond, label %if.then, label %return
+if.then:
+  ; Dummy store to have more than 0 uses
+  store i32 10, i32* %align.val, align 4
+  br label %return
+return:             ; preds = %entry
+  ret i32 0
+}
+
+define internal i32 @dummyCaller(i1 %cond, i32* align 2 %align.val) {
+entry:
+; CHECK-LABEL: @dummyCaller
+; CHECK: br
+; CHECK: call void @inlinedFunc.1.
+  %val = call i32 @inlinedFunc(i1 %cond, i32* %align.val)
+  ret i32 %val
+}
+

Added: llvm/trunk/test/Transforms/CodeExtractor/X86/InheritTargetAttributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/X86/InheritTargetAttributes.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/X86/InheritTargetAttributes.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/X86/InheritTargetAttributes.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,40 @@
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis | llc -filetype=null
+; RUN: opt < %s -partial-inliner -skip-partial-inlining-cost-analysis -S | FileCheck %s
+; This testcase checks to see if CodeExtractor properly inherits
+;   target specific attributes for the extracted function. This can
+;   cause certain instructions that depend on the attributes to not
+;   be lowered. Like in this test where we try to 'select' the blendvps
+;   intrinsic on x86 that requires the +sse4.1 target feature.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Function Attrs: nounwind readnone
+declare <4 x float> @llvm.x86.sse41.blendvps(<4 x float>, <4 x float>, <4 x float>) #0
+
+; Function Attrs: nounwind uwtable
+define <4 x float> @inlinedFunc(i1, <4 x float>, <4 x float>, <4 x float>) #1 {
+entry:
+  br i1 %0, label %if.then, label %return
+if.then:
+; Target intrinsic that requires sse4.1
+  %target.call = call <4 x float> @llvm.x86.sse41.blendvps(<4 x float> %1, <4 x float> %2, <4 x float> %3)
+  br label %return
+return:             ; preds = %entry
+  %retval = phi <4 x float> [ zeroinitializer, %entry ], [ %target.call, %if.then ]
+  ret <4 x float> %retval
+}
+
+; Function Attrs: nounwind uwtable
+define <4 x float> @dummyCaller(i1, <4 x float>, <4 x float>, <4 x float>) #1 {
+entry:
+  %val = call <4 x float> @inlinedFunc(i1 %0, <4 x float> %1, <4 x float> %2, <4 x float> %3)
+  ret <4 x float> %val
+}
+
+
+attributes #0 = { nounwind readnone }
+attributes #1 = { nounwind uwtable "target-cpu"="x86-64" "target-features"="+sse4.1" }
+
+; CHECK: define {{.*}} @inlinedFunc.1.if.then{{.*}} [[COUNT1:#[0-9]+]]
+; CHECK: [[COUNT1]] = { {{.*}} "target-cpu"="x86-64" "target-features"="+sse4.1" }

Added: llvm/trunk/test/Transforms/CodeExtractor/X86/lit.local.cfg
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/X86/lit.local.cfg?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/X86/lit.local.cfg (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/X86/lit.local.cfg Tue Apr 16 21:52:47 2019
@@ -0,0 +1,3 @@
+if not 'X86' in config.root.targets:
+    config.unsupported = True
+

Added: llvm/trunk/test/Transforms/CodeExtractor/cost.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/cost.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/cost.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/cost.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,64 @@
+; RUN: opt -S < %s  -partial-inliner -partial-inlining-extra-penalty=10 | FileCheck %s
+; RUN: opt -S < %s  -passes=partial-inliner -partial-inlining-extra-penalty=10 | FileCheck %s
+define i32 @outline_region_notlikely(i32* %arg) local_unnamed_addr {
+bb:
+;  ptr != null is predicted to be true 
+  %tmp = icmp ne i32* %arg, null
+  br i1 %tmp, label %bb8, label %bb1
+
+; bb1 is not likely
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp3 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp4 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp5 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp6 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp7 = tail call i32 @foo(i32* nonnull %arg)
+  br label %bb8
+
+bb8:                                              ; preds = %bb1, %bb
+  %tmp9 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp9
+}
+
+define i32 @outline_region_likely(i32* %arg) local_unnamed_addr {
+bb:
+;  ptr == null is predicted to be false
+  %tmp = icmp eq i32* %arg, null
+  br i1 %tmp, label %bb8, label %bb1
+
+; bb1 is likely
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp3 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp4 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp5 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp6 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp7 = tail call i32 @foo(i32* nonnull %arg)
+  br label %bb8
+
+bb8:                                              ; preds = %bb1, %bb
+  %tmp9 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp9
+}
+
+declare i32 @foo(i32* %arg)
+
+define i32 @dummy_caller(i32* %arg) local_unnamed_addr {
+; CHECK-LABEL: @dummy_caller
+  %tmp = call i32 @outline_region_notlikely(i32* %arg)
+; CHECK:  call void @outline_region_notlikely.2.bb1
+  %tmp2 = tail call i32 @outline_region_likely(i32* %arg)
+; CHECK: %tmp2 = tail call i32 @outline_region_likely(i32* %arg)
+  ret i32 %tmp
+
+}
+
+; CHECK-LABEL: define internal void @outline_region_notlikely.2.bb1(i32* %arg) {
+; CHECK-NEXT: newFuncRoot:
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 304489)"}

Added: llvm/trunk/test/Transforms/CodeExtractor/cost_meta.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/cost_meta.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/cost_meta.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/cost_meta.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,41 @@
+; RUN: opt -S < %s  -partial-inliner -partial-inlining-extra-penalty=2000 | FileCheck %s
+; RUN: opt -S < %s  -passes=partial-inliner -partial-inlining-extra-penalty=2000 | FileCheck %s
+define i32 @outline_region_notlikely(i32* %arg) local_unnamed_addr {
+bb:
+;  ptr != null is predicted to be true 
+  %tmp = icmp ne i32* %arg, null
+  br i1 %tmp, label %bb8, label %bb1, !prof !2
+
+; bb1 is not likely
+bb1:                                              ; preds = %bb
+  %tmp2 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp3 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp4 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp5 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp6 = tail call i32 @foo(i32* nonnull %arg)
+  %tmp7 = tail call i32 @foo(i32* nonnull %arg)
+  br label %bb8
+
+bb8:                                              ; preds = %bb1, %bb
+  %tmp9 = phi i32 [ 0, %bb1 ], [ 1, %bb ]
+  ret i32 %tmp9
+}
+
+define i32 @dummy_caller(i32* %arg) local_unnamed_addr {
+; CHECK-LABEL: @dummy_caller
+  %tmp = call i32 @outline_region_notlikely(i32* %arg)
+  ret i32 %tmp
+ }
+
+
+; CHECK-LABEL: define internal void @outline_region_notlikely.1.bb1(i32* %arg) {
+; CHECK-NEXT: newFuncRoot:
+
+declare i32 @foo(i32 * %arg)
+
+!llvm.module.flags = !{!0}
+!llvm.ident = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{!"clang version 5.0.0 (trunk 304489)"}
+!2 = !{!"branch_weights", i32 2000, i32 1}

Added: llvm/trunk/test/Transforms/CodeExtractor/extract-assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/extract-assume.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/extract-assume.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/extract-assume.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,29 @@
+; RUN: opt -passes="function(slp-vectorizer),module(hotcoldsplit),function(slp-vectorizer,print<assumptions>)" -disable-output %s 2>&1 | FileCheck %s
+;
+; Make sure this compiles. Check that function assumption cache is refreshed
+; after extracting blocks with assume calls from the function.
+
+; CHECK:      Cached assumptions for function: fun
+; CHECK-NEXT: Cached assumptions for function: fun.cold
+; CHECK-NEXT:   %cmp = icmp uge i32 %x, 64
+
+declare void @fun2(i32) #0
+
+define void @fun(i32 %x) {
+entry:
+  br i1 undef, label %if.then, label %if.else
+
+if.then:
+  ret void
+
+if.else:
+  %cmp = icmp uge i32 %x, 64
+  call void @llvm.assume(i1 %cmp)
+  call void @fun2(i32 %x)
+  unreachable
+}
+
+declare void @llvm.assume(i1) #1
+
+attributes #0 = { alwaysinline }
+attributes #1 = { nounwind }

Added: llvm/trunk/test/Transforms/CodeExtractor/inline_eh.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/inline_eh.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/inline_eh.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/inline_eh.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,52 @@
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -partial-inliner -S  | FileCheck %s
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -passes=partial-inliner -S  | FileCheck %s
+
+declare void @bar()
+declare i32 @__gxx_personality_v0(...)
+declare i8* @__cxa_begin_catch(i8*)
+declare void @__cxa_end_catch()
+
+define internal void @callee(i1 %cond) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+  br i1 %cond, label %if.then, label %if.end
+
+if.then:
+  invoke void @bar()
+          to label %invoke.cont unwind label %lpad
+
+invoke.cont:
+  br label %try.cont
+
+lpad:
+  %0 = landingpad { i8*, i32 }
+          catch i8* null
+  %1 = extractvalue { i8*, i32 } %0, 0
+  %2 = extractvalue { i8*, i32 } %0, 1
+  br label %catch
+
+catch:
+  %3 = call i8* @__cxa_begin_catch(i8* %1)
+  call void @__cxa_end_catch()
+  br label %try.cont
+
+try.cont:
+  br label %if.end
+
+if.end:
+  ret void
+}
+
+define internal void @caller(i1 %cond) {
+; CHECK-LABEL: define {{.*}} @caller
+entry:
+; CHECK: entry:
+; CHECK-NEXT: br i1
+; CHECK: codeRepl.i:
+; CHECK-NEXT: call void @callee.1.{{.*}}()
+  call void @callee(i1 %cond)
+  ret void
+}
+
+; CHECK-LABEL: define {{.*}} @callee.1.{{.*}}() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+; CHECK: invoke void @bar()
+; CHECK: landingpad

Added: llvm/trunk/test/Transforms/CodeExtractor/inline_eh_1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/inline_eh_1.ll?rev=358552&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/inline_eh_1.ll (added)
+++ llvm/trunk/test/Transforms/CodeExtractor/inline_eh_1.ll Tue Apr 16 21:52:47 2019
@@ -0,0 +1,56 @@
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -partial-inliner -S  | FileCheck %s
+; RUN: opt < %s -skip-partial-inlining-cost-analysis -passes=partial-inliner -S  | FileCheck %s
+
+declare dso_local void @bar()
+declare dso_local i32 @__CxxFrameHandler3(...)
+
+define internal void @callee(i1 %cond) personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+entry:
+  br i1 %cond, label %if.then, label %if.end
+
+if.then:
+  invoke void @bar()
+          to label %invoke.cont unwind label %ehcleanup
+
+invoke.cont:
+  br label %try.cont
+
+ehcleanup:
+  %0 = cleanuppad within none []
+  cleanupret from %0 unwind label %catch.dispatch
+
+catch.dispatch:
+  %1 = catchswitch within none [label %catch] unwind to caller
+
+catch:
+  %2 = catchpad within %1 [i8* null, i32 64, i8* null]
+  catchret from %2 to label %catchret.dest
+
+catchret.dest:
+  br label %try.cont
+
+try.cont:
+  br label %if.end
+
+if.end:
+  ret void
+}
+
+define internal void @caller(i1 %cond) {
+; CHECK-LABEL: define {{.*}} @caller
+entry:
+; CHECK: entry:
+; CHECK-NEXT: br i1
+; CHECK: codeRepl.i:
+; CHECK-NEXT: call void @callee.1.{{.*}}()
+  call void @callee(i1 %cond)
+  ret void
+}
+
+; CHECK-LABEL: define {{.*}} @callee.1.{{.*}}() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*)
+; CHECK: invoke void @bar()
+; CHECK: cleanuppad
+; CHECK-NEXT: cleanupret
+; CHECK: catchswitch
+; CHECK: catchpad
+; CHECK-NEXT: catchret




More information about the llvm-commits mailing list