Skip to content

Commit 49ecc01

Browse files
committed
ISel changes for corner cases
1 parent 04a6a40 commit 49ecc01

File tree

2 files changed

+18
-26
lines changed

2 files changed

+18
-26
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15947,7 +15947,6 @@ static SDValue expandMulToNAFSequence(SDNode *N, SelectionDAG &DAG,
1594715947
// X * (2^N +/- 2^M) -> (add/sub (shl X, C1), (shl X, C2))
1594815948
static SDValue expandMulToAddOrSubOfShl(SDNode *N, SelectionDAG &DAG,
1594915949
uint64_t MulAmt) {
15950-
1595115950
uint64_t MulAmtLowBit = MulAmt & (-MulAmt);
1595215951
ISD::NodeType Op;
1595315952
uint64_t ShiftAmt1;
@@ -15994,6 +15993,10 @@ static SDValue expandMul(SDNode *N, SelectionDAG &DAG,
1599415993
return SDValue();
1599515994
uint64_t MulAmt = CNode->getZExtValue();
1599615995

15996+
// Don't do this if the Xqciac extension is enabled and the MulAmt in simm12.
15997+
if (Subtarget.hasVendorXqciac() && isInt<12>(MulAmt))
15998+
return SDValue();
15999+
1599716000
const bool HasShlAdd = Subtarget.hasStdExtZba() ||
1599816001
Subtarget.hasVendorXTHeadBa() ||
1599916002
Subtarget.hasVendorXAndesPerf();
@@ -23753,6 +23756,10 @@ bool RISCVTargetLowering::decomposeMulByConstant(LLVMContext &Context, EVT VT,
2375323756
auto *ConstNode = cast<ConstantSDNode>(C);
2375423757
const APInt &Imm = ConstNode->getAPIntValue();
2375523758

23759+
// Don't do this if the Xqciac extension is enabled and the Imm in simm12.
23760+
if (Subtarget.hasVendorXqciac() && Imm.isSignedIntN(12))
23761+
return false;
23762+
2375623763
// Break the MUL to a SLLI and an ADD/SUB.
2375723764
if ((Imm + 1).isPowerOf2() || (Imm - 1).isPowerOf2() ||
2375823765
(1 - Imm).isPowerOf2() || (-1 - Imm).isPowerOf2())

llvm/test/CodeGen/RISCV/xqciac.ll

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ define dso_local i32 @mul(i32 %a, i32 %b) local_unnamed_addr #0 {
1515
;
1616
; RV32IMXQCIAC-LABEL: mul:
1717
; RV32IMXQCIAC: # %bb.0: # %entry
18-
; RV32IMXQCIAC-NEXT: slli a0, a1, 5
19-
; RV32IMXQCIAC-NEXT: add a0, a0, a1
18+
; RV32IMXQCIAC-NEXT: li a0, 33
19+
; RV32IMXQCIAC-NEXT: mul a0, a1, a0
2020
; RV32IMXQCIAC-NEXT: ret
2121
;
2222
; RV32IZBAMXQCIAC-LABEL: mul:
2323
; RV32IZBAMXQCIAC: # %bb.0: # %entry
24-
; RV32IZBAMXQCIAC-NEXT: slli a0, a1, 5
25-
; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
24+
; RV32IZBAMXQCIAC-NEXT: li a0, 33
25+
; RV32IZBAMXQCIAC-NEXT: mul a0, a1, a0
2626
; RV32IZBAMXQCIAC-NEXT: ret
2727
entry:
2828
%mul = mul nsw i32 %b, 33
@@ -131,16 +131,12 @@ define dso_local i32 @pow2immplus1(i32 %a, i32 %b) local_unnamed_addr #0 {
131131
;
132132
; RV32IMXQCIAC-LABEL: pow2immplus1:
133133
; RV32IMXQCIAC: # %bb.0: # %entry
134-
; RV32IMXQCIAC-NEXT: slli a2, a1, 5
135-
; RV32IMXQCIAC-NEXT: add a0, a0, a1
136-
; RV32IMXQCIAC-NEXT: add a0, a0, a2
134+
; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, 33
137135
; RV32IMXQCIAC-NEXT: ret
138136
;
139137
; RV32IZBAMXQCIAC-LABEL: pow2immplus1:
140138
; RV32IZBAMXQCIAC: # %bb.0: # %entry
141-
; RV32IZBAMXQCIAC-NEXT: slli a2, a1, 5
142-
; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
143-
; RV32IZBAMXQCIAC-NEXT: add a0, a0, a2
139+
; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, 33
144140
; RV32IZBAMXQCIAC-NEXT: ret
145141
entry:
146142
%mul = mul nsw i32 %b, 33
@@ -159,18 +155,12 @@ define dso_local i32 @pow2immminus2(i32 %a, i32 %b) local_unnamed_addr #0 {
159155
;
160156
; RV32IMXQCIAC-LABEL: pow2immminus2:
161157
; RV32IMXQCIAC: # %bb.0: # %entry
162-
; RV32IMXQCIAC-NEXT: slli a2, a1, 1
163-
; RV32IMXQCIAC-NEXT: slli a1, a1, 7
164-
; RV32IMXQCIAC-NEXT: sub a1, a1, a2
165-
; RV32IMXQCIAC-NEXT: add a0, a0, a1
158+
; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, 126
166159
; RV32IMXQCIAC-NEXT: ret
167160
;
168161
; RV32IZBAMXQCIAC-LABEL: pow2immminus2:
169162
; RV32IZBAMXQCIAC: # %bb.0: # %entry
170-
; RV32IZBAMXQCIAC-NEXT: slli a2, a1, 1
171-
; RV32IZBAMXQCIAC-NEXT: slli a1, a1, 7
172-
; RV32IZBAMXQCIAC-NEXT: sub a1, a1, a2
173-
; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
163+
; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, 126
174164
; RV32IZBAMXQCIAC-NEXT: ret
175165
entry:
176166
%mul = mul nsw i32 %b, 126
@@ -189,17 +179,12 @@ define dso_local i32 @pow2minuspow2(i32 %a, i32 %b) local_unnamed_addr #0 {
189179
;
190180
; RV32IMXQCIAC-LABEL: pow2minuspow2:
191181
; RV32IMXQCIAC: # %bb.0: # %entry
192-
; RV32IMXQCIAC-NEXT: slli a2, a1, 7
193-
; RV32IMXQCIAC-NEXT: slli a1, a1, 9
194-
; RV32IMXQCIAC-NEXT: sub a1, a1, a2
195-
; RV32IMXQCIAC-NEXT: add a0, a0, a1
182+
; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, 384
196183
; RV32IMXQCIAC-NEXT: ret
197184
;
198185
; RV32IZBAMXQCIAC-LABEL: pow2minuspow2:
199186
; RV32IZBAMXQCIAC: # %bb.0: # %entry
200-
; RV32IZBAMXQCIAC-NEXT: sh1add a1, a1, a1
201-
; RV32IZBAMXQCIAC-NEXT: slli a1, a1, 7
202-
; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
187+
; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, 384
203188
; RV32IZBAMXQCIAC-NEXT: ret
204189
entry:
205190
%mul = mul nsw i32 %b, 384

0 commit comments

Comments
 (0)