diff options
author | Chris Lattner <sabre@nondot.org> | 2011-04-14 04:21:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-04-14 04:21:42 +0000 |
commit | df2ef9015f8a02eee25c45a9be648540641610c2 (patch) | |
tree | ed2b9c3afffbd2d5fa4c45d351b662cd58b1d6b4 /lib/Target | |
parent | c0c7fca2fedd2259569b7b84338259c62d38802d (diff) |
add a minor missed dag combine that is blocking mid-level optimization
improvements, that will lead to fixing PR6627.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129504 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/README.txt | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 99616b47c84..5032b2bbbb5 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -2258,3 +2258,79 @@ SimplifyDemandedBits shrinks the "and" constant to 2 but instcombine misses the icmp transform. //===---------------------------------------------------------------------===// + +These functions: +int foo(int *X) { + if ((*X & 255) == 47) + bar(); +} +int foo2(int X) { + if ((X & 255) == 47) + bar(); +} + +codegen to: + + movzbl (%rdi), %eax + cmpl $47, %eax + jne LBB0_2 + +and: + movzbl %dil, %eax + cmpl $47, %eax + jne LBB1_2 + +If a dag combine shrunk the compare to a byte compare, then we'd fold the load +in the first example, and eliminate the movzbl in the second, saving a register. +This can be a target independent dag combine that works on ISD::SETCC, it would +catch this before the legalize ops pass. + +//===---------------------------------------------------------------------===// + +We should optimize this: + + %tmp = load i16* %arrayidx, align 4, !tbaa !0 + %A = trunc i16 %tmp to i8 + %cmp = icmp eq i8 %A, 127 + %B.mask = and i16 %tmp, -256 + %cmp7 = icmp eq i16 %B.mask, 17664 + %or.cond = and i1 %cmp, %cmp7 + br i1 %or.cond, label %land.lhs.true9, label %if.end + +into: + + %tmp = load i16* %arrayidx, align 4, !tbaa !0 + %0 = icmp eq i16 %tmp, 17791 + br i1 %0, label %land.lhs.true9, label %if.end + +with this patch: +Index: InstCombine/InstCombineCompares.cpp +=================================================================== +--- InstCombine/InstCombineCompares.cpp (revision 129500) ++++ InstCombine/InstCombineCompares.cpp (working copy) +@@ -2506,6 +2506,18 @@ + return &I; + } + } ++ ++ // Transform "icmp eq (trunc X), cst" to "icmp (and X, mask), cst" ++ if (Op0->hasOneUse() && match(Op0, m_Trunc(m_Value(A))) && ++ isa<ConstantInt>(Op1)) { ++ APInt MaskV = APInt::getLowBitsSet(A->getType()->getPrimitiveSizeInBits(), ++ Op0->getType()->getPrimitiveSizeInBits()); ++ Value *Mask = ++ Builder->CreateAnd(A, ConstantInt::get(A->getContext(), MaskV)); ++ return new ICmpInst(I.getPredicate(), Mask, ++ ConstantExpr::getZExt(cast<ConstantInt>(Op1), ++ Mask->getType())); ++ } + } + + { + + +but we can't do that until the dag combine above is added. Not having this +is blocking resolving PR6627. + +//===---------------------------------------------------------------------===// + |