Skip to content

Commit aec7179

Browse files
committed
Restore shift mask from known bits.
1 parent 3018057 commit aec7179

File tree

3 files changed

+75
-14
lines changed

3 files changed

+75
-14
lines changed

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "RISCVSubtarget.h"
1717
#include "RISCVTargetMachine.h"
1818
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
19+
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
1920
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
2021
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2122
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
@@ -183,9 +184,11 @@ RISCVInstructionSelector::selectShiftMask(MachineOperand &Root) const {
183184
if (ShMask.isSubsetOf(AndMask)) {
184185
ShAmtReg = AndSrcReg;
185186
} else {
186-
// TODO:
187187
// SimplifyDemandedBits may have optimized the mask so try restoring any
188188
// bits that are known zero.
189+
KnownBits Known = KB->getKnownBits(ShAmtReg);
190+
if (ShMask.isSubsetOf(AndMask | Known.Zero))
191+
ShAmtReg = AndSrcReg;
189192
}
190193
}
191194

@@ -200,18 +203,18 @@ RISCVInstructionSelector::selectShiftMask(MachineOperand &Root) const {
200203
if (Imm != 0 && Imm.urem(ShiftWidth) == 0) {
201204
// If we are shifting by N-X where N == 0 mod Size, then just shift by -X
202205
// to generate a NEG instead of a SUB of a constant.
203-
ShAmtReg = MRI.createGenericVirtualRegister(ShiftLLT);
206+
ShAmtReg = MRI.createVirtualRegister(&RISCV::GPRRegClass);
204207
unsigned NegOpc = Subtarget->is64Bit() ? RISCV::SUBW : RISCV::SUB;
205208
return {{[=](MachineInstrBuilder &MIB) {
206209
MachineIRBuilder(*MIB.getInstr())
207210
.buildInstr(NegOpc, {ShAmtReg}, {Register(RISCV::X0), Reg});
208211
MIB.addReg(ShAmtReg);
209212
}}};
210213
}
211-
if ((Imm.urem(ShiftWidth) & (ShiftWidth - 1)) == ShiftWidth - 1) {
214+
if (Imm.urem(ShiftWidth) == ShiftWidth - 1) {
212215
// If we are shifting by N-X where N == -1 mod Size, then just shift by ~X
213216
// to generate a NOT instead of a SUB of a constant.
214-
ShAmtReg = MRI.createGenericVirtualRegister(ShiftLLT);
217+
ShAmtReg = MRI.createVirtualRegister(&RISCV::GPRRegClass);
215218
return {{[=](MachineInstrBuilder &MIB) {
216219
MachineIRBuilder(*MIB.getInstr())
217220
.buildInstr(RISCV::XORI, {ShAmtReg}, {Reg})

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/shift-rv32.mir

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,35 @@ body: |
5353
PseudoRET implicit $x10
5454
...
5555

56+
---
57+
name: shl_and_with_simplified_mask
58+
legalized: true
59+
regBankSelected: true
60+
tracksRegLiveness: true
61+
body: |
62+
bb.0:
63+
liveins: $x10, $x11
64+
65+
; CHECK-LABEL: name: shl_and_with_simplified_mask
66+
; CHECK: liveins: $x10, $x11
67+
; CHECK-NEXT: {{ $}}
68+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
69+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
70+
; CHECK-NEXT: [[ANDI:%[0-9]+]]:gpr = ANDI [[COPY1]], 31
71+
; CHECK-NEXT: [[SLL:%[0-9]+]]:gpr = SLL [[COPY]], [[ANDI]]
72+
; CHECK-NEXT: $x10 = COPY [[SLL]]
73+
; CHECK-NEXT: PseudoRET implicit $x10
74+
%0:gprb(s32) = COPY $x10
75+
%1:gprb(s32) = COPY $x11
76+
%2:gprb(s32) = G_CONSTANT i32 31
77+
%3:gprb(s32) = G_AND %1, %2
78+
%4:gprb(s32) = G_CONSTANT i32 31
79+
%5:gprb(s32) = G_AND %3, %4
80+
%6:gprb(s32) = G_SHL %0, %5(s32)
81+
$x10 = COPY %6(s32)
82+
PseudoRET implicit $x10
83+
...
84+
5685
---
5786
name: shl_add
5887
legalized: true

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/shift-rv64.mir

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,35 @@ body: |
7777
PseudoRET implicit $x10
7878
...
7979

80+
---
81+
name: shl_and_with_simplified_mask
82+
legalized: true
83+
regBankSelected: true
84+
tracksRegLiveness: true
85+
body: |
86+
bb.0:
87+
liveins: $x10, $x11
88+
89+
; CHECK-LABEL: name: shl_and_with_simplified_mask
90+
; CHECK: liveins: $x10, $x11
91+
; CHECK-NEXT: {{ $}}
92+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
93+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
94+
; CHECK-NEXT: [[ANDI:%[0-9]+]]:gpr = ANDI [[COPY1]], 62
95+
; CHECK-NEXT: [[SLL:%[0-9]+]]:gpr = SLL [[COPY]], [[ANDI]]
96+
; CHECK-NEXT: $x10 = COPY [[SLL]]
97+
; CHECK-NEXT: PseudoRET implicit $x10
98+
%0:gprb(s64) = COPY $x10
99+
%1:gprb(s64) = COPY $x11
100+
%2:gprb(s64) = G_CONSTANT i64 62
101+
%3:gprb(s64) = G_AND %1, %2
102+
%4:gprb(s64) = G_CONSTANT i64 62
103+
%5:gprb(s64) = G_AND %3, %4
104+
%6:gprb(s64) = G_SHL %0, %5(s64)
105+
$x10 = COPY %6(s64)
106+
PseudoRET implicit $x10
107+
...
108+
80109
---
81110
name: shl_add
82111
legalized: true
@@ -197,18 +226,18 @@ body: |
197226
; CHECK: liveins: $x10, $x11
198227
; CHECK-NEXT: {{ $}}
199228
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
200-
; CHECK-NEXT: %addr:gpr = COPY $x11
201-
; CHECK-NEXT: [[LBU:%[0-9]+]]:gpr = LBU %addr, 0 :: (load (s8))
202-
; CHECK-NEXT: [[SLL:%[0-9]+]]:gpr = SLL [[COPY]], [[LBU]]
229+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
230+
; CHECK-NEXT: [[LW:%[0-9]+]]:gpr = LW [[COPY1]], 0 :: (load (s32))
231+
; CHECK-NEXT: [[SLL:%[0-9]+]]:gpr = SLL [[COPY]], [[LW]]
203232
; CHECK-NEXT: $x10 = COPY [[SLL]]
204233
; CHECK-NEXT: PseudoRET implicit $x10
205234
%0:gprb(s64) = COPY $x10
206-
%addr:gprb(p0) = COPY $x11
207-
%1:gprb(s32) = G_LOAD %addr(p0) :: (load (s8))
208-
%2:gprb(s32) = G_CONSTANT i32 63
209-
%3:gprb(s32) = G_AND %1, %2
210-
%4:gprb(s64) = G_ZEXT %3
211-
%5:gprb(s64) = G_SHL %0, %4(s64)
212-
$x10 = COPY %5(s64)
235+
%1:gprb(p0) = COPY $x11
236+
%2:gprb(s32) = G_LOAD %1(p0) :: (load (s32))
237+
%3:gprb(s32) = G_CONSTANT i32 63
238+
%4:gprb(s32) = G_AND %2, %3
239+
%5:gprb(s64) = G_ZEXT %4
240+
%6:gprb(s64) = G_SHL %0, %5(s64)
241+
$x10 = COPY %6(s64)
213242
PseudoRET implicit $x10
214243
...

0 commit comments

Comments
 (0)