Skip to content

Commit c557ce9

Browse files
committed
[RISCV] Use add_like_non_imm12 in XTheadba patterns to match Zba.
1 parent 6a76963 commit c557ce9

File tree

2 files changed

+72
-14
lines changed

2 files changed

+72
-14
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -536,22 +536,22 @@ multiclass VPatTernaryVMAQA_VV_VX<string intrinsic, string instruction,
536536
//===----------------------------------------------------------------------===//
537537

538538
let Predicates = [HasVendorXTHeadBa] in {
539-
def : Pat<(add (XLenVT GPR:$rs1), (shl GPR:$rs2, uimm2:$uimm2)),
539+
def : Pat<(add_like_non_imm12 (shl GPR:$rs2, uimm2:$uimm2), (XLenVT GPR:$rs1)),
540540
(TH_ADDSL GPR:$rs1, GPR:$rs2, uimm2:$uimm2)>;
541541
def : Pat<(XLenVT (riscv_shl_add GPR:$rs1, uimm2:$uimm2, GPR:$rs2)),
542542
(TH_ADDSL GPR:$rs2, GPR:$rs1, uimm2:$uimm2)>;
543543

544544
// Reuse complex patterns from StdExtZba
545-
def : Pat<(add_non_imm12 sh1add_op:$rs1, (XLenVT GPR:$rs2)),
545+
def : Pat<(add_like_non_imm12 sh1add_op:$rs1, (XLenVT GPR:$rs2)),
546546
(TH_ADDSL GPR:$rs2, sh1add_op:$rs1, 1)>;
547-
def : Pat<(add_non_imm12 sh2add_op:$rs1, (XLenVT GPR:$rs2)),
547+
def : Pat<(add_like_non_imm12 sh2add_op:$rs1, (XLenVT GPR:$rs2)),
548548
(TH_ADDSL GPR:$rs2, sh2add_op:$rs1, 2)>;
549-
def : Pat<(add_non_imm12 sh3add_op:$rs1, (XLenVT GPR:$rs2)),
549+
def : Pat<(add_like_non_imm12 sh3add_op:$rs1, (XLenVT GPR:$rs2)),
550550
(TH_ADDSL GPR:$rs2, sh3add_op:$rs1, 3)>;
551551

552-
def : Pat<(add (XLenVT GPR:$r), CSImm12MulBy4:$i),
552+
def : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy4:$i),
553553
(TH_ADDSL GPR:$r, (XLenVT (ADDI (XLenVT X0), CSImm12MulBy4:$i)), 2)>;
554-
def : Pat<(add (XLenVT GPR:$r), CSImm12MulBy8:$i),
554+
def : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy8:$i),
555555
(TH_ADDSL GPR:$r, (XLenVT (ADDI (XLenVT X0), CSImm12MulBy8:$i)), 3)>;
556556
} // Predicates = [HasVendorXTHeadBa]
557557

llvm/test/CodeGen/RISCV/rv64xtheadba.ll

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,25 @@ define i64 @addmul6(i64 %a, i64 %b) {
109109
ret i64 %d
110110
}
111111

112+
define i64 @disjointormul6(i64 %a, i64 %b) {
113+
; RV64I-LABEL: disjointormul6:
114+
; RV64I: # %bb.0:
115+
; RV64I-NEXT: slli a2, a0, 1
116+
; RV64I-NEXT: slli a0, a0, 3
117+
; RV64I-NEXT: sub a0, a0, a2
118+
; RV64I-NEXT: or a0, a0, a1
119+
; RV64I-NEXT: ret
120+
;
121+
; RV64XTHEADBA-LABEL: disjointormul6:
122+
; RV64XTHEADBA: # %bb.0:
123+
; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 1
124+
; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 1
125+
; RV64XTHEADBA-NEXT: ret
126+
%c = mul i64 %a, 6
127+
%d = or disjoint i64 %c, %b
128+
ret i64 %d
129+
}
130+
112131
define i64 @addmul10(i64 %a, i64 %b) {
113132
; RV64I-LABEL: addmul10:
114133
; RV64I: # %bb.0:
@@ -423,8 +442,8 @@ define i64 @add255mul180(i64 %a) {
423442
; RV64XTHEADBA: # %bb.0:
424443
; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 2
425444
; RV64XTHEADBA-NEXT: th.addsl a0, a0, a0, 3
426-
; RV64XTHEADBA-NEXT: li a1, 255
427-
; RV64XTHEADBA-NEXT: th.addsl a0, a1, a0, 2
445+
; RV64XTHEADBA-NEXT: slli a0, a0, 2
446+
; RV64XTHEADBA-NEXT: addi a0, a0, 255
428447
; RV64XTHEADBA-NEXT: ret
429448
%c = mul i64 %a, 180
430449
%d = add i64 %c, 255
@@ -642,6 +661,39 @@ define i64 @mul288(i64 %a) {
642661
ret i64 %c
643662
}
644663

664+
define i64 @sh1add_imm(i64 %0) {
665+
; CHECK-LABEL: sh1add_imm:
666+
; CHECK: # %bb.0:
667+
; CHECK-NEXT: slli a0, a0, 1
668+
; CHECK-NEXT: addi a0, a0, 5
669+
; CHECK-NEXT: ret
670+
%a = shl i64 %0, 1
671+
%b = add i64 %a, 5
672+
ret i64 %b
673+
}
674+
675+
define i64 @sh2add_imm(i64 %0) {
676+
; CHECK-LABEL: sh2add_imm:
677+
; CHECK: # %bb.0:
678+
; CHECK-NEXT: slli a0, a0, 2
679+
; CHECK-NEXT: addi a0, a0, -6
680+
; CHECK-NEXT: ret
681+
%a = shl i64 %0, 2
682+
%b = add i64 %a, -6
683+
ret i64 %b
684+
}
685+
686+
define i64 @sh3add_imm(i64 %0) {
687+
; CHECK-LABEL: sh3add_imm:
688+
; CHECK: # %bb.0:
689+
; CHECK-NEXT: slli a0, a0, 3
690+
; CHECK-NEXT: addi a0, a0, 7
691+
; CHECK-NEXT: ret
692+
%a = shl i64 %0, 3
693+
%b = add i64 %a, 7
694+
ret i64 %b
695+
}
696+
645697
define i64 @mul258(i64 %a) {
646698
; RV64I-LABEL: mul258:
647699
; RV64I: # %bb.0:
@@ -983,12 +1035,18 @@ define i64 @add4104(i64 %a) {
9831035
}
9841036

9851037
define i64 @add4104_2(i64 %a) {
986-
; CHECK-LABEL: add4104_2:
987-
; CHECK: # %bb.0:
988-
; CHECK-NEXT: lui a1, 1
989-
; CHECK-NEXT: addiw a1, a1, 8
990-
; CHECK-NEXT: or a0, a0, a1
991-
; CHECK-NEXT: ret
1038+
; RV64I-LABEL: add4104_2:
1039+
; RV64I: # %bb.0:
1040+
; RV64I-NEXT: lui a1, 1
1041+
; RV64I-NEXT: addiw a1, a1, 8
1042+
; RV64I-NEXT: or a0, a0, a1
1043+
; RV64I-NEXT: ret
1044+
;
1045+
; RV64XTHEADBA-LABEL: add4104_2:
1046+
; RV64XTHEADBA: # %bb.0:
1047+
; RV64XTHEADBA-NEXT: li a1, 1026
1048+
; RV64XTHEADBA-NEXT: th.addsl a0, a0, a1, 2
1049+
; RV64XTHEADBA-NEXT: ret
9921050
%c = or disjoint i64 %a, 4104
9931051
ret i64 %c
9941052
}

0 commit comments

Comments
 (0)