[PATCH] Check for all known bits on ret in InstCombine

Philip Reames listmail at philipreames.com
Tue Jul 22 10:19:56 PDT 2014


The code change LGTM.

The changes inspires two thoughts:
1) As we've discussed off list and Chandler mentioned, we need to 
investigate profitability of various invariant condition propagation 
schemes.
2) When do we remove a llvm.assume?  In your test case, you had an 
assume which (after the transform) retained a condition about an 
otherwise used value (%a).  This seems like an obvious case to remove 
since we've gotten all the benefit we can from it.  Are there other 
cases like this we should implement?

p.s. Do you have a wiki or notes page somewhere where we can track 
potential enhancements?  I worry large parts are getting lost in all the 
various review threads.

Philip

On 07/17/2014 10:58 AM, hfinkel at anl.gov wrote:
> Hi chandlerc,
>
>  From a combination of invariants (and perhaps through other means), it is possible that all bits of a return value might be known. Currently, InstCombine does not check for this (which is understandable given assumptions of constant propagation), but means that we'd miss simple cases where invariants are involved.
>
> http://reviews.llvm.org/D4567
>
> Files:
>    lib/Transforms/InstCombine/InstCombine.h
>    lib/Transforms/InstCombine/InstructionCombining.cpp
>    test/Transforms/InstCombine/invariants.ll
>
> Index: lib/Transforms/InstCombine/InstCombine.h
> ===================================================================
> --- lib/Transforms/InstCombine/InstCombine.h
> +++ lib/Transforms/InstCombine/InstCombine.h
> @@ -217,6 +217,7 @@
>     Instruction *visitStoreInst(StoreInst &SI);
>     Instruction *visitBranchInst(BranchInst &BI);
>     Instruction *visitSwitchInst(SwitchInst &SI);
> +  Instruction *visitReturnInst(ReturnInst &RI);
>     Instruction *visitInsertValueInst(InsertValueInst &IV);
>     Instruction *visitInsertElementInst(InsertElementInst &IE);
>     Instruction *visitExtractElementInst(ExtractElementInst &EI);
> Index: lib/Transforms/InstCombine/InstructionCombining.cpp
> ===================================================================
> --- lib/Transforms/InstCombine/InstructionCombining.cpp
> +++ lib/Transforms/InstCombine/InstructionCombining.cpp
> @@ -1923,7 +1923,25 @@
>     return nullptr;
>   }
>   
> +Instruction *InstCombiner::visitReturnInst(ReturnInst &RI) {
> +  if (RI.getNumOperands() == 0) // ret void
> +    return nullptr;
> +
> +  Value *ResultOp = RI.getOperand(0);
> +  Type *VTy = ResultOp->getType();
> +  if (!VTy->isIntegerTy())
> +    return nullptr;
>   
> +  // There might be invariants dominating this return that completely determine
> +  // the value. If so, constant fold it.
> +  unsigned BitWidth = VTy->getPrimitiveSizeInBits();
> +  APInt KnownZero(BitWidth, 0), KnownOne(BitWidth, 0);
> +  computeKnownBits(ResultOp, KnownZero, KnownOne, 0, &RI);
> +  if ((KnownZero|KnownOne).isAllOnesValue())
> +    RI.setOperand(0, Constant::getIntegerValue(VTy, KnownOne));
> +
> +  return nullptr;
> +}
>   
>   Instruction *InstCombiner::visitBranchInst(BranchInst &BI) {
>     // Change br (not X), label True, label False to: br X, label False, True
> Index: test/Transforms/InstCombine/invariants.ll
> ===================================================================
> --- test/Transforms/InstCombine/invariants.ll
> +++ test/Transforms/InstCombine/invariants.ll
> @@ -43,6 +43,18 @@
>   ; Function Attrs: nounwind
>   declare void @llvm.invariant(i1) #1
>   
> +define i32 @simple(i32 %a) #1 {
> +entry:
> +
> +; CHECK-LABEL: @simple
> +; CHECK: call void @llvm.invariant
> +; CHECK: ret i32 4
> +
> +  %cmp = icmp eq i32 %a, 4
> +  tail call void @llvm.invariant(i1 %cmp)
> +  ret i32 %a
> +}
> +
>   ; Function Attrs: nounwind uwtable
>   define i32 @bar1(i32 %a) #0 {
>   entry:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140722/bd2d2afb/attachment.html>


More information about the llvm-commits mailing list