Skip to content

Commit

Permalink
GlobalISel: Add maskedValueIsZero and signBitIsZero to known bits
Browse files Browse the repository at this point in the history
I dropped the DemandedElts since it seems to be missing from some of
the new interfaces, but not others.

llvm-svn: 370389
  • Loading branch information
arsenm committed Aug 29, 2019
1 parent caff0a8 commit b2b9a23
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
11 changes: 11 additions & 0 deletions llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,17 @@ class GISelKnownBits : public GISelChangeObserver {
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,
Expand Down
6 changes: 6 additions & 0 deletions llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ KnownBits GISelKnownBits::getKnownBits(Register 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;
}
Expand Down
16 changes: 16 additions & 0 deletions llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
}

0 comments on commit b2b9a23

Please sign in to comment.