diff options
author | Chris Lattner <sabre@nondot.org> | 2008-02-18 18:30:13 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-02-18 18:30:13 +0000 |
commit | 92b416f64ed865f26ffd3d729acc2e4ad530095a (patch) | |
tree | 3843a12ca5a0cb1f7dc3a8d5d9d1b3d6bf57a0d5 | |
parent | 339ffedca9f5f367d26507eb631fd5f929c04677 (diff) |
Add a note about sext from i1 plus flags use.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47278 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/README.txt | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt index 60163e2193..f6a0b7831b 100644 --- a/lib/Target/X86/README.txt +++ b/lib/Target/X86/README.txt @@ -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 + +//===---------------------------------------------------------------------===// |