<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">The code change LGTM.<br>
      <br>
      The changes inspires two thoughts:<br>
      1) As we've discussed off list and Chandler mentioned, we need to
      investigate profitability of various invariant condition
      propagation schemes.  <br>
      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?<br>
      <br>
      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.<br>
      <br>
      Philip<br>
      <br>
      On 07/17/2014 10:58 AM, <a class="moz-txt-link-abbreviated" href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a> wrote:<br>
    </div>
    <blockquote
cite="mid:differential-rev-PHID-DREV-x274oe4o3niz2vh5v5y7-req@reviews.llvm.org"
      type="cite">
      <pre wrap="">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.

<a class="moz-txt-link-freetext" href="http://reviews.llvm.org/D4567">http://reviews.llvm.org/D4567</a>

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:
</pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
llvm-commits mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>