summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM/uadd_sat.ll
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2019-10-18 09:47:48 +0000
committerDavid Green <david.green@arm.com>2019-10-18 09:47:48 +0000
commite6f313b3807d23017d188aa7060b8cad09b3d095 (patch)
treea5ee51474dbccbb28c4739edcc39dec640610a6d /llvm/test/CodeGen/ARM/uadd_sat.ll
parent0c7cc383e5b846bc9e9fcc599d3f342333f5c963 (diff)
downloadbcm5719-llvm-e6f313b3807d23017d188aa7060b8cad09b3d095.tar.gz
bcm5719-llvm-e6f313b3807d23017d188aa7060b8cad09b3d095.zip
[Codegen] Alter the default promotion for saturating adds and subs
The default promotion for the add_sat/sub_sat nodes currently does: ANY_EXTEND iN to iM SHL by M-N [US][ADD|SUB]SAT L/ASHR by M-N If the promoted add_sat or sub_sat node is not legal, this can produce code that effectively does a lot of shifting (and requiring large constants to be materialised) just to use the overflow flag. It is simpler to just do the saturation manually, using the higher bitwidth addition and a min/max against the saturating bounds. That is what this patch attempts to do. Differential Revision: https://reviews.llvm.org/D68926 llvm-svn: 375211
Diffstat (limited to 'llvm/test/CodeGen/ARM/uadd_sat.ll')
-rw-r--r--llvm/test/CodeGen/ARM/uadd_sat.ll80
1 files changed, 33 insertions, 47 deletions
diff --git a/llvm/test/CodeGen/ARM/uadd_sat.ll b/llvm/test/CodeGen/ARM/uadd_sat.ll
index 3de65959156..d7c4e977c68 100644
--- a/llvm/test/CodeGen/ARM/uadd_sat.ll
+++ b/llvm/test/CodeGen/ARM/uadd_sat.ll
@@ -93,34 +93,34 @@ define i64 @func2(i64 %x, i64 %y) nounwind {
define zeroext i16 @func16(i16 zeroext %x, i16 zeroext %y) nounwind {
; CHECK-T1-LABEL: func16:
; CHECK-T1: @ %bb.0:
-; CHECK-T1-NEXT: lsls r1, r1, #16
-; CHECK-T1-NEXT: lsls r0, r0, #16
; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: ldr r1, .LCPI2_0
+; CHECK-T1-NEXT: cmp r0, r1
; CHECK-T1-NEXT: blo .LBB2_2
; CHECK-T1-NEXT: @ %bb.1:
-; CHECK-T1-NEXT: movs r0, #0
-; CHECK-T1-NEXT: mvns r0, r0
+; CHECK-T1-NEXT: mov r0, r1
; CHECK-T1-NEXT: .LBB2_2:
-; CHECK-T1-NEXT: lsrs r0, r0, #16
; CHECK-T1-NEXT: bx lr
+; CHECK-T1-NEXT: .p2align 2
+; CHECK-T1-NEXT: @ %bb.3:
+; CHECK-T1-NEXT: .LCPI2_0:
+; CHECK-T1-NEXT: .long 65535 @ 0xffff
;
; CHECK-T2-LABEL: func16:
; CHECK-T2: @ %bb.0:
-; CHECK-T2-NEXT: lsls r2, r0, #16
-; CHECK-T2-NEXT: add.w r1, r2, r1, lsl #16
-; CHECK-T2-NEXT: cmp.w r1, r0, lsl #16
+; CHECK-T2-NEXT: add r1, r0
+; CHECK-T2-NEXT: movw r0, #65535
+; CHECK-T2-NEXT: cmp r1, r0
; CHECK-T2-NEXT: it lo
-; CHECK-T2-NEXT: movlo.w r1, #-1
-; CHECK-T2-NEXT: lsrs r0, r1, #16
+; CHECK-T2-NEXT: movlo r0, r1
; CHECK-T2-NEXT: bx lr
;
; CHECK-ARM-LABEL: func16:
; CHECK-ARM: @ %bb.0:
-; CHECK-ARM-NEXT: lsl r2, r0, #16
-; CHECK-ARM-NEXT: add r1, r2, r1, lsl #16
-; CHECK-ARM-NEXT: cmp r1, r0, lsl #16
-; CHECK-ARM-NEXT: mvnlo r1, #0
-; CHECK-ARM-NEXT: lsr r0, r1, #16
+; CHECK-ARM-NEXT: add r1, r0, r1
+; CHECK-ARM-NEXT: movw r0, #65535
+; CHECK-ARM-NEXT: cmp r1, r0
+; CHECK-ARM-NEXT: movlo r0, r1
; CHECK-ARM-NEXT: bx lr
%tmp = call i16 @llvm.uadd.sat.i16(i16 %x, i16 %y)
ret i16 %tmp
@@ -129,34 +129,27 @@ define zeroext i16 @func16(i16 zeroext %x, i16 zeroext %y) nounwind {
define zeroext i8 @func8(i8 zeroext %x, i8 zeroext %y) nounwind {
; CHECK-T1-LABEL: func8:
; CHECK-T1: @ %bb.0:
-; CHECK-T1-NEXT: lsls r1, r1, #24
-; CHECK-T1-NEXT: lsls r0, r0, #24
; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: cmp r0, #255
; CHECK-T1-NEXT: blo .LBB3_2
; CHECK-T1-NEXT: @ %bb.1:
-; CHECK-T1-NEXT: movs r0, #0
-; CHECK-T1-NEXT: mvns r0, r0
+; CHECK-T1-NEXT: movs r0, #255
; CHECK-T1-NEXT: .LBB3_2:
-; CHECK-T1-NEXT: lsrs r0, r0, #24
; CHECK-T1-NEXT: bx lr
;
; CHECK-T2-LABEL: func8:
; CHECK-T2: @ %bb.0:
-; CHECK-T2-NEXT: lsls r2, r0, #24
-; CHECK-T2-NEXT: add.w r1, r2, r1, lsl #24
-; CHECK-T2-NEXT: cmp.w r1, r0, lsl #24
-; CHECK-T2-NEXT: it lo
-; CHECK-T2-NEXT: movlo.w r1, #-1
-; CHECK-T2-NEXT: lsrs r0, r1, #24
+; CHECK-T2-NEXT: add r0, r1
+; CHECK-T2-NEXT: cmp r0, #255
+; CHECK-T2-NEXT: it hs
+; CHECK-T2-NEXT: movhs r0, #255
; CHECK-T2-NEXT: bx lr
;
; CHECK-ARM-LABEL: func8:
; CHECK-ARM: @ %bb.0:
-; CHECK-ARM-NEXT: lsl r2, r0, #24
-; CHECK-ARM-NEXT: add r1, r2, r1, lsl #24
-; CHECK-ARM-NEXT: cmp r1, r0, lsl #24
-; CHECK-ARM-NEXT: mvnlo r1, #0
-; CHECK-ARM-NEXT: lsr r0, r1, #24
+; CHECK-ARM-NEXT: add r0, r0, r1
+; CHECK-ARM-NEXT: cmp r0, #255
+; CHECK-ARM-NEXT: movhs r0, #255
; CHECK-ARM-NEXT: bx lr
%tmp = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y)
ret i8 %tmp
@@ -165,34 +158,27 @@ define zeroext i8 @func8(i8 zeroext %x, i8 zeroext %y) nounwind {
define zeroext i4 @func3(i4 zeroext %x, i4 zeroext %y) nounwind {
; CHECK-T1-LABEL: func3:
; CHECK-T1: @ %bb.0:
-; CHECK-T1-NEXT: lsls r1, r1, #28
-; CHECK-T1-NEXT: lsls r0, r0, #28
; CHECK-T1-NEXT: adds r0, r0, r1
+; CHECK-T1-NEXT: cmp r0, #15
; CHECK-T1-NEXT: blo .LBB4_2
; CHECK-T1-NEXT: @ %bb.1:
-; CHECK-T1-NEXT: movs r0, #0
-; CHECK-T1-NEXT: mvns r0, r0
+; CHECK-T1-NEXT: movs r0, #15
; CHECK-T1-NEXT: .LBB4_2:
-; CHECK-T1-NEXT: lsrs r0, r0, #28
; CHECK-T1-NEXT: bx lr
;
; CHECK-T2-LABEL: func3:
; CHECK-T2: @ %bb.0:
-; CHECK-T2-NEXT: lsls r2, r0, #28
-; CHECK-T2-NEXT: add.w r1, r2, r1, lsl #28
-; CHECK-T2-NEXT: cmp.w r1, r0, lsl #28
-; CHECK-T2-NEXT: it lo
-; CHECK-T2-NEXT: movlo.w r1, #-1
-; CHECK-T2-NEXT: lsrs r0, r1, #28
+; CHECK-T2-NEXT: add r0, r1
+; CHECK-T2-NEXT: cmp r0, #15
+; CHECK-T2-NEXT: it hs
+; CHECK-T2-NEXT: movhs r0, #15
; CHECK-T2-NEXT: bx lr
;
; CHECK-ARM-LABEL: func3:
; CHECK-ARM: @ %bb.0:
-; CHECK-ARM-NEXT: lsl r2, r0, #28
-; CHECK-ARM-NEXT: add r1, r2, r1, lsl #28
-; CHECK-ARM-NEXT: cmp r1, r0, lsl #28
-; CHECK-ARM-NEXT: mvnlo r1, #0
-; CHECK-ARM-NEXT: lsr r0, r1, #28
+; CHECK-ARM-NEXT: add r0, r0, r1
+; CHECK-ARM-NEXT: cmp r0, #15
+; CHECK-ARM-NEXT: movhs r0, #15
; CHECK-ARM-NEXT: bx lr
%tmp = call i4 @llvm.uadd.sat.i4(i4 %x, i4 %y)
ret i4 %tmp
OpenPOWER on IntegriCloud