Skip to content

Commit 3e2631c

Browse files
authored
[LoongArch] Optimize codegen for ISD::ROTL (#100344)
The LoongArch rotr.{w,d} instruction ignores the high bits of the shift operand, allowing it to generate more efficient code using the constant zero register.
1 parent 28f9575 commit 3e2631c

File tree

2 files changed

+9
-15
lines changed

2 files changed

+9
-15
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,7 @@ def : PatGprGpr<urem, MOD_WU>;
11231123
def : PatGprGpr<mul, MUL_W>;
11241124
def : PatGprGpr<mulhs, MULH_W>;
11251125
def : PatGprGpr<mulhu, MULH_WU>;
1126-
def : PatGprGpr<rotr, ROTR_W>;
1126+
def : PatGprGpr<shiftop<rotr>, ROTR_W>;
11271127
def : PatGprImm<rotr, ROTRI_W, uimm5>;
11281128

11291129
foreach Idx = 1...3 in {
@@ -1146,8 +1146,8 @@ def : PatGprGpr<srem, MOD_D>;
11461146
def : PatGprGpr_32<srem, MOD_W>;
11471147
def : PatGprGpr<urem, MOD_DU>;
11481148
def : PatGprGpr<loongarch_mod_wu, MOD_WU>;
1149-
def : PatGprGpr<rotr, ROTR_D>;
1150-
def : PatGprGpr<loongarch_rotr_w, ROTR_W>;
1149+
def : PatGprGpr<shiftop<rotr>, ROTR_D>;
1150+
def : PatGprGpr<shiftopw<loongarch_rotr_w>, ROTR_W>;
11511151
def : PatGprImm<rotr, ROTRI_D, uimm6>;
11521152
def : PatGprImm_32<rotr, ROTRI_W, uimm5>;
11531153
def : PatGprImm<loongarch_rotr_w, ROTRI_W, uimm5>;

llvm/test/CodeGen/LoongArch/rotl-rotr.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
define signext i32 @rotl_32(i32 signext %x, i32 signext %y) nounwind {
66
; LA32-LABEL: rotl_32:
77
; LA32: # %bb.0:
8-
; LA32-NEXT: ori $a2, $zero, 32
9-
; LA32-NEXT: sub.w $a1, $a2, $a1
8+
; LA32-NEXT: sub.w $a1, $zero, $a1
109
; LA32-NEXT: rotr.w $a0, $a0, $a1
1110
; LA32-NEXT: ret
1211
;
1312
; LA64-LABEL: rotl_32:
1413
; LA64: # %bb.0:
15-
; LA64-NEXT: ori $a2, $zero, 32
16-
; LA64-NEXT: sub.d $a1, $a2, $a1
14+
; LA64-NEXT: sub.d $a1, $zero, $a1
1715
; LA64-NEXT: rotr.w $a0, $a0, $a1
1816
; LA64-NEXT: ret
1917
%z = sub i32 32, %y
@@ -80,8 +78,7 @@ define i64 @rotl_64(i64 %x, i64 %y) nounwind {
8078
;
8179
; LA64-LABEL: rotl_64:
8280
; LA64: # %bb.0:
83-
; LA64-NEXT: ori $a2, $zero, 64
84-
; LA64-NEXT: sub.d $a1, $a2, $a1
81+
; LA64-NEXT: sub.d $a1, $zero, $a1
8582
; LA64-NEXT: rotr.d $a0, $a0, $a1
8683
; LA64-NEXT: ret
8784
%z = sub i64 64, %y
@@ -149,8 +146,7 @@ define signext i32 @rotl_32_mask(i32 signext %x, i32 signext %y) nounwind {
149146
;
150147
; LA64-LABEL: rotl_32_mask:
151148
; LA64: # %bb.0:
152-
; LA64-NEXT: ori $a2, $zero, 32
153-
; LA64-NEXT: sub.d $a1, $a2, $a1
149+
; LA64-NEXT: sub.d $a1, $zero, $a1
154150
; LA64-NEXT: rotr.w $a0, $a0, $a1
155151
; LA64-NEXT: ret
156152
%z = sub i32 0, %y
@@ -170,8 +166,7 @@ define signext i32 @rotl_32_mask_and_63_and_31(i32 signext %x, i32 signext %y) n
170166
;
171167
; LA64-LABEL: rotl_32_mask_and_63_and_31:
172168
; LA64: # %bb.0:
173-
; LA64-NEXT: ori $a2, $zero, 32
174-
; LA64-NEXT: sub.d $a1, $a2, $a1
169+
; LA64-NEXT: sub.d $a1, $zero, $a1
175170
; LA64-NEXT: rotr.w $a0, $a0, $a1
176171
; LA64-NEXT: ret
177172
%a = and i32 %y, 63
@@ -192,8 +187,7 @@ define signext i32 @rotl_32_mask_or_64_or_32(i32 signext %x, i32 signext %y) nou
192187
;
193188
; LA64-LABEL: rotl_32_mask_or_64_or_32:
194189
; LA64: # %bb.0:
195-
; LA64-NEXT: ori $a2, $zero, 32
196-
; LA64-NEXT: sub.d $a1, $a2, $a1
190+
; LA64-NEXT: sub.d $a1, $zero, $a1
197191
; LA64-NEXT: rotr.w $a0, $a0, $a1
198192
; LA64-NEXT: ret
199193
%a = or i32 %y, 64

0 commit comments

Comments
 (0)