1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/CodeGen/Thumb2/thumb2-cmp.ll
Eli Friedman 9ae1cdf437 [ARM] Treat cmn immediates as legal in isLegalICmpImmediate.
The original code attempted to do this, but the std::abs() call didn't
actually do anything due to implicit type conversions.  Fix the type
conversions, and perform the correct check for negative immediates.

This probably has very little practical impact, but it's worth fixing
just to avoid confusion in the future, I think.

Differential Revision: https://reviews.llvm.org/D48907

llvm-svn: 336742
2018-07-10 23:44:37 +00:00

300 lines
5.2 KiB
LLVM

; RUN: llc -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 %s -o - | FileCheck %s
; These tests would be improved by 'movs r0, #0' being rematerialized below the
; test as 'mov.w r0, #0'.
; 0x000000bb = 187
define i32 @f1(i32 %a) {
; CHECK-LABEL: f1:
; CHECK: cmp {{.*}}, #187
%tmp = icmp ne i32 %a, 187
%ret = select i1 %tmp, i32 42, i32 24
ret i32 %ret
}
; 0x00aa00aa = 11141290
define i32 @f2(i32 %a) {
; CHECK-LABEL: f2:
; CHECK: cmp.w {{.*}}, #11141290
%tmp = icmp eq i32 %a, 11141290
%ret = select i1 %tmp, i32 42, i32 24
ret i32 %ret
}
; 0xcc00cc00 = 3422604288
define i32 @f3(i32 %a) {
; CHECK-LABEL: f3:
; CHECK: cmp.w {{.*}}, #-872363008
%tmp = icmp ne i32 %a, 3422604288
%ret = select i1 %tmp, i32 42, i32 24
ret i32 %ret
}
; 0xdddddddd = 3722304989
define i32 @f4(i32 %a) {
; CHECK-LABEL: f4:
; CHECK: cmp.w {{.*}}, #-572662307
%tmp = icmp ne i32 %a, 3722304989
%ret = select i1 %tmp, i32 42, i32 24
ret i32 %ret
}
; 0x00110000 = 1114112
define i32 @f5(i32 %a) {
; CHECK-LABEL: f5:
; CHECK: cmp.w {{.*}}, #1114112
%tmp = icmp eq i32 %a, 1114112
%ret = select i1 %tmp, i32 42, i32 24
ret i32 %ret
}
; Check that we don't do an invalid (a > b) --> !(a < b + 1) transform.
;
; CHECK-LABEL: f6:
; CHECK-NOT: cmp.w {{.*}}, #-2147483648
; CHECK: bx lr
define i32 @f6(i32 %a) {
%tmp = icmp sgt i32 %a, 2147483647
br i1 %tmp, label %true, label %false
true:
ret i32 2
false:
ret i32 0
}
define i32 @slt_poweroftwo(i32 %a) {
; CHECK-LABEL: slt_poweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp slt i32 %a, 4096
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sle_poweroftwo(i32 %a) {
; CHECK-LABEL: sle_poweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sle i32 %a, 4096
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sge_poweroftwo(i32 %a) {
; CHECK-LABEL: sge_poweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sge i32 %a, 4096
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_poweroftwo(i32 %a) {
; CHECK-LABEL: sgt_poweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sgt i32 %a, 4096
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @slt_nearpoweroftwo(i32 %a) {
; CHECK-LABEL: slt_nearpoweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp slt i32 %a, 4097
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sle_nearpoweroftwo(i32 %a) {
; CHECK-LABEL: sle_nearpoweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sle i32 %a, 4095
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sge_nearpoweroftwo(i32 %a) {
; CHECK-LABEL: sge_nearpoweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sge i32 %a, 4097
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_nearpoweroftwo(i32 %a) {
; CHECK-LABEL: sgt_nearpoweroftwo:
; CHECK: cmp.w r0, #4096
%b = icmp sgt i32 %a, 4095
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @slt_neg_soimm(i32 %a) {
; CHECK-LABEL: slt_neg_soimm:
; CHECK: cmn.w r0, #7929856
%b = icmp slt i32 %a, -7929856
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sle_neg_soimm(i32 %a) {
; CHECK-LABEL: sle_neg_soimm:
; CHECK: cmn.w r0, #7929856
%b = icmp sle i32 %a, -7929856
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sge_neg_soimm(i32 %a) {
; CHECK-LABEL: sge_neg_soimm:
; CHECK: cmn.w r0, #7929856
%b = icmp sge i32 %a, -7929856
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_neg_soimm(i32 %a) {
; CHECK-LABEL: sgt_neg_soimm:
; CHECK: cmn.w r0, #7929856
%b = icmp sgt i32 %a, -7929856
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @slt_notneg_soimm(i32 %a) {
; CHECK-LABEL: slt_notneg_soimm:
; CHECK: cmp.w r0, #-2013231104
%b = icmp slt i32 %a, -2013231104
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sle_notneg_soimm(i32 %a) {
; CHECK-LABEL: sle_notneg_soimm:
; CHECK: cmp.w r0, #-2013231104
%b = icmp sle i32 %a, -2013231104
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sge_notneg_soimm(i32 %a) {
; CHECK-LABEL: sge_notneg_soimm:
; CHECK: cmp.w r0, #-2013231104
%b = icmp sge i32 %a, -2013231104
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_notneg_soimm(i32 %a) {
; CHECK-LABEL: sgt_notneg_soimm:
; CHECK: cmp.w r0, #-2013231104
%b = icmp sgt i32 %a, -2013231104
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_movw(i32 %a) {
; CHECK-LABEL: sgt_movw:
; CHECK: movw r1, #2167
%b = icmp sgt i32 %a, 2166
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}
define i32 @sgt_neg_movw(i32 %a) {
; CHECK-LABEL: sgt_neg_movw:
; CHECK: movw r1, #63371
; CHECK: movt r1, #65535
%b = icmp sgt i32 %a, -2166
br i1 %b, label %true, label %false
true:
ret i32 1
false:
ret i32 2
}