mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-23 13:02:52 +02:00
d30aaf33b0
The (non-)obvious win comes from saving 3 bytes by using the 0x83 'and' opcode variant instead of 0x81. There are also better improvements based on known-bits that allow us to eliminate the mask entirely. As noted, this could be extended. There are potentially other wins from always shifting first, but doing that reveals a tangle of problems in other pattern matching. We do this transform generically in instcombine, but we often have icmp IR that doesn't match that pattern, so we must account for this in the backend. Differential Revision: https://reviews.llvm.org/D38181 llvm-svn: 314023
90 lines
2.6 KiB
LLVM
90 lines
2.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s -check-prefix=X32
|
|
; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s -check-prefix=X64
|
|
; rdar://7367229
|
|
|
|
define i32 @t(i32 %a, i32 %b) nounwind ssp {
|
|
; X32-LABEL: t:
|
|
; X32: # BB#0: # %entry
|
|
; X32-NEXT: movb {{[0-9]+}}(%esp), %al
|
|
; X32-NEXT: xorb {{[0-9]+}}(%esp), %al
|
|
; X32-NEXT: testb $64, %al
|
|
; X32-NEXT: je .LBB0_1
|
|
; X32-NEXT: # BB#2: # %bb1
|
|
; X32-NEXT: jmp bar # TAILCALL
|
|
; X32-NEXT: .LBB0_1: # %bb
|
|
; X32-NEXT: jmp foo # TAILCALL
|
|
;
|
|
; X64-LABEL: t:
|
|
; X64: # BB#0: # %entry
|
|
; X64-NEXT: xorl %esi, %edi
|
|
; X64-NEXT: xorl %eax, %eax
|
|
; X64-NEXT: btl $14, %edi
|
|
; X64-NEXT: jae .LBB0_1
|
|
; X64-NEXT: # BB#2: # %bb1
|
|
; X64-NEXT: jmp bar # TAILCALL
|
|
; X64-NEXT: .LBB0_1: # %bb
|
|
; X64-NEXT: jmp foo # TAILCALL
|
|
entry:
|
|
%0 = and i32 %a, 16384
|
|
%1 = icmp ne i32 %0, 0
|
|
%2 = and i32 %b, 16384
|
|
%3 = icmp ne i32 %2, 0
|
|
%4 = xor i1 %1, %3
|
|
br i1 %4, label %bb1, label %bb
|
|
|
|
bb: ; preds = %entry
|
|
%5 = tail call i32 (...) @foo() nounwind ; <i32> [#uses=1]
|
|
ret i32 %5
|
|
|
|
bb1: ; preds = %entry
|
|
%6 = tail call i32 (...) @bar() nounwind ; <i32> [#uses=1]
|
|
ret i32 %6
|
|
}
|
|
|
|
declare i32 @foo(...)
|
|
|
|
declare i32 @bar(...)
|
|
|
|
define i32 @t2(i32 %x, i32 %y) nounwind ssp {
|
|
; X32-LABEL: t2:
|
|
; X32: # BB#0: # %entry
|
|
; X32-NEXT: cmpl $0, {{[0-9]+}}(%esp)
|
|
; X32-NEXT: sete %al
|
|
; X32-NEXT: cmpl $0, {{[0-9]+}}(%esp)
|
|
; X32-NEXT: sete %cl
|
|
; X32-NEXT: cmpb %al, %cl
|
|
; X32-NEXT: je .LBB1_1
|
|
; X32-NEXT: # BB#2: # %bb
|
|
; X32-NEXT: jmp foo # TAILCALL
|
|
; X32-NEXT: .LBB1_1: # %return
|
|
; X32-NEXT: retl
|
|
;
|
|
; X64-LABEL: t2:
|
|
; X64: # BB#0: # %entry
|
|
; X64-NEXT: testl %edi, %edi
|
|
; X64-NEXT: sete %al
|
|
; X64-NEXT: testl %esi, %esi
|
|
; X64-NEXT: sete %cl
|
|
; X64-NEXT: cmpb %al, %cl
|
|
; X64-NEXT: je .LBB1_1
|
|
; X64-NEXT: # BB#2: # %bb
|
|
; X64-NEXT: xorl %eax, %eax
|
|
; X64-NEXT: jmp foo # TAILCALL
|
|
; X64-NEXT: .LBB1_1: # %return
|
|
; X64-NEXT: retq
|
|
|
|
entry:
|
|
%0 = icmp eq i32 %x, 0 ; <i1> [#uses=1]
|
|
%1 = icmp eq i32 %y, 0 ; <i1> [#uses=1]
|
|
%2 = xor i1 %1, %0 ; <i1> [#uses=1]
|
|
br i1 %2, label %bb, label %return
|
|
|
|
bb: ; preds = %entry
|
|
%3 = tail call i32 (...) @foo() nounwind ; <i32> [#uses=0]
|
|
ret i32 undef
|
|
|
|
return: ; preds = %entry
|
|
ret i32 undef
|
|
}
|