Add a note about sext from i1 plus flags use.
authorChris Lattner <sabre@nondot.org>
Mon, 18 Feb 2008 18:30:13 +0000 (18:30 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 18 Feb 2008 18:30:13 +0000 (18:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47278 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index 60163e21934987fca8bc72d05324b4acde437a5e..f6a0b7831ba2576cfca122f89dfc953ef510c670 100644 (file)
@@ -1528,3 +1528,55 @@ int x(int a, int b) {
 See PR2053 for more details.
 
 //===---------------------------------------------------------------------===//
+
+Consider:
+int test(unsigned long a, unsigned long b) { return -(a < b); }
+
+We currently compile this to:
+
+define i32 @test(i32 %a, i32 %b) nounwind  {
+       %tmp3 = icmp ult i32 %a, %b             ; <i1> [#uses=1]
+       %tmp34 = zext i1 %tmp3 to i32           ; <i32> [#uses=1]
+       %tmp5 = sub i32 0, %tmp34               ; <i32> [#uses=1]
+       ret i32 %tmp5
+}
+
+and
+
+_test:
+       movl    8(%esp), %eax
+       cmpl    %eax, 4(%esp)
+       setb    %al
+       movzbl  %al, %eax
+       negl    %eax
+       ret
+
+Several deficiencies here.  First, we should instcombine zext+neg into sext:
+
+define i32 @test2(i32 %a, i32 %b) nounwind  {
+       %tmp3 = icmp ult i32 %a, %b             ; <i1> [#uses=1]
+       %tmp34 = sext i1 %tmp3 to i32           ; <i32> [#uses=1]
+       ret i32 %tmp34
+}
+
+However, before we can do that, we have to fix the bad codegen that we get for
+sext from bool:
+
+_test2:
+       movl    8(%esp), %eax
+       cmpl    %eax, 4(%esp)
+       setb    %al
+       movzbl  %al, %eax
+       shll    $31, %eax
+       sarl    $31, %eax
+       ret
+
+This code should be at least as good as the code above.  Once this is fixed, we
+can optimize this specific case even more to:
+
+       movl    8(%esp), %eax
+       xorl    %ecx, %ecx
+        cmpl    %eax, 4(%esp)
+        sbbl    %ecx, %ecx
+
+//===---------------------------------------------------------------------===//