[llvm] r370389 - GlobalISel: Add maskedValueIsZero and signBitIsZero to known bits
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 29 10:24:37 PDT 2019
Author: arsenm
Date: Thu Aug 29 10:24:36 2019
New Revision: 370389
URL: http://llvm.org/viewvc/llvm-project?rev=370389&view=rev
Log:
GlobalISel: Add maskedValueIsZero and signBitIsZero to known bits
I dropped the DemandedElts since it seems to be missing from some of
the new interfaces, but not others.
Modified:
llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h?rev=370389&r1=370388&r2=370389&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h Thu Aug 29 10:24:36 2019
@@ -47,6 +47,17 @@ public:
APInt getKnownZeroes(Register R);
APInt getKnownOnes(Register R);
+ /// \return true if 'V & Mask' is known to be zero in DemandedElts. We use
+ /// this predicate to simplify operations downstream.
+ /// Mask is known to be zero for bits that V cannot have.
+ bool maskedValueIsZero(Register Val, const APInt &Mask) {
+ return Mask.isSubsetOf(getKnownBits(Val).Zero);
+ }
+
+ /// \return true if the sign bit of Op is known to be zero. We use this
+ /// predicate to simplify operations downstream.
+ bool signBitIsZero(Register Op);
+
// FIXME: Is this the right place for G_FRAME_INDEX? Should it be in
// TargetLowering?
void computeKnownBitsForFrameIndex(Register R, KnownBits &Known,
Modified: llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp?rev=370389&r1=370388&r2=370389&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp Thu Aug 29 10:24:36 2019
@@ -75,6 +75,12 @@ KnownBits GISelKnownBits::getKnownBits(R
return Known;
}
+bool GISelKnownBits::signBitIsZero(Register R) {
+ LLT Ty = MRI.getType(R);
+ unsigned BitWidth = Ty.getScalarSizeInBits();
+ return maskedValueIsZero(R, APInt::getSignMask(BitWidth));
+}
+
APInt GISelKnownBits::getKnownZeroes(Register R) {
return getKnownBits(R).Zero;
}
Modified: llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp?rev=370389&r1=370388&r2=370389&view=diff
==============================================================================
--- llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp (original)
+++ llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp Thu Aug 29 10:24:36 2019
@@ -86,3 +86,19 @@ TEST_F(GISelMITest, TestKnownBits) {
APInt Zeroes = Info.getKnownZeroes(SrcReg);
EXPECT_EQ(Known.Zero, Zeroes);
}
+
+TEST_F(GISelMITest, TestSignBitIsZero) {
+ if (!TM)
+ return;
+
+ const LLT S32 = LLT::scalar(32);
+ auto SignBit = B.buildConstant(S32, 0x8000000);
+ auto Zero = B.buildConstant(S32, 0);
+
+ GISelKnownBits KnownBits(*MF);
+
+ EXPECT_TRUE(KnownBits.signBitIsZero(Zero.getReg(0)));
+ EXPECT_FALSE(KnownBits.signBitIsZero(Zero.getReg(0)));
+ EXPECT_FALSE(KnownBits.signBitIsZero(SignBit.getReg(0)));
+ EXPECT_TRUE(KnownBits.signBitIsZero(SignBit.getReg(0)));
+}
More information about the llvm-commits
mailing list