mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-28 06:22:51 +01:00
08be907489
In http://reviews.llvm.org/rL215382, IT forming was made more conservative under the belief that a flag-setting instruction was unpredictable inside an IT block on ARMv6M. But actually, ARMv6M doesn't even support IT blocks so that's impossible. In the ARMARM for v7M, v7AR and v8AR it states that the semantics of such an instruction changes inside an IT block - it doesn't set the flags. So actually it is fine to use one inside an IT block as long as the flags register is dead afterwards. This gives significant performance improvements in a variety of MPEG based workloads. Differential revision: http://reviews.llvm.org/D11680 llvm-svn: 243869
27 lines
706 B
LLVM
27 lines
706 B
LLVM
; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s
|
|
; RUN: llc -mtriple=thumbv8 %s -o - | FileCheck %s
|
|
; PR11107
|
|
|
|
define i32 @test(i32 %a, i32 %b) {
|
|
entry:
|
|
%cmp1 = icmp slt i32 %a, 0
|
|
%sub1 = sub nsw i32 0, %a
|
|
%abs1 = select i1 %cmp1, i32 %sub1, i32 %a
|
|
%cmp2 = icmp slt i32 %b, 0
|
|
%sub2 = sub nsw i32 0, %b
|
|
%abs2 = select i1 %cmp2, i32 %sub2, i32 %b
|
|
%add = add nsw i32 %abs1, %abs2
|
|
ret i32 %add
|
|
}
|
|
|
|
; CHECK: cmp
|
|
; CHECK-NEXT: it mi
|
|
; We shouldn't need to check for the extra 's' here; tRSB should be printed as
|
|
; "rsb" inside an IT block, not "rsbs".
|
|
; CHECK-NEXT: rsb{{s?}}mi
|
|
; CHECK-NEXT: cmp
|
|
; CHECK-NEXT: it mi
|
|
; CHECK-NEXT: rsb{{s?}}mi
|
|
|
|
|