hanchenye-llvm-project/llvm/test/Transforms/InstCombine
Chris Lattner 7c99f19d9f Carve out a place in instcombine to put transformations which work knowing that their
result is non-zero.  Implement an example optimization (PR9814), which allows us to
transform:
  A / ((1 << B) >>u 2)
into:
  A >>u (B-2)

which we compile into:

_divu3:                                 ## @divu3
	leal	-2(%rsi), %ecx
	shrl	%cl, %edi
	movl	%edi, %eax
	ret

instead of:

_divu3:                                 ## @divu3
	movb	%sil, %cl
	movl	$1, %esi
	shll	%cl, %esi
	shrl	$2, %esi
	movl	%edi, %eax
	xorl	%edx, %edx
	divl	%esi, %eax
	ret

llvm-svn: 131860
2011-05-22 18:18:41 +00:00
..
2002-03-11-InstCombineHang.ll
2002-05-14-SubFailure.ll
2002-08-02-CastTest.ll
2002-12-05-MissedConstProp.ll
2003-05-26-CastMiscompile.ll
2003-05-27-ConstExprCrash.ll
2003-06-05-BranchInvertInfLoop.ll
2003-07-21-ExternalConstant.ll
2003-08-12-AllocaNonNull.ll remove a use of llvm-dis 2010-11-30 02:04:15 +00:00
2003-09-09-VolatileLoadElim.ll
2003-10-29-CallSiteResolve.ll
2003-11-03-VarargsCallBug.ll
2004-01-13-InstCombineInvokePHI.ll
2004-02-23-ShiftShiftOverflow.ll
2004-03-13-InstCombineInfLoop.ll
2004-04-04-InstCombineReplaceAllUsesWith.ll
2004-05-07-UnsizedCastLoad.ll
2004-07-27-ConstantExprMul.ll
2004-08-09-RemInfLoop.ll
2004-08-10-BoolSetCC.ll
2004-09-20-BadLoadCombine.ll
2004-09-20-BadLoadCombine2.ll
2004-09-28-BadShiftAndSetCC.ll
2004-11-22-Missed-and-fold.ll
2004-11-27-SetCCForCastLargerAndConstant.ll
2004-12-08-RemInfiniteLoop.ll
2005-03-04-ShiftOverflow.ll
2005-04-07-UDivSelectCrash.ll
2005-06-15-DivSelectCrash.ll
2005-06-15-ShiftSetCCCrash.ll
2005-06-16-RangeCrash.ll
2005-06-16-SetCCOrSetCCMiscompile.ll
2005-07-07-DeadPHILoop.ll
2006-02-13-DemandedMiscompile.ll
2006-02-28-Crash.ll
2006-03-30-ExtractElement.ll
2006-04-28-ShiftShiftLongLong.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
2006-05-04-DemandedBitCrash.ll
2006-09-15-CastToBool.ll
2006-10-19-SignedToUnsignedCastAndConst-2.ll
2006-10-20-mask.ll
2006-10-26-VectorReassoc.ll
2006-11-03-Memmove64.ll
2006-11-10-ashr-miscompile.ll
2006-12-01-BadFPVectorXform.ll
2006-12-05-fp-to-int-ext.ll
2006-12-08-Phi-ICmp-Op-Fold.ll
2006-12-08-Select-ICmp.ll
2006-12-15-Range-Test.ll
2006-12-23-Select-Cmp-Cmp.ll
2007-01-13-ExtCompareMiscompile.ll
2007-01-14-FcmpSelf.ll
2007-01-18-VectorInfLoop.ll
2007-01-27-AndICmp.ll
2007-02-01-LoadSinkAlloca.ll
2007-02-07-PointerCast.ll
2007-02-23-PhiFoldInfLoop.ll
2007-03-13-CompareMerge.ll
2007-03-19-BadTruncChangePR1261.ll
2007-03-21-SignedRangeTest.ll
2007-03-25-BadShiftMask.ll
2007-03-25-DoubleShift.ll
2007-03-26-BadShiftMask.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
2007-04-04-BadFoldBitcastIntoMalloc.ll
2007-04-08-SingleEltVectorCrash.ll
2007-05-04-Crash.ll
2007-05-10-icmp-or.ll
2007-05-14-Crash.ll
2007-05-18-CastFoldBug.ll
2007-06-06-AshrSignBit.ll
2007-06-21-DivCompareMiscomp.ll
2007-08-02-InfiniteLoop.ll
2007-09-10-AliasConstFold.ll
2007-09-11-Trampoline.ll
2007-09-17-AliasConstFold2.ll
2007-10-10-EliminateMemCpy.ll
2007-10-12-Crash.ll
2007-10-28-stacksave.ll
2007-10-31-RangeCrash.ll
2007-10-31-StringCrash.ll
2007-11-07-OpaqueAlignCrash.ll
2007-11-15-CompareMiscomp.ll
2007-11-22-IcmpCrash.ll
2007-11-25-CompatibleAttributes.ll
2007-12-10-ConstFoldCompare.ll
2007-12-12-GEPScale.ll
2007-12-16-AsmNoUnwind.ll
2007-12-18-AddSelCmpSub.ll
2007-12-28-IcmpSub2.ll add newlines at the end of files. 2010-04-07 22:53:17 +00:00
2008-01-06-BitCastAttributes.ll
2008-01-06-CastCrash.ll
2008-01-06-VoidCast.ll
2008-01-13-AndCmpCmp.ll
2008-01-13-NoBitCastAttributes.ll
2008-01-14-DoubleNest.ll
2008-01-14-VarArgTrampoline.ll
2008-01-21-MismatchedCastAndCompare.ll
2008-01-21-MulTrunc.ll
2008-01-27-FloatSelect.ll
2008-01-29-AddICmp.ll
2008-02-13-MulURem.ll
2008-02-16-SDivOverflow.ll
2008-02-16-SDivOverflow2.ll
2008-02-23-MulSub.ll
2008-02-28-OrFCmpCrash.ll
2008-03-13-IntToPtr.ll
2008-04-22-ByValBitcast.ll
2008-04-28-VolatileStore.ll
2008-04-29-VolatileLoadDontMerge.ll
2008-04-29-VolatileLoadMerge.ll
2008-05-08-LiveStoreDelete.ll
2008-05-08-StrLenSink.ll
2008-05-09-SinkOfInvoke.ll
2008-05-17-InfLoop.ll
2008-05-18-FoldIntToPtr.ll
2008-05-22-IDivVector.ll
2008-05-22-NegValVector.ll
2008-05-23-CompareFold.ll
2008-05-31-AddBool.ll
2008-05-31-Bools.ll
2008-06-05-ashr-crash.ll
2008-06-08-ICmpPHI.ll
2008-06-13-InfiniteLoopStore.ll
2008-06-13-ReadOnlyCallStore.ll
2008-06-19-UncondLoad.ll
2008-06-21-CompareMiscomp.ll
2008-06-24-StackRestore.ll
2008-07-08-AndICmp.ll
2008-07-08-ShiftOneAndOne.ll
2008-07-08-SubAnd.ll
2008-07-08-VolatileLoadMerge.ll
2008-07-09-SubAndError.ll
2008-07-10-CastSextBool.ll
2008-07-10-ICmpBinOp.ll
2008-07-11-RemAnd.ll
2008-07-13-DivZero.ll
2008-07-16-fsub.ll
2008-07-16-sse2_storel_dq.ll
2008-08-05-And.ll
2008-08-17-ICmpXorSignbit.ll
2008-09-02-VectorCrash.ll
2008-09-29-FoldingOr.ll
2008-10-11-DivCompareFold.ll
2008-10-23-ConstFoldWithoutMask.ll
2008-11-01-SRemDemandedBits.ll
2008-11-08-FCmp.ll
2008-11-20-DivMulRem.ll My auto-simplifier noticed that ((X/Y)*Y)/Y occurs several times in SPEC 2011-01-28 16:51:11 +00:00
2008-11-27-IDivVector.ll
2008-11-27-MultiplyIntVec.ll
2008-11-27-UDivNegative.ll
2008-12-17-SRemNegConstVec.ll
2009-01-05-i128-crash.ll
2009-01-08-AlignAlloca.ll
2009-01-16-PointerAddrSpace.ll
2009-01-19-fmod-constant-float-specials.ll Teach APFloat how to create both QNaNs and SNaNs and with arbitrary-width 2010-02-28 02:51:25 +00:00
2009-01-19-fmod-constant-float.ll
2009-01-24-EmptyStruct.ll
2009-01-31-InfIterate.ll
2009-01-31-Pressure.ll
2009-02-04-FPBitcast.ll
2009-02-20-InstCombine-SROA.ll
2009-02-21-LoadCST.ll
2009-02-25-CrashZeroSizeArray.ll
2009-03-18-vector-ashr-crash.ll
2009-03-20-AShrOverShift.ll
2009-03-24-InfLoop.ll
2009-04-07-MulPromoteToI96.ll
2009-05-23-FCmpToICmp.ll
2009-06-11-StoreAddrSpace.ll
2009-06-16-SRemDemandedBits.ll
2009-07-02-MaskedIntVector.ll
2009-12-17-CmpSelectNull.ll
2010-01-28-NegativeSRem.ll
2010-03-03-ExtElim.ll Make the 'icmp pred trunc(ext(X)), CST --> icmp pred X, ext(trunc(CST))' 2010-03-04 06:54:10 +00:00
2010-11-01-lshr-mask.ll Have SimplifyBinOp dispatch Xor, Add and Sub to the corresponding methods 2010-12-20 14:47:04 +00:00
2010-11-21-SizeZeroTypeGEP.ll If a GEP index simply advances by multiples of a type of zero size, 2010-11-22 16:32:50 +00:00
2010-11-23-Distributed.ll Add a generic expansion transform: A op (B op' C) -> (A op B) op' (A op C) 2010-12-22 13:36:08 +00:00
2011-02-14-InfLoop.ll Fix 9216 - Endless loop in InstCombine pass. 2011-02-15 07:13:48 +00:00
2011-02-16-InsertelementHang.ll PR9218: SimplifyDemandedVectorElts can return a non-null value that is not 2011-02-19 22:42:40 +00:00
2011-03-08-SRemMinusOneBadOpt.ll PR9346: Prevent SimplifyDemandedBits from incorrectly introducing 2011-03-09 01:28:35 +00:00
2011-05-02-VectorBoolean.ll Fix PR9579: when simplifying a compare to "true" or "false", and it was 2011-05-02 18:51:41 +00:00
2011-05-13-InBoundsGEP.ll Drop lli, revise test. 2011-05-17 02:38:59 +00:00
CPP_min_max.ll
ExtractCast.ll Instcombile optimization: extractelement(cast) -> cast(extractelement) 2011-03-31 22:57:29 +00:00
IntPtrCast.ll
JavaCompare.ll make these less sensitive to temporary naming. 2010-03-05 08:43:33 +00:00
README.txt
add-shrink.ll
add-sitofp.ll
add.ll Also fold (A+B) == A -> B == 0 when the add is commuted. 2011-02-11 21:46:48 +00:00
add2.ll preserve NUW/NSW when transforming add x,x 2011-02-17 02:23:02 +00:00
add3.ll
addnegneg.ll
adjust-for-sminmax.ll
align-2d-gep.ll
align-addr.ll Make instcombine set explicit alignments on load or store 2010-08-03 18:20:32 +00:00
align-external.ll
alloca.ll Teach instcombine to promote alloca array sizes. 2010-05-28 15:09:00 +00:00
and-compare.ll
and-fcmp.ll
and-not-or.ll
and-or-and.ll
and-or-not.ll Fix a ton of comment typos found by codespell. Patch by 2011-04-15 05:18:47 +00:00
and-or.ll
and-xor-merge.ll
and.ll
and2.ll Make InstCombiner::FoldAndOfICmps create a ConstantRange that's the 2011-03-01 15:05:01 +00:00
apint-add1.ll
apint-add2.ll
apint-and-compare.ll
apint-and-or-and.ll
apint-and-xor-merge.ll
apint-and1.ll
apint-and2.ll
apint-call-cast-target.ll
apint-cast-and-cast.ll
apint-cast-cast-to-and.ll
apint-cast.ll
apint-div1.ll
apint-div2.ll
apint-mul1.ll
apint-mul2.ll
apint-not.ll
apint-or1.ll
apint-or2.ll
apint-rem1.ll
apint-rem2.ll
apint-select.ll
apint-shift-simplify.ll
apint-shift.ll
apint-shl-trunc.ll
apint-sub.ll
apint-xor1.ll
apint-xor2.ll
apint-zext1.ll
apint-zext2.ll
ashr-nop.ll
badmalloc.ll Teach instCombine to remove malloc+free if malloc's only uses are comparisons 2010-05-27 19:09:06 +00:00
binop-cast.ll
bit-checks.ll Generalize instcombine's support for combining multiple bit checks into a single test. Patch by Dirk Steinke! 2010-09-08 22:16:17 +00:00
bit-tracking.ll
bitcast-sext-vector.ll
bitcast-store.ll Fix a case where instcombine was stripping metadata (and alignment) 2010-10-25 16:16:27 +00:00
bitcast-vec-canon.ll
bitcast-vec-uniform.ll Enhance constant folding of bitcast operations on vectors of floats. 2011-02-17 21:22:27 +00:00
bitcast-vector-fold.ll
bitcast.ll handle the constant case of vector insertion. For something 2010-08-28 01:50:57 +00:00
bitcount.ll
bittest.ll
bswap-fold.ll
bswap.ll
call-cast-target.ll
call-intrinsics.ll
call.ll Start trying to make InstCombine preserve more debug info. The idea here is to set the debug location on the IRBuilder, which will be then right location in most cases. This should magically give many transformations debug locations, and fixing places which are missing a debug location will usually just means changing the code creating it to use the IRBuilder. 2011-05-18 01:28:27 +00:00
call2.ll
canonicalize_branch.ll
cast-mul-select.ll
cast-set.ll
cast.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
cast_ptr.ll
compare-signs.ll
constant-fold-compare.ll
constant-fold-gep.ll implement constant folding support for an exotic constant expr: 2011-01-06 06:19:46 +00:00
crash.ll fix PR9013, an infinite loop in instcombine. 2011-01-21 05:29:50 +00:00
dce-iterate.ll
deadcode.ll
debuginfo.ll Try to not lose variable's debug info during instcombine. 2011-03-17 22:18:16 +00:00
dg.exp
div.ll Carve out a place in instcombine to put transformations which work knowing that their 2011-05-22 18:18:41 +00:00
enforce-known-alignment.ll
exact.ll add PR# 2011-02-13 08:27:31 +00:00
extractvalue.ll Transform (extractvalue (load P), ...) to (load (gep P, 0, ...)) if the load has no other uses, shrinking the load. 2010-11-29 21:56:20 +00:00
fcmp-select.ll Don't do (X != Y) ? X : Y -> X for floating-point values; it doesn't 2010-02-23 17:17:57 +00:00
fcmp-special.ll
fcmp.ll InstCombine: APFloat can't perform arithmetic on PPC double doubles, don't even try. 2011-03-31 21:35:49 +00:00
fdiv.ll Avoid turning a floating point division with a constant power of two into a denormal multiplication. 2011-03-30 17:02:54 +00:00
fold-bin-operand.ll FileCheck-ize and update test. 2011-03-18 01:10:31 +00:00
fold-calls.ll Don't try to constant fold libm functions with non-finite arguments. 2010-09-27 21:29:20 +00:00
fold-vector-select.ll Fix 9173. 2011-02-11 19:37:55 +00:00
fold-vector-zero.ll
fp-ret-bitcast.ll
fpcast.ll
fpextend.ll
fsub.ll
gep-addrspace.ll This testcase passed even without the fix. Added the target info to make the 2011-04-06 11:18:29 +00:00
gepgep.ll When constant folding GEP of GEP, do not crash if an index of 2010-03-12 17:55:20 +00:00
getelementptr.ll Add a testcase for getelementptr index promotion. 2010-05-28 15:07:59 +00:00
hoist_instr.ll
icmp.ll PR9838: Fix transform introduced in r127064 to not trigger when only one side of the icmp is an exact shift. 2011-05-05 21:59:18 +00:00
idioms.ll
intrinsics.ll Revert "InstCombine: Turn mul.with.overflow(X, 2) into the cheaper add.with.overflow(X, X)" 2011-05-21 18:31:42 +00:00
invariant.ll Print empty structs as {} rather than { }. 2010-04-08 18:03:05 +00:00
known_align.ll
load-cmp.ll make these less sensitive to temporary naming. 2010-03-05 08:43:33 +00:00
load-select.ll
load.ll merge two tests. 2010-07-12 00:19:47 +00:00
load3.ll fix PR7429, a crash turning a load from a string into a float. 2010-07-12 00:22:51 +00:00
loadstore-alignment.ll
logical-select.ll
lshr-phi.ll
malloc-free-delete.ll Teach instCombine to remove malloc+free if malloc's only uses are comparisons 2010-05-27 19:09:06 +00:00
malloc.ll
malloc2.ll
malloc3.ll
memcpy-to-load.ll
memcpy.ll fix PR8267 - Instcombine shouldn't optimizer away volatile memcpy's. 2010-10-01 05:51:02 +00:00
memmove.ll
memset.ll
memset2.ll Test case for r122215 when InstCombine optimizes memset 2010-12-20 01:06:23 +00:00
memset_chk.ll Reapply address space patch after fixing an issue in MemCopyOptimizer. 2010-04-04 03:10:48 +00:00
merge-icmp.ll InstCombine: Merge "(trunc x) == C1 & (and x, CA) == C2" into a single and+icmp. 2011-04-28 16:58:40 +00:00
mul-masked-bits.ll
mul.ll
multi-use-or.ll Floating-point add, sub, and mul are now spelled fadd, fsub, and fmul, 2010-03-02 01:11:08 +00:00
narrow.ll
neon-intrinsics.ll Teach instcombine to set the alignment arguments for NEON load/store intrinsics. 2010-10-22 21:41:48 +00:00
no-negzero.ll
not-fcmp.ll
not.ll
nothrow.ll
nsw.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
objsize.ll Revert 122959, it needs more thought. Add it back to README.txt with additional notes. 2011-01-07 20:42:20 +00:00
odr-linkage.ll add newlines at the end of files. 2010-04-07 22:53:17 +00:00
or-fcmp.ll Just because we have determined that an (fcmp | fcmp) is true for A < B, 2011-01-21 19:39:42 +00:00
or-to-xor.ll
or-xor.ll InstCombine: Add a bunch of combines of the form x | (y ^ z). 2011-02-20 13:23:43 +00:00
or.ll More instcombine cleanup, towards improving debug line info. 2011-05-18 23:58:37 +00:00
overflow.ll recognize an unsigned add with overflow idiom into uadd. 2010-12-19 19:37:52 +00:00
phi-merge-gep.ll
phi.ll Add test cases for Jay's r129641 and fix a 32-bit-centric testcase in a file with a 64-bit datalayout. 2011-04-16 14:31:50 +00:00
pr2645-0.ll
pr2645-1.ll
pr2996.ll
pr8547.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
preserve-sminmax.ll
ptr-int-cast.ll Convert this test to FileCheck and add a testcase for PR3574. 2010-02-23 01:28:09 +00:00
rem.ll InstCombine: Add a missing irem identity (X % X -> 0). 2010-11-17 19:11:46 +00:00
sdiv-1.ll
sdiv-2.ll
sdiv-shift.ll
select-2.ll
select-crash.ll Teach InstCombine not to use Add and Neg on FP. PR 8490. 2010-10-27 23:45:18 +00:00
select-load-call.ll
select.ll Teach the transformation that moves binary operators around selects to preserve 2011-03-27 19:51:23 +00:00
set.ll
setcc-strength-reduce.ll
sext.ll InstCombine: Turn icmp + sext into bitwise/integer ops when the input has only one unknown bit. 2011-04-01 20:09:10 +00:00
shift-sra.ll Fix a typo in ValueTracking that's causing instcombine to delete needed shift instructions. 2010-03-13 02:20:29 +00:00
shift.ll InstCombine: turn (C1 << A) << C2) into (C1 << C2) << A) 2011-04-29 08:15:41 +00:00
shufflemask-undef.ll
shufflevec-constant.ll
sign-test-and-or.ll InstCombine: Add a few missing combines for ANDs and ORs of sign bit tests. 2011-03-29 22:06:41 +00:00
signed-comparison.ll
signext.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
simplify-demanded-bits-pointer.ll
sink_instruction.ll
sitofp.ll
sqrt.ll Fix a serious performance regression introduced by r108687 on linux: 2010-09-07 20:01:38 +00:00
srem-simplify-bug.ll
srem.ll
srem1.ll
stack-overalign.ll
stacksaverestore.ll
store.ll
strcpy_chk-64.ll If we don't know how long a string is we can't fold an _chk version to the 2011-03-15 00:25:41 +00:00
strcpy_chk.ll Verify function prototypes before trying to optimize functions. We also 2010-04-12 04:48:00 +00:00
sub.ll Add some transforms of the kind X-Y>X -> 0>Y which are valid when there is no 2011-02-18 16:25:37 +00:00
trunc.ll Enhance a bunch of transformations in instcombine to start generating 2011-02-10 05:36:31 +00:00
udiv-simplify-bug-0.ll
udiv-simplify-bug-1.ll
udiv_select_to_select_shift.ll
udivrem-change-width.ll InstCombine: Turn (zext A) udiv (zext B) into (zext (A udiv B)). Same for urem or constant B. 2011-04-30 18:16:07 +00:00
urem-simplify-bug.ll more test cleanup 2010-09-02 22:38:56 +00:00
urem.ll
vec_demanded_elts.ll Move test to Transforms/InstCombine. 2011-05-19 05:53:22 +00:00
vec_extract_elt.ll
vec_insertelt.ll
vec_narrow.ll Floating-point add, sub, and mul are now spelled fadd, fsub, and fmul, 2010-03-02 01:11:08 +00:00
vec_sext.ll Add vector versions of some existing scalar transforms to aid codegen in matching psign & pblend operations to the IR produced by clang/gcc for their C idioms. 2010-12-17 23:12:19 +00:00
vec_shuffle.ll Change instcombine's getShuffleMask to represent undef with negative values. 2010-10-29 22:03:05 +00:00
vector-casts.ll Teach PatternMatch that splat vectors could be floating point as well as 2011-02-15 23:13:23 +00:00
vector-srem.ll
volatile_store.ll
x86-crc32-demanded.ll Revert r131664 and fix it in instcombine instead. rdar://9467055 2011-05-20 00:54:37 +00:00
xor-undef.ll
xor.ll
xor2.ll Re-apply r113679, which was reverted in r113720, which added a paid of new instcombine transforms 2010-09-13 17:59:27 +00:00
zero-point-zero-add.ll
zeroext-and-reduce.ll
zext-bool-add-sub.ll
zext-fold.ll
zext-or-icmp.ll
zext.ll

README.txt

This directory contains test cases for the instcombine transformation.  The
dated tests are actual bug tests, whereas the named tests are used to test
for features that the this pass should be capable of performing.