[PATCH] D130251: [DAGCombine] Mask don't have to be (EltSize - 1) exactly when combining rotation
Wang Pengcheng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 21 04:54:25 PDT 2022
pcwang-thead updated this revision to Diff 446439.
pcwang-thead added a comment.
Rebase on precommit test.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D130251/new/
https://reviews.llvm.org/D130251
Files:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/RISCV/rotl-rotr.ll
Index: llvm/test/CodeGen/RISCV/rotl-rotr.ll
===================================================================
--- llvm/test/CodeGen/RISCV/rotl-rotr.ll
+++ llvm/test/CodeGen/RISCV/rotl-rotr.ll
@@ -341,18 +341,12 @@
;
; RV32ZBB-LABEL: rotl_32_mask_1:
; RV32ZBB: # %bb.0:
-; RV32ZBB-NEXT: sll a2, a0, a1
-; RV32ZBB-NEXT: neg a1, a1
-; RV32ZBB-NEXT: srl a0, a0, a1
-; RV32ZBB-NEXT: or a0, a2, a0
+; RV32ZBB-NEXT: rol a0, a0, a1
; RV32ZBB-NEXT: ret
;
; RV64ZBB-LABEL: rotl_32_mask_1:
; RV64ZBB: # %bb.0:
-; RV64ZBB-NEXT: sllw a2, a0, a1
-; RV64ZBB-NEXT: negw a1, a1
-; RV64ZBB-NEXT: srlw a0, a0, a1
-; RV64ZBB-NEXT: or a0, a2, a0
+; RV64ZBB-NEXT: rolw a0, a0, a1
; RV64ZBB-NEXT: ret
%a = and i32 %y, 63
%b = shl i32 %x, %a
@@ -416,18 +410,12 @@
;
; RV32ZBB-LABEL: rotr_32_mask_1:
; RV32ZBB: # %bb.0:
-; RV32ZBB-NEXT: srl a2, a0, a1
-; RV32ZBB-NEXT: neg a1, a1
-; RV32ZBB-NEXT: sll a0, a0, a1
-; RV32ZBB-NEXT: or a0, a2, a0
+; RV32ZBB-NEXT: ror a0, a0, a1
; RV32ZBB-NEXT: ret
;
; RV64ZBB-LABEL: rotr_32_mask_1:
; RV64ZBB: # %bb.0:
-; RV64ZBB-NEXT: srlw a2, a0, a1
-; RV64ZBB-NEXT: negw a1, a1
-; RV64ZBB-NEXT: sllw a0, a0, a1
-; RV64ZBB-NEXT: or a0, a2, a0
+; RV64ZBB-NEXT: rorw a0, a0, a1
; RV64ZBB-NEXT: ret
%a = and i32 %y, 63
%b = lshr i32 %x, %a
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -7316,8 +7316,7 @@
if (ConstantSDNode *NegC = isConstOrConstSplat(Neg.getOperand(1))) {
KnownBits Known = DAG.computeKnownBits(Neg.getOperand(0));
unsigned Bits = Log2_64(EltSize);
- if (NegC->getAPIntValue().getActiveBits() <= Bits &&
- ((NegC->getAPIntValue() | Known.Zero).countTrailingOnes() >= Bits)) {
+ if ((NegC->getAPIntValue() | Known.Zero).countTrailingOnes() >= Bits) {
Neg = Neg.getOperand(0);
MaskLoBits = Bits;
}
@@ -7337,9 +7336,8 @@
if (MaskLoBits && Pos.getOpcode() == ISD::AND) {
if (ConstantSDNode *PosC = isConstOrConstSplat(Pos.getOperand(1))) {
KnownBits Known = DAG.computeKnownBits(Pos.getOperand(0));
- if (PosC->getAPIntValue().getActiveBits() <= MaskLoBits &&
- ((PosC->getAPIntValue() | Known.Zero).countTrailingOnes() >=
- MaskLoBits))
+ if ((PosC->getAPIntValue() | Known.Zero).countTrailingOnes() >=
+ MaskLoBits)
Pos = Pos.getOperand(0);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130251.446439.patch
Type: text/x-patch
Size: 2603 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220721/a00bd558/attachment.bin>
More information about the llvm-commits
mailing list