[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