[llvm] Improved ISD::SRL handling in isKnownToBeAPowerOfTwo (PR #182562)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 20 10:47:34 PST 2026
================
@@ -971,6 +971,80 @@ TEST_F(AArch64SelectionDAGTest, KnownToBeAPowerOfTwo_Select) {
DAG->isKnownToBeAPowerOfTwo(VSelect444Big, DemandAll, /*OrZero=*/true));
}
+TEST_F(AArch64SelectionDAGTest, KnownToBeAPowerOfTwo_ISD_SRL) {
+ SDLoc Loc;
+ auto Cst0 = DAG->getConstant(0, Loc, MVT::i32);
+ auto Cst1 = DAG->getConstant(1, Loc, MVT::i32);
+ auto Cst4 = DAG->getConstant(4, Loc, MVT::i32);
+ auto Cst7 = DAG->getConstant(7, Loc, MVT::i32);
+ auto CstBig = DAG->getConstant(2 << 17, Loc, MVT::i32);
+
+ auto SRL40 = DAG->getNode(ISD::SRL, Loc, MVT::i32, Cst4, Cst0);
+ auto SRL41 = DAG->getNode(ISD::SRL, Loc, MVT::i32, Cst4, Cst1);
+ auto SRL44 = DAG->getNode(ISD::SRL, Loc, MVT::i32, Cst4, Cst4);
+ auto SRL71 = DAG->getNode(ISD::SRL, Loc, MVT::i32, Cst7, Cst1);
+ auto SRLBig4 = DAG->getNode(ISD::SRL, Loc, MVT::i32, CstBig, Cst4);
+
+ EXPECT_TRUE(DAG->isKnownToBeAPowerOfTwo(SRL40));
+ EXPECT_TRUE(DAG->isKnownToBeAPowerOfTwo(SRL41));
+ EXPECT_FALSE(DAG->isKnownToBeAPowerOfTwo(SRL44));
+ EXPECT_TRUE(DAG->isKnownToBeAPowerOfTwo(SRL44, /*OrZero=*/true));
+ EXPECT_FALSE(DAG->isKnownToBeAPowerOfTwo(SRL71));
+ EXPECT_TRUE(DAG->isKnownToBeAPowerOfTwo(SRLBig4));
+
+ auto VecVT = MVT::v2i16;
+ auto Vec00 = DAG->getBuildVector(VecVT, Loc, {Cst0, Cst0});
+ auto Vec04 = DAG->getBuildVector(VecVT, Loc, {Cst0, Cst4});
+ auto Vec11 = DAG->getBuildVector(VecVT, Loc, {Cst1, Cst1});
+ auto Vec44 = DAG->getBuildVector(VecVT, Loc, {Cst4, Cst4});
+ auto Vec74 = DAG->getBuildVector(VecVT, Loc, {Cst7, Cst4});
+ auto Vec4Big = DAG->getBuildVector(VecVT, Loc, {Cst4, CstBig});
+
+ auto SRL4404 = DAG->getNode(ISD::SRL, Loc, VecVT, Vec44, Vec04);
+ auto SRL7411 = DAG->getNode(ISD::SRL, Loc, VecVT, Vec74, Vec11);
+ auto SRL4Big04 = DAG->getNode(ISD::SRL, Loc, VecVT, Vec4Big, Vec04);
----------------
topperc wrote:
The constant used for Vec4Big is too big for an i16 element. So it gets truncated to 0.
https://github.com/llvm/llvm-project/pull/182562
More information about the llvm-commits
mailing list