Skip to content

Commit e21df82

Browse files
committed
[AVR] Optimize 8-bit rotation when rotation bits >= 4
Fixes #63100 Reviewed By: aykevl, Patryk27, jacquesguan Differential Revision: https://reviews.llvm.org/D152130
1 parent 2509c93 commit e21df82

File tree

2 files changed

+22
-55
lines changed

2 files changed

+22
-55
lines changed

llvm/lib/Target/AVR/AVRISelLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,21 @@ SDValue AVRTargetLowering::LowerShifts(SDValue Op, SelectionDAG &DAG) const {
427427
Victim = DAG.getNode(AVRISD::ASRBN, dl, VT, Victim,
428428
DAG.getConstant(7, dl, VT));
429429
ShiftAmount = 0;
430+
} else if (Op.getOpcode() == ISD::ROTL && ShiftAmount == 7) {
431+
// Optimize left rotation 7 bits to right rotation 1 bit.
432+
Victim =
433+
DAG.getNode(AVRISD::ROR, dl, VT, Victim, DAG.getConstant(1, dl, VT));
434+
ShiftAmount = 0;
435+
} else if (Op.getOpcode() == ISD::ROTR && ShiftAmount == 7) {
436+
// Optimize right rotation 7 bits to left rotation 1 bit.
437+
Victim =
438+
DAG.getNode(AVRISD::ROL, dl, VT, Victim, DAG.getConstant(1, dl, VT));
439+
ShiftAmount = 0;
440+
} else if ((Op.getOpcode() == ISD::ROTR || Op.getOpcode() == ISD::ROTL) &&
441+
ShiftAmount >= 4) {
442+
// Optimize left/right rotation with the SWAP instruction.
443+
Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
444+
ShiftAmount -= 4;
430445
}
431446
} else if (VT.getSizeInBits() == 16) {
432447
if (Op.getOpcode() == ISD::SRA)

llvm/test/CodeGen/AVR/rotate.ll

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,7 @@ start:
3030
define i8 @rotl8_5(i8 %x) {
3131
; CHECK-LABEL: rotl8_5:
3232
; CHECK: ; %bb.0: ; %start
33-
; CHECK-NEXT: lsl r24
34-
; CHECK-NEXT: adc r24, r1
35-
; CHECK-NEXT: lsl r24
36-
; CHECK-NEXT: adc r24, r1
37-
; CHECK-NEXT: lsl r24
38-
; CHECK-NEXT: adc r24, r1
39-
; CHECK-NEXT: lsl r24
40-
; CHECK-NEXT: adc r24, r1
33+
; CHECK-NEXT: swap r24
4134
; CHECK-NEXT: lsl r24
4235
; CHECK-NEXT: adc r24, r1
4336
; CHECK-NEXT: ret
@@ -49,20 +42,9 @@ start:
4942
define i8 @rotl8_7(i8 %x) {
5043
; CHECK-LABEL: rotl8_7:
5144
; CHECK: ; %bb.0: ; %start
52-
; CHECK-NEXT: lsl r24
53-
; CHECK-NEXT: adc r24, r1
54-
; CHECK-NEXT: lsl r24
55-
; CHECK-NEXT: adc r24, r1
56-
; CHECK-NEXT: lsl r24
57-
; CHECK-NEXT: adc r24, r1
58-
; CHECK-NEXT: lsl r24
59-
; CHECK-NEXT: adc r24, r1
60-
; CHECK-NEXT: lsl r24
61-
; CHECK-NEXT: adc r24, r1
62-
; CHECK-NEXT: lsl r24
63-
; CHECK-NEXT: adc r24, r1
64-
; CHECK-NEXT: lsl r24
65-
; CHECK-NEXT: adc r24, r1
45+
; CHECK-NEXT: bst r24, 0
46+
; CHECK-NEXT: ror r24
47+
; CHECK-NEXT: bld r24, 7
6648
; CHECK-NEXT: ret
6749
start:
6850
%0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 7)
@@ -121,18 +103,7 @@ start:
121103
define i8 @rotr8_5(i8 %x) {
122104
; CHECK-LABEL: rotr8_5:
123105
; CHECK: ; %bb.0: ; %start
124-
; CHECK-NEXT: bst r24, 0
125-
; CHECK-NEXT: ror r24
126-
; CHECK-NEXT: bld r24, 7
127-
; CHECK-NEXT: bst r24, 0
128-
; CHECK-NEXT: ror r24
129-
; CHECK-NEXT: bld r24, 7
130-
; CHECK-NEXT: bst r24, 0
131-
; CHECK-NEXT: ror r24
132-
; CHECK-NEXT: bld r24, 7
133-
; CHECK-NEXT: bst r24, 0
134-
; CHECK-NEXT: ror r24
135-
; CHECK-NEXT: bld r24, 7
106+
; CHECK-NEXT: swap r24
136107
; CHECK-NEXT: bst r24, 0
137108
; CHECK-NEXT: ror r24
138109
; CHECK-NEXT: bld r24, 7
@@ -145,27 +116,8 @@ start:
145116
define i8 @rotr8_7(i8 %x) {
146117
; CHECK-LABEL: rotr8_7:
147118
; CHECK: ; %bb.0: ; %start
148-
; CHECK-NEXT: bst r24, 0
149-
; CHECK-NEXT: ror r24
150-
; CHECK-NEXT: bld r24, 7
151-
; CHECK-NEXT: bst r24, 0
152-
; CHECK-NEXT: ror r24
153-
; CHECK-NEXT: bld r24, 7
154-
; CHECK-NEXT: bst r24, 0
155-
; CHECK-NEXT: ror r24
156-
; CHECK-NEXT: bld r24, 7
157-
; CHECK-NEXT: bst r24, 0
158-
; CHECK-NEXT: ror r24
159-
; CHECK-NEXT: bld r24, 7
160-
; CHECK-NEXT: bst r24, 0
161-
; CHECK-NEXT: ror r24
162-
; CHECK-NEXT: bld r24, 7
163-
; CHECK-NEXT: bst r24, 0
164-
; CHECK-NEXT: ror r24
165-
; CHECK-NEXT: bld r24, 7
166-
; CHECK-NEXT: bst r24, 0
167-
; CHECK-NEXT: ror r24
168-
; CHECK-NEXT: bld r24, 7
119+
; CHECK-NEXT: lsl r24
120+
; CHECK-NEXT: adc r24, r1
169121
; CHECK-NEXT: ret
170122
start:
171123
%0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 7)

0 commit comments

Comments
 (0)