diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h @@ -45,6 +45,8 @@ bool SelectAddrFI(SDValue Addr, SDValue &Base); + bool isUnneededShiftMask(SDNode *N, unsigned Width) const; + bool MatchSRLIW(SDNode *N) const; bool MatchSLOI(SDNode *N) const; bool MatchSROI(SDNode *N) const; diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -17,6 +17,7 @@ #include "llvm/IR/IntrinsicsRISCV.h" #include "llvm/Support/Alignment.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/KnownBits.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" @@ -821,6 +822,21 @@ return false; } +// Helper to detect unneeded and instructions on shift amounts. Called +// from PatFrags in tablegen. +bool RISCVDAGToDAGISel::isUnneededShiftMask(SDNode *N, unsigned Width) const { + assert(N->getOpcode() == ISD::AND && "Unexpected opcode"); + assert(Width >= 5 && N->getValueSizeInBits(0) >= (1 << Width) && + "Unexpected width"); + const APInt &Val = N->getConstantOperandAPInt(1); + + if (Val.countTrailingOnes() >= Width) + return true; + + APInt Mask = Val | CurDAG->computeKnownBits(N->getOperand(0)).Zero; + return Mask.countTrailingOnes() >= Width; +} + // Match (srl (and val, mask), imm) where the result would be a // zero-extended 32-bit integer. i.e. the mask is 0xffffffff or the result // is equivalent to this (SimplifyDemandedBits may have removed lower bits diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -289,12 +289,6 @@ // Standalone (codegen-only) immleaf patterns. def simm32 : ImmLeaf(Imm);}]>; def simm32hi20 : ImmLeaf(Imm);}]>; -// A mask value that won't affect significant shift bits. -def immbottomxlenset : ImmLeafis64Bit()) - return countTrailingOnes(Imm) >= 6; - return countTrailingOnes(Imm) >= 5; -}]>; // A 6-bit constant greater than 32. def uimm6gt32 : ImmLeafis64Bit() ? 6 : 5); +}]>; +def shiftMask32 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{ + return isUnneededShiftMask(N, 5); +}]>; + class shiftop : PatFrags<(ops node:$val, node:$count), [(operator node:$val, node:$count), - (operator node:$val, (and node:$count, immbottomxlenset))]>; + (operator node:$val, (shiftMaskXLen node:$count))]>; class shiftopw : PatFrags<(ops node:$val, node:$count), [(operator node:$val, node:$count), - (operator node:$val, (and node:$count, (XLenVT 31)))]>; + (operator node:$val, (shiftMask32 node:$count))]>; def : PatGprGpr, SLL>; def : PatGprGpr, SRL>; diff --git a/llvm/test/CodeGen/RISCV/atomic-cmpxchg.ll b/llvm/test/CodeGen/RISCV/atomic-cmpxchg.ll --- a/llvm/test/CodeGen/RISCV/atomic-cmpxchg.ll +++ b/llvm/test/CodeGen/RISCV/atomic-cmpxchg.ll @@ -26,7 +26,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -103,7 +102,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -180,7 +178,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -257,7 +254,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -334,7 +330,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -411,7 +406,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -488,7 +482,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -565,7 +558,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -642,7 +634,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -719,7 +710,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a4, zero, 255 ; RV32IA-NEXT: sll a4, a4, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -796,7 +786,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -875,7 +864,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -954,7 +942,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1033,7 +1020,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1112,7 +1098,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1191,7 +1176,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1270,7 +1254,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1349,7 +1332,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1428,7 +1410,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 @@ -1507,7 +1488,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a3, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a4, 16 ; RV32IA-NEXT: addi a4, a4, -1 ; RV32IA-NEXT: sll a5, a4, a0 diff --git a/llvm/test/CodeGen/RISCV/atomic-rmw.ll b/llvm/test/CodeGen/RISCV/atomic-rmw.ll --- a/llvm/test/CodeGen/RISCV/atomic-rmw.ll +++ b/llvm/test/CodeGen/RISCV/atomic-rmw.ll @@ -23,7 +23,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -88,7 +87,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -153,7 +151,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -218,7 +215,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -283,7 +279,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -348,7 +343,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -413,7 +407,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -478,7 +471,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -543,7 +535,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -608,7 +599,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -673,7 +663,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -738,7 +727,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -803,7 +791,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -868,7 +855,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -933,7 +919,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -998,7 +983,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: not a3, a3 @@ -1051,7 +1035,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: not a3, a3 @@ -1104,7 +1087,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: not a3, a3 @@ -1157,7 +1139,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: not a3, a3 @@ -1210,7 +1191,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: not a3, a3 @@ -1263,7 +1243,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -1330,7 +1309,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -1397,7 +1375,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -1464,7 +1441,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -1531,7 +1507,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -1598,7 +1573,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoor.w a1, a1, (a2) @@ -1643,7 +1617,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoor.w.aq a1, a1, (a2) @@ -1688,7 +1661,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoor.w.rl a1, a1, (a2) @@ -1733,7 +1705,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) @@ -1778,7 +1749,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoor.w.aqrl a1, a1, (a2) @@ -1823,7 +1793,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoxor.w a1, a1, (a2) @@ -1868,7 +1837,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoxor.w.aq a1, a1, (a2) @@ -1913,7 +1881,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoxor.w.rl a1, a1, (a2) @@ -1958,7 +1925,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) @@ -2003,7 +1969,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: andi a1, a1, 255 ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: amoxor.w.aqrl a1, a1, (a2) @@ -2080,21 +2045,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB35_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB35_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB35_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB35_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2228,21 +2193,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB36_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB36_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB36_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB36_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2376,21 +2341,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB37_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB37_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB37_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB37_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2524,21 +2489,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB38_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB38_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB38_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB38_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2672,21 +2637,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB39_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB39_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB39_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB39_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2820,21 +2785,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB40_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB40_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB40_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB40_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -2968,21 +2933,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB41_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB41_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB41_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB41_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -3116,21 +3081,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB42_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB42_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB42_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB42_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -3264,21 +3229,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB43_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB43_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB43_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB43_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -3412,21 +3377,21 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: addi a3, zero, 255 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: addi a4, zero, 255 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 24 ; RV32IA-NEXT: srai a1, a1, 24 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 24 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 24 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB44_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB44_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB44_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB44_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -3558,7 +3523,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -3691,7 +3655,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -3824,7 +3787,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -3957,7 +3919,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4090,7 +4051,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4223,7 +4183,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4356,7 +4315,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4489,7 +4447,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4622,7 +4579,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4755,7 +4711,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: addi a3, zero, 255 ; RV32IA-NEXT: sll a3, a3, a0 ; RV32IA-NEXT: andi a1, a1, 255 @@ -4858,7 +4813,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -4925,7 +4879,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -4992,7 +4945,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5059,7 +5011,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5126,7 +5077,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5193,7 +5143,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5260,7 +5209,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5327,7 +5275,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5394,7 +5341,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5461,7 +5407,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5528,7 +5473,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5595,7 +5539,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5662,7 +5605,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5729,7 +5671,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5796,7 +5737,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5863,7 +5803,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5918,7 +5857,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -5973,7 +5911,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6028,7 +5965,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6083,7 +6019,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6138,7 +6073,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6207,7 +6141,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6276,7 +6209,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6345,7 +6277,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6414,7 +6345,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -6483,7 +6413,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6532,7 +6461,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6581,7 +6509,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6630,7 +6557,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6679,7 +6605,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6728,7 +6653,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6777,7 +6701,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6826,7 +6749,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6875,7 +6797,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -6924,7 +6845,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a2, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: and a1, a1, a3 @@ -7005,22 +6925,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB90_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB90_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB90_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB90_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7155,22 +7075,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB91_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB91_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB91_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB91_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7305,22 +7225,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB92_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB92_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB92_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB92_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7455,22 +7375,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB93_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB93_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB93_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB93_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7605,22 +7525,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB94_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a3, a1, .LBB94_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a4, a1, .LBB94_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB94_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7755,22 +7675,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB95_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB95_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB95_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -7905,22 +7825,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB96_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB96_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB96_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -8055,22 +7975,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB97_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB97_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB97_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -8205,22 +8125,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB98_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB98_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB98_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -8355,22 +8275,22 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 -; RV32IA-NEXT: lui a3, 16 -; RV32IA-NEXT: addi a3, a3, -1 -; RV32IA-NEXT: sll a7, a3, a0 +; RV32IA-NEXT: andi a3, a0, 24 +; RV32IA-NEXT: lui a4, 16 +; RV32IA-NEXT: addi a4, a4, -1 +; RV32IA-NEXT: sll a7, a4, a0 ; RV32IA-NEXT: slli a1, a1, 16 ; RV32IA-NEXT: srai a1, a1, 16 ; RV32IA-NEXT: sll a1, a1, a0 -; RV32IA-NEXT: addi a4, zero, 16 -; RV32IA-NEXT: sub a4, a4, a0 +; RV32IA-NEXT: addi a5, zero, 16 +; RV32IA-NEXT: sub a3, a5, a3 ; RV32IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a5, (a6) -; RV32IA-NEXT: and a3, a5, a7 +; RV32IA-NEXT: and a4, a5, a7 ; RV32IA-NEXT: mv a2, a5 -; RV32IA-NEXT: sll a3, a3, a4 -; RV32IA-NEXT: sra a3, a3, a4 -; RV32IA-NEXT: bge a1, a3, .LBB99_3 +; RV32IA-NEXT: sll a4, a4, a3 +; RV32IA-NEXT: sra a4, a4, a3 +; RV32IA-NEXT: bge a1, a4, .LBB99_3 ; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB99_1 Depth=1 ; RV32IA-NEXT: xor a2, a5, a1 ; RV32IA-NEXT: and a2, a2, a7 @@ -8507,7 +8427,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -8650,7 +8569,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -8793,7 +8711,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -8936,7 +8853,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9079,7 +8995,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9222,7 +9137,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9365,7 +9279,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9508,7 +9421,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9651,7 +9563,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 @@ -9794,7 +9705,6 @@ ; RV32IA: # %bb.0: ; RV32IA-NEXT: andi a6, a0, -4 ; RV32IA-NEXT: slli a0, a0, 3 -; RV32IA-NEXT: andi a0, a0, 24 ; RV32IA-NEXT: lui a3, 16 ; RV32IA-NEXT: addi a3, a3, -1 ; RV32IA-NEXT: sll a4, a3, a0 diff --git a/llvm/test/CodeGen/RISCV/shift-masked-shamt.ll b/llvm/test/CodeGen/RISCV/shift-masked-shamt.ll --- a/llvm/test/CodeGen/RISCV/shift-masked-shamt.ll +++ b/llvm/test/CodeGen/RISCV/shift-masked-shamt.ll @@ -1,6 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ ; RUN: | FileCheck %s -check-prefix=RV32I +; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ +; RUN: | FileCheck %s -check-prefix=RV64I ; This test checks that unnecessary masking of shift amount operands is ; eliminated during instruction selection. The test needs to ensure that the @@ -11,6 +13,11 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: sll a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: sll_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: sllw a0, a0, a1 +; RV64I-NEXT: ret %1 = and i32 %b, 31 %2 = shl i32 %a, %1 ret i32 %2 @@ -22,6 +29,12 @@ ; RV32I-NEXT: andi a1, a1, 15 ; RV32I-NEXT: sll a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: sll_non_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: andi a1, a1, 15 +; RV64I-NEXT: sllw a0, a0, a1 +; RV64I-NEXT: ret %1 = and i32 %b, 15 %2 = shl i32 %a, %1 ret i32 %2 @@ -32,6 +45,11 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: srl a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: srl_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: srlw a0, a0, a1 +; RV64I-NEXT: ret %1 = and i32 %b, 4095 %2 = lshr i32 %a, %1 ret i32 %2 @@ -43,6 +61,12 @@ ; RV32I-NEXT: andi a1, a1, 7 ; RV32I-NEXT: srl a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: srl_non_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: andi a1, a1, 7 +; RV64I-NEXT: srlw a0, a0, a1 +; RV64I-NEXT: ret %1 = and i32 %b, 7 %2 = lshr i32 %a, %1 ret i32 %2 @@ -53,6 +77,11 @@ ; RV32I: # %bb.0: ; RV32I-NEXT: sra a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: sra_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: sraw a0, a0, a1 +; RV64I-NEXT: ret %1 = and i32 %b, 65535 %2 = ashr i32 %a, %1 ret i32 %2 @@ -64,7 +93,162 @@ ; RV32I-NEXT: andi a1, a1, 32 ; RV32I-NEXT: sra a0, a0, a1 ; RV32I-NEXT: ret +; +; RV64I-LABEL: sra_non_redundant_mask: +; RV64I: # %bb.0: +; RV64I-NEXT: sraw a0, a0, zero +; RV64I-NEXT: ret %1 = and i32 %b, 32 %2 = ashr i32 %a, %1 ret i32 %2 } + +define i32 @sll_redundant_mask_zeros(i32 %a, i32 %b) nounwind { +; RV32I-LABEL: sll_redundant_mask_zeros: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a1, a1, 1 +; RV32I-NEXT: sll a0, a0, a1 +; RV32I-NEXT: ret +; +; RV64I-LABEL: sll_redundant_mask_zeros: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 1 +; RV64I-NEXT: sllw a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i32 %b, 1 + %2 = and i32 %1, 30 + %3 = shl i32 %a, %2 + ret i32 %3 +} + +define i32 @srl_redundant_mask_zeros(i32 %a, i32 %b) nounwind { +; RV32I-LABEL: srl_redundant_mask_zeros: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a1, a1, 2 +; RV32I-NEXT: srl a0, a0, a1 +; RV32I-NEXT: ret +; +; RV64I-LABEL: srl_redundant_mask_zeros: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 2 +; RV64I-NEXT: srlw a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i32 %b, 2 + %2 = and i32 %1, 28 + %3 = lshr i32 %a, %2 + ret i32 %3 +} + +define i32 @sra_redundant_mask_zeros(i32 %a, i32 %b) nounwind { +; RV32I-LABEL: sra_redundant_mask_zeros: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a1, a1, 3 +; RV32I-NEXT: sra a0, a0, a1 +; RV32I-NEXT: ret +; +; RV64I-LABEL: sra_redundant_mask_zeros: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 3 +; RV64I-NEXT: sraw a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i32 %b, 3 + %2 = and i32 %1, 24 + %3 = ashr i32 %a, %2 + ret i32 %3 +} + +define i64 @sll_redundant_mask_zeros_i64(i64 %a, i64 %b) nounwind { +; RV32I-LABEL: sll_redundant_mask_zeros_i64: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a2, a2, 2 +; RV32I-NEXT: andi a3, a2, 60 +; RV32I-NEXT: addi a4, a3, -32 +; RV32I-NEXT: bltz a4, .LBB9_2 +; RV32I-NEXT: # %bb.1: +; RV32I-NEXT: sll a1, a0, a4 +; RV32I-NEXT: mv a0, zero +; RV32I-NEXT: ret +; RV32I-NEXT: .LBB9_2: +; RV32I-NEXT: sll a1, a1, a2 +; RV32I-NEXT: addi a4, zero, 31 +; RV32I-NEXT: sub a3, a4, a3 +; RV32I-NEXT: srli a4, a0, 1 +; RV32I-NEXT: srl a3, a4, a3 +; RV32I-NEXT: or a1, a1, a3 +; RV32I-NEXT: sll a0, a0, a2 +; RV32I-NEXT: ret +; +; RV64I-LABEL: sll_redundant_mask_zeros_i64: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 2 +; RV64I-NEXT: sll a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i64 %b, 2 + %2 = and i64 %1, 60 + %3 = shl i64 %a, %2 + ret i64 %3 +} + +define i64 @srl_redundant_mask_zeros_i64(i64 %a, i64 %b) nounwind { +; RV32I-LABEL: srl_redundant_mask_zeros_i64: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a2, a2, 3 +; RV32I-NEXT: andi a3, a2, 56 +; RV32I-NEXT: addi a4, a3, -32 +; RV32I-NEXT: bltz a4, .LBB10_2 +; RV32I-NEXT: # %bb.1: +; RV32I-NEXT: srl a0, a1, a4 +; RV32I-NEXT: mv a1, zero +; RV32I-NEXT: ret +; RV32I-NEXT: .LBB10_2: +; RV32I-NEXT: srl a0, a0, a2 +; RV32I-NEXT: addi a4, zero, 31 +; RV32I-NEXT: sub a3, a4, a3 +; RV32I-NEXT: slli a4, a1, 1 +; RV32I-NEXT: sll a3, a4, a3 +; RV32I-NEXT: or a0, a0, a3 +; RV32I-NEXT: srl a1, a1, a2 +; RV32I-NEXT: ret +; +; RV64I-LABEL: srl_redundant_mask_zeros_i64: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 3 +; RV64I-NEXT: srl a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i64 %b, 3 + %2 = and i64 %1, 56 + %3 = lshr i64 %a, %2 + ret i64 %3 +} + +define i64 @sra_redundant_mask_zeros_i64(i64 %a, i64 %b) nounwind { +; RV32I-LABEL: sra_redundant_mask_zeros_i64: +; RV32I: # %bb.0: +; RV32I-NEXT: slli a2, a2, 4 +; RV32I-NEXT: andi a3, a2, 48 +; RV32I-NEXT: addi a4, a3, -32 +; RV32I-NEXT: bltz a4, .LBB11_2 +; RV32I-NEXT: # %bb.1: +; RV32I-NEXT: sra a0, a1, a4 +; RV32I-NEXT: srai a1, a1, 31 +; RV32I-NEXT: ret +; RV32I-NEXT: .LBB11_2: +; RV32I-NEXT: srl a0, a0, a2 +; RV32I-NEXT: addi a4, zero, 31 +; RV32I-NEXT: sub a3, a4, a3 +; RV32I-NEXT: slli a4, a1, 1 +; RV32I-NEXT: sll a3, a4, a3 +; RV32I-NEXT: or a0, a0, a3 +; RV32I-NEXT: sra a1, a1, a2 +; RV32I-NEXT: ret +; +; RV64I-LABEL: sra_redundant_mask_zeros_i64: +; RV64I: # %bb.0: +; RV64I-NEXT: slli a1, a1, 4 +; RV64I-NEXT: sra a0, a0, a1 +; RV64I-NEXT: ret + %1 = shl i64 %b, 4 + %2 = and i64 %1, 48 + %3 = ashr i64 %a, %2 + ret i64 %3 +}