Skip to content

Commit 90f8be4

Browse files
author
Yeting Kuo
committed
[RISCV] Refine pattern (select_cc seteq (and x, C), 0, 0, A) with Zbs.
PR llvm#72978 disabled transformation (select_cc seteq (and x, C), 0, 0, A) -> (and (sra(shl x)), A) for better Zicond codegen. It still enables the combine when C is not fit into 12-bits. This patch disables the combine when Zbs enabled.
1 parent f73844d commit 90f8be4

File tree

2 files changed

+15
-22
lines changed

2 files changed

+15
-22
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19808,7 +19808,7 @@ RISCVTargetLowering::BuildSDIVPow2(SDNode *N, const APInt &Divisor,
1980819808
bool RISCVTargetLowering::shouldFoldSelectWithSingleBitTest(
1980919809
EVT VT, const APInt &AndMask) const {
1981019810
if (Subtarget.hasStdExtZicond() || Subtarget.hasVendorXVentanaCondOps())
19811-
return AndMask.ugt(1024);
19811+
return !Subtarget.hasStdExtZbs() && AndMask.ugt(1024);
1981219812
return TargetLowering::shouldFoldSelectWithSingleBitTest(VT, AndMask);
1981319813
}
1981419814

llvm/test/CodeGen/RISCV/condops.ll

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ define i64 @zero_singlebit1(i64 %rs1, i64 %rs2) {
129129
ret i64 %sel
130130
}
131131

132-
; TODO: Optimize Zicond case.
133132
define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
134133
; RV32I-LABEL: zero_singlebit2:
135134
; RV32I: # %bb.0:
@@ -148,9 +147,8 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
148147
;
149148
; RV64XVENTANACONDOPS-LABEL: zero_singlebit2:
150149
; RV64XVENTANACONDOPS: # %bb.0:
151-
; RV64XVENTANACONDOPS-NEXT: slli a1, a1, 51
152-
; RV64XVENTANACONDOPS-NEXT: srai a1, a1, 63
153-
; RV64XVENTANACONDOPS-NEXT: and a0, a1, a0
150+
; RV64XVENTANACONDOPS-NEXT: bexti a1, a1, 12
151+
; RV64XVENTANACONDOPS-NEXT: vt.maskc a0, a0, a1
154152
; RV64XVENTANACONDOPS-NEXT: ret
155153
;
156154
; RV64XTHEADCONDMOV-LABEL: zero_singlebit2:
@@ -162,17 +160,15 @@ define i64 @zero_singlebit2(i64 %rs1, i64 %rs2) {
162160
;
163161
; RV32ZICOND-LABEL: zero_singlebit2:
164162
; RV32ZICOND: # %bb.0:
165-
; RV32ZICOND-NEXT: slli a2, a2, 19
166-
; RV32ZICOND-NEXT: srai a2, a2, 31
167-
; RV32ZICOND-NEXT: and a0, a2, a0
168-
; RV32ZICOND-NEXT: and a1, a2, a1
163+
; RV32ZICOND-NEXT: bexti a2, a2, 12
164+
; RV32ZICOND-NEXT: czero.eqz a0, a0, a2
165+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a2
169166
; RV32ZICOND-NEXT: ret
170167
;
171168
; RV64ZICOND-LABEL: zero_singlebit2:
172169
; RV64ZICOND: # %bb.0:
173-
; RV64ZICOND-NEXT: slli a1, a1, 51
174-
; RV64ZICOND-NEXT: srai a1, a1, 63
175-
; RV64ZICOND-NEXT: and a0, a1, a0
170+
; RV64ZICOND-NEXT: bexti a1, a1, 12
171+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
176172
; RV64ZICOND-NEXT: ret
177173
%and = and i64 %rs2, 4096
178174
%rc = icmp eq i64 %and, 0
@@ -3694,9 +3690,8 @@ define i64 @single_bit2(i64 %x) {
36943690
;
36953691
; RV64XVENTANACONDOPS-LABEL: single_bit2:
36963692
; RV64XVENTANACONDOPS: # %bb.0: # %entry
3697-
; RV64XVENTANACONDOPS-NEXT: slli a1, a0, 52
3698-
; RV64XVENTANACONDOPS-NEXT: srai a1, a1, 63
3699-
; RV64XVENTANACONDOPS-NEXT: and a0, a1, a0
3693+
; RV64XVENTANACONDOPS-NEXT: bexti a1, a0, 11
3694+
; RV64XVENTANACONDOPS-NEXT: vt.maskc a0, a0, a1
37003695
; RV64XVENTANACONDOPS-NEXT: ret
37013696
;
37023697
; RV64XTHEADCONDMOV-LABEL: single_bit2:
@@ -3708,17 +3703,15 @@ define i64 @single_bit2(i64 %x) {
37083703
;
37093704
; RV32ZICOND-LABEL: single_bit2:
37103705
; RV32ZICOND: # %bb.0: # %entry
3711-
; RV32ZICOND-NEXT: slli a2, a0, 20
3712-
; RV32ZICOND-NEXT: srai a2, a2, 31
3713-
; RV32ZICOND-NEXT: and a0, a2, a0
3714-
; RV32ZICOND-NEXT: and a1, a2, a1
3706+
; RV32ZICOND-NEXT: bexti a2, a0, 11
3707+
; RV32ZICOND-NEXT: czero.eqz a0, a0, a2
3708+
; RV32ZICOND-NEXT: czero.eqz a1, a1, a2
37153709
; RV32ZICOND-NEXT: ret
37163710
;
37173711
; RV64ZICOND-LABEL: single_bit2:
37183712
; RV64ZICOND: # %bb.0: # %entry
3719-
; RV64ZICOND-NEXT: slli a1, a0, 52
3720-
; RV64ZICOND-NEXT: srai a1, a1, 63
3721-
; RV64ZICOND-NEXT: and a0, a1, a0
3713+
; RV64ZICOND-NEXT: bexti a1, a0, 11
3714+
; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
37223715
; RV64ZICOND-NEXT: ret
37233716
entry:
37243717
%and = and i64 %x, 2048

0 commit comments

Comments
 (0)