<div dir="ltr"><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">(+davide -- fyi)</span><br></div><div><br></div>Relanded in r330667<div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 1, 2017 at 5:08 PM, George Burgess IV <span dir="ltr"><<a href="mailto:george.burgess.iv@gmail.com" target="_blank">george.burgess.iv@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">reverted by r301885</div><div class="m_-6477921428676877426m_8151455048355958049m_1573918928864480526HOEnZb"><div class="m_-6477921428676877426m_8151455048355958049m_1573918928864480526h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 1, 2017 at 4:12 PM, George Burgess IV via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: gbiv<br>
Date: Mon May  1 18:12:08 2017<br>
New Revision: 301880<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=301880&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=301880&view=rev</a><br>
Log:<br>
[InstSimplify] Handle selects of GEPs with 0 offset<br>
<br>
In particular (since it wouldn't fit nicely in the summary):<br>
(select (icmp eq V 0) P (getelementptr P V)) -> (getelementptr P V)<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D31435" rel="noreferrer" target="_blank">https://reviews.llvm.org/D3143<wbr>5</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/Analysis/Instru<wbr>ctionSimplify.cpp<br>
    llvm/trunk/test/Transforms/Ins<wbr>tSimplify/select.ll<br>
<br>
Modified: llvm/trunk/lib/Analysis/Instru<wbr>ctionSimplify.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=301880&r1=301879&r2=301880&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>InstructionSimplify.cpp?rev=30<wbr>1880&r1=301879&r2=301880&view=<wbr>diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Analysis/Instru<wbr>ctionSimplify.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/Instru<wbr>ctionSimplify.cpp Mon May  1 18:12:08 2017<br>
@@ -62,6 +62,8 @@ static Value *SimplifyOrInst(Value *, Va<br>
 static Value *SimplifyXorInst(Value *, Value *, const SimplifyQuery &, unsigned);<br>
 static Value *SimplifyCastInst(unsigned, Value *, Type *,<br>
                                const SimplifyQuery &, unsigned);<br>
+static Value *SimplifyGEPInst(Type *, ArrayRef<Value *>, const SimplifyQuery &,<br>
+                              unsigned);<br>
<br>
 /// For a boolean type or a vector of boolean type, return false or a vector<br>
 /// with every element false.<br>
@@ -3491,6 +3493,17 @@ static const Value *SimplifyWithOpReplac<br>
     }<br>
   }<br>
<br>
+  // Same for GEPs.<br>
+  if (auto *GEP = dyn_cast<GetElementPtrInst>(I)<wbr>) {<br>
+    if (MaxRecurse) {<br>
+      SmallVector<Value *, 8> NewOps(GEP->getNumOperands());<br>
+      transform(GEP->operands(), NewOps.begin(),<br>
+                [&](Value *V) { return V == Op ? RepOp : V; });<br>
+      return SimplifyGEPInst(GEP->getSource<wbr>ElementType(), NewOps, Q,<br>
+                             MaxRecurse - 1);<br>
+    }<br>
+  }<br>
+<br>
   // TODO: We could hand off more cases to instsimplify here.<br>
<br>
   // If all operands are constant after substituting Op for RepOp then we can<br>
<br>
Modified: llvm/trunk/test/Transforms/Ins<wbr>tSimplify/select.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/select.ll?rev=301880&r1=301879&r2=301880&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/Transfor<wbr>ms/InstSimplify/select.ll?rev=<wbr>301880&r1=301879&r2=301880&vie<wbr>w=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/Transforms/Ins<wbr>tSimplify/select.ll (original)<br>
+++ llvm/trunk/test/Transforms/Ins<wbr>tSimplify/select.ll Mon May  1 18:12:08 2017<br>
@@ -431,3 +431,22 @@ define i8 @do_not_assume_sel_cond(i1 %co<br>
   ret i8 %sel<br>
 }<br>
<br>
+define i32* @select_icmp_eq_0_gep_operand(<wbr>i32* %base, i64 %n) {<br>
+; CHECK-LABEL: @select_icmp_eq_0_gep_operand(<br>
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr<br>
+; CHECK-NEXT: ret i32* [[GEP]]<br>
+  %cond = icmp eq i64 %n, 0<br>
+  %gep = getelementptr i32, i32* %base, i64 %n<br>
+  %r = select i1 %cond, i32* %base, i32* %gep<br>
+  ret i32* %r<br>
+}<br>
+<br>
+define i32* @select_icmp_ne_0_gep_operand(<wbr>i32* %base, i64 %n) {<br>
+; CHECK-LABEL: @select_icmp_ne_0_gep_operand(<br>
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr<br>
+; CHECK-NEXT: ret i32* [[GEP]]<br>
+  %cond = icmp ne i64 %n, 0<br>
+  %gep = getelementptr i32, i32* %base, i64 %n<br>
+  %r = select i1 %cond, i32* %gep, i32* %base<br>
+  ret i32* %r<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>