<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br><br>On Dec 14, 2012, at 10:46 AM, David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><font face="arial, sans-serif">Is there a way for us to emit trap instructions if clang uses a left shift in an undefined mannor?</font>



</div></blockquote><div><br></div>That would be an overly user unfriendly behavior. People do write non-portable code sometimes. :)<div><br></div><div>Evan</div><div><br><blockquote type="cite"><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Dec 13, 2012 at 6:39 AM, NAKAMURA Takumi <span dir="ltr"><<a href="mailto:geek4civic@gmail.com" target="_blank">geek4civic@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">David, excuse me, I have reverted it in r170128 to unbreak selfhosting.<br>
<br>
It seems isKnownToBeAPowerOfTwo(X) assumes (1 << n) always non-zero.<br>
(It might be "non-zero, or undefined")<br>
<br>
FYI, <a href="http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/271" target="_blank">http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/271</a><br>
<br>
I am investigating "undefined behavior" in clang.<br>
<br>
...Takumi<br>
<br>
2012/12/13 David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>>:<br>
<div class="HOEnZb"><div class="h5">> Author: majnemer<br>
> Date: Wed Dec 12 14:48:54 2012<br>
> New Revision: 170020<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=170020&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=170020&view=rev</a><br>
> Log:<br>
> Simplify negated bit test<br>
><br>
> Modified:<br>
>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp<br>
>     llvm/trunk/test/Transforms/InstCombine/icmp.ll<br>
><br>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=170020&r1=170019&r2=170020&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=170020&r1=170019&r2=170020&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Wed Dec 12 14:48:54 2012<br>
> @@ -2034,6 +2034,15 @@<br>
>                                                 CI->countTrailingZeros()));<br>
>        }<br>
><br>
> +      // Turn x&~y == 0 into x&y != 0 if x is a power of 2.<br>
> +      Value *X = 0, *Y = 0;<br>
> +      if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&<br>
> +          match(Op1, m_Zero()) && isPowerOfTwo(X, TD)) {<br>
> +        return new ICmpInst(ICmpInst::ICMP_NE,<br>
> +                            Builder->CreateAnd(X, Y),<br>
> +                            Op1);<br>
> +      }<br>
> +<br>
>        break;<br>
>      }<br>
>      case ICmpInst::ICMP_NE: {<br>
> @@ -2071,6 +2080,15 @@<br>
>                                                 CI->countTrailingZeros()));<br>
>        }<br>
><br>
> +      // Turn x&~y != 0 into x&y == 0 if x is a power of 2.<br>
> +      Value *X = 0, *Y = 0;<br>
> +      if (match(Op0, m_And(m_Value(X), m_Not(m_Value(Y)))) &&<br>
> +          match(Op1, m_Zero()) && isPowerOfTwo(X, TD)) {<br>
> +        return new ICmpInst(ICmpInst::ICMP_EQ,<br>
> +                            Builder->CreateAnd(X, Y),<br>
> +                            Op1);<br>
> +      }<br>
> +<br>
>        break;<br>
>      }<br>
>      case ICmpInst::ICMP_ULT:<br>
><br>
> Modified: llvm/trunk/test/Transforms/InstCombine/icmp.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=170020&r1=170019&r2=170020&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/icmp.ll?rev=170020&r1=170019&r2=170020&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/InstCombine/icmp.ll (original)<br>
> +++ llvm/trunk/test/Transforms/InstCombine/icmp.ll Wed Dec 12 14:48:54 2012<br>
> @@ -677,3 +677,29 @@<br>
>  ; CHECK-NEXT: ret i1 true<br>
>    ret i1 %cmp<br>
>  }<br>
> +<br>
> +define i1 @test67(i32 %A, i32 %B) {<br>
> +  %neg = xor i32 %A, -1<br>
> +  %shl = shl i32 1, %B<br>
> +  %and = and i32 %shl, %neg<br>
> +  %cmp = icmp ne i32 %and, 0<br>
> +; CHECK: @test67<br>
> +; CHECK-NEXT: %shl = shl i32 1, %B<br>
> +; CHECK-NEXT: %1 = and i32 %shl, %A<br>
> +; CHECK-NEXT: %cmp = icmp eq i32 %1, 0<br>
> +; CHECK-NEXT: ret i1 %cmp<br>
> +  ret i1 %cmp<br>
> +}<br>
> +<br>
> +define i1 @test68(i32 %A, i32 %B) {<br>
> +  %neg = xor i32 %A, -1<br>
> +  %shl = shl i32 1, %B<br>
> +  %and = and i32 %shl, %neg<br>
> +  %cmp = icmp eq i32 %and, 0<br>
> +; CHECK: @test68<br>
> +; CHECK-NEXT: %shl = shl i32 1, %B<br>
> +; CHECK-NEXT: %1 = and i32 %shl, %A<br>
> +; CHECK-NEXT: %cmp = icmp ne i32 %1, 0<br>
> +; CHECK-NEXT: ret i1 %cmp<br>
> +  ret i1 %cmp<br>
> +}<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>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>llvm-commits mailing list</span><br><span><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a></span><br><span><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a></span><br></div></blockquote></div></body></html>