<div dir="ltr">Hi David, <div><br></div><div>I am unable to trigger this bug because ZeroExtended and NonNegative cannot be both true given the current logic. However, theoretically it is still a bug. <div><br></div><div>Jingyue</div>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Jun 8, 2014 at 1:37 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Test coverage?<br>
<div class="HOEnZb"><div class="h5"><br>
On Sun, Jun 8, 2014 at 1:19 PM, Jingyue Wu <<a href="mailto:jingyue@google.com">jingyue@google.com</a>> wrote:<br>
> Author: jingyue<br>
> Date: Sun Jun  8 15:19:38 2014<br>
> New Revision: 210439<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=210439&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=210439&view=rev</a><br>
> Log:<br>
> [SeparateConstOffsetFromGEP] Fix an illegitimate optimization on zext<br>
><br>
> zext(a + b) != zext(a) + zext(b) even if a + b >= 0 && b >= 0.<br>
><br>
> e.g., a = i4 0b1111, b = i4 0b0001<br>
> zext a + b to i8 = zext 0b0000 to i8 = 0b00000000<br>
> (zext a to i8) + (zext b to i8) = 0b00001111 + 0b00000001 = 0b00010000<br>
><br>
> Modified:<br>
>     llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp?rev=210439&r1=210438&r2=210439&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp?rev=210439&r1=210438&r2=210439&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp Sun Jun  8 15:19:38 2014<br>
> @@ -321,9 +321,9 @@ bool ConstantOffsetExtractor::CanTraceIn<br>
>    //       1       |      0       | sext(BO) == sext(A) op sext(B)<br>
>    //       1       |      1       | zext(sext(BO)) ==<br>
>    //               |              |     zext(sext(A)) op zext(sext(B))<br>
> -  if (BO->getOpcode() == Instruction::Add && NonNegative) {<br>
> +  if (BO->getOpcode() == Instruction::Add && !ZeroExtended && NonNegative) {<br>
>      // If a + b >= 0 and (a >= 0 or b >= 0), then<br>
> -    //   s/zext(a + b) = s/zext(a) + s/zext(b)<br>
> +    //   sext(a + b) = sext(a) + sext(b)<br>
>      // even if the addition is not marked nsw.<br>
>      //<br>
>      // Leveraging this invarient, we can trace into an sext'ed inbound GEP<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>