Skip to content

Commit af03324

Browse files
committed
[ARM] Disable sign extended SSAT pattern recognition.
I may have given bad advice, and skipping sext_inreg when matching SSAT patterns is not valid on it's own. It at least needs to sext_inreg the input again, but as far as I can tell is still only valid based on demanded bits. For the moment disable that part of the combine, hopefully reimplementing it in the future more correctly.
1 parent b465455 commit af03324

File tree

3 files changed

+62
-15
lines changed

3 files changed

+62
-15
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5062,12 +5062,6 @@ static SDValue LowerSaturatingConditional(SDValue Op, SelectionDAG &DAG) {
50625062
SDValue V1Tmp = V1;
50635063
SDValue V2Tmp = V2;
50645064

5065-
if (V1.getOpcode() == ISD::SIGN_EXTEND_INREG &&
5066-
V2.getOpcode() == ISD::SIGN_EXTEND_INREG) {
5067-
V1Tmp = V1.getOperand(0);
5068-
V2Tmp = V2.getOperand(0);
5069-
}
5070-
50715065
// Check that the registers and the constants match a max(min()) or min(max())
50725066
// pattern
50735067
if (V1Tmp != TrueVal1 || V2Tmp != TrueVal2 || K1 != FalseVal1 ||

llvm/test/CodeGen/ARM/ssat.ll

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,15 @@ define i16 @sat_base_16bit(i16 %x) #0 {
6868
;
6969
; V6T2-LABEL: sat_base_16bit:
7070
; V6T2: @ %bb.0: @ %entry
71-
; V6T2-NEXT: ssat r0, #12, r0
71+
; V6T2-NEXT: sxth r1, r0
72+
; V6T2-NEXT: movw r2, #2047
73+
; V6T2-NEXT: cmp r1, r2
74+
; V6T2-NEXT: movlt r2, r0
75+
; V6T2-NEXT: movw r0, #63488
76+
; V6T2-NEXT: sxth r1, r2
77+
; V6T2-NEXT: movt r0, #65535
78+
; V6T2-NEXT: cmn r1, #2048
79+
; V6T2-NEXT: movgt r0, r2
7280
; V6T2-NEXT: bx lr
7381
entry:
7482
%0 = icmp slt i16 %x, 2047
@@ -95,7 +103,12 @@ define i8 @sat_base_8bit(i8 %x) #0 {
95103
;
96104
; V6T2-LABEL: sat_base_8bit:
97105
; V6T2: @ %bb.0: @ %entry
98-
; V6T2-NEXT: ssat r0, #6, r0
106+
; V6T2-NEXT: sxtb r1, r0
107+
; V6T2-NEXT: cmp r1, #31
108+
; V6T2-NEXT: movge r0, #31
109+
; V6T2-NEXT: sxtb r1, r0
110+
; V6T2-NEXT: cmn r1, #32
111+
; V6T2-NEXT: mvnle r0, #31
99112
; V6T2-NEXT: bx lr
100113
entry:
101114
%0 = icmp slt i8 %x, 31
@@ -547,7 +560,12 @@ define void @extended(i32 %xx, i16 signext %y, i8* nocapture %z) {
547560
; V6T2-LABEL: extended:
548561
; V6T2: @ %bb.0: @ %entry
549562
; V6T2-NEXT: add r0, r1, r0, lsr #16
550-
; V6T2-NEXT: ssat r0, #8, r0
563+
; V6T2-NEXT: sxth r1, r0
564+
; V6T2-NEXT: cmp r1, #127
565+
; V6T2-NEXT: movge r0, #127
566+
; V6T2-NEXT: sxth r1, r0
567+
; V6T2-NEXT: cmn r1, #128
568+
; V6T2-NEXT: mvnle r0, #127
551569
; V6T2-NEXT: strb r0, [r2]
552570
; V6T2-NEXT: bx lr
553571
entry:
@@ -582,7 +600,12 @@ define i32 @formulated_valid(i32 %a) {
582600
;
583601
; V6T2-LABEL: formulated_valid:
584602
; V6T2: @ %bb.0:
585-
; V6T2-NEXT: ssat r0, #8, r0
603+
; V6T2-NEXT: sxth r1, r0
604+
; V6T2-NEXT: cmp r1, #127
605+
; V6T2-NEXT: movge r0, #127
606+
; V6T2-NEXT: sxth r1, r0
607+
; V6T2-NEXT: cmn r1, #128
608+
; V6T2-NEXT: mvnle r0, #127
586609
; V6T2-NEXT: uxth r0, r0
587610
; V6T2-NEXT: bx lr
588611
%x1 = trunc i32 %a to i16
@@ -613,7 +636,12 @@ define i32 @formulated_invalid(i32 %a) {
613636
;
614637
; V6T2-LABEL: formulated_invalid:
615638
; V6T2: @ %bb.0:
616-
; V6T2-NEXT: ssat r0, #8, r0
639+
; V6T2-NEXT: sxth r1, r0
640+
; V6T2-NEXT: cmp r1, #127
641+
; V6T2-NEXT: movge r0, #127
642+
; V6T2-NEXT: sxth r1, r0
643+
; V6T2-NEXT: cmn r1, #128
644+
; V6T2-NEXT: mvnle r0, #127
617645
; V6T2-NEXT: bic r0, r0, #-16777216
618646
; V6T2-NEXT: bx lr
619647
%x1 = trunc i32 %a to i16

llvm/test/CodeGen/ARM/usat.ll

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,27 @@ define i16 @unsigned_sat_base_16bit(i16 %x) #0 {
6767
;
6868
; V6-LABEL: unsigned_sat_base_16bit:
6969
; V6: @ %bb.0: @ %entry
70-
; V6-NEXT: usat r0, #11, r0
70+
; V6-NEXT: mov r1, #255
71+
; V6-NEXT: sxth r2, r0
72+
; V6-NEXT: orr r1, r1, #1792
73+
; V6-NEXT: cmp r2, r1
74+
; V6-NEXT: movlt r1, r0
75+
; V6-NEXT: sxth r0, r1
76+
; V6-NEXT: cmp r0, #0
77+
; V6-NEXT: movle r1, #0
78+
; V6-NEXT: mov r0, r1
7179
; V6-NEXT: bx lr
7280
;
7381
; V6T2-LABEL: unsigned_sat_base_16bit:
7482
; V6T2: @ %bb.0: @ %entry
75-
; V6T2-NEXT: usat r0, #11, r0
83+
; V6T2-NEXT: sxth r2, r0
84+
; V6T2-NEXT: movw r1, #2047
85+
; V6T2-NEXT: cmp r2, r1
86+
; V6T2-NEXT: movlt r1, r0
87+
; V6T2-NEXT: sxth r0, r1
88+
; V6T2-NEXT: cmp r0, #0
89+
; V6T2-NEXT: movle r1, #0
90+
; V6T2-NEXT: mov r0, r1
7691
; V6T2-NEXT: bx lr
7792
entry:
7893
%0 = icmp slt i16 %x, 2047
@@ -99,12 +114,22 @@ define i8 @unsigned_sat_base_8bit(i8 %x) #0 {
99114
;
100115
; V6-LABEL: unsigned_sat_base_8bit:
101116
; V6: @ %bb.0: @ %entry
102-
; V6-NEXT: usat r0, #5, r0
117+
; V6-NEXT: sxtb r1, r0
118+
; V6-NEXT: cmp r1, #31
119+
; V6-NEXT: movge r0, #31
120+
; V6-NEXT: sxtb r1, r0
121+
; V6-NEXT: cmp r1, #0
122+
; V6-NEXT: movle r0, #0
103123
; V6-NEXT: bx lr
104124
;
105125
; V6T2-LABEL: unsigned_sat_base_8bit:
106126
; V6T2: @ %bb.0: @ %entry
107-
; V6T2-NEXT: usat r0, #5, r0
127+
; V6T2-NEXT: sxtb r1, r0
128+
; V6T2-NEXT: cmp r1, #31
129+
; V6T2-NEXT: movge r0, #31
130+
; V6T2-NEXT: sxtb r1, r0
131+
; V6T2-NEXT: cmp r1, #0
132+
; V6T2-NEXT: movle r0, #0
108133
; V6T2-NEXT: bx lr
109134
entry:
110135
%0 = icmp slt i8 %x, 31

0 commit comments

Comments
 (0)