[GlobalISel] Add isConstFalseVal helper to Utils

Add a utility function which returns true if the given value is a constant
false value.

This is necessary to port one of the compare simplifications in
TargetLowering::SimplifySetCC.

Differential Revision: https://reviews.llvm.org/D91754
This commit is contained in:
Jessica Paquette 2022-09-28 15:43:26 -07:00
parent 8f8935139a
commit 704b2e162c
3 changed files with 36 additions and 0 deletions

View File

@ -488,6 +488,10 @@ bool matchUnaryPredicate(const MachineRegisterInfo &MRI, Register Reg,
/// the value \p Val contains a true value.
bool isConstTrueVal(const TargetLowering &TLI, int64_t Val, bool IsVector,
bool IsFP);
/// \returns true if given the TargetLowering's boolean contents information,
/// the value \p Val contains a false value.
bool isConstFalseVal(const TargetLowering &TLI, int64_t Val, bool IsVector,
bool IsFP);
/// Returns an integer representing true, as defined by the
/// TargetBooleanContents.

View File

@ -1278,6 +1278,18 @@ bool llvm::isConstTrueVal(const TargetLowering &TLI, int64_t Val, bool IsVector,
llvm_unreachable("Invalid boolean contents");
}
bool llvm::isConstFalseVal(const TargetLowering &TLI, int64_t Val,
bool IsVector, bool IsFP) {
switch (TLI.getBooleanContents(IsVector, IsFP)) {
case TargetLowering::UndefinedBooleanContent:
return ~Val & 0x1;
case TargetLowering::ZeroOrOneBooleanContent:
case TargetLowering::ZeroOrNegativeOneBooleanContent:
return Val == 0;
}
llvm_unreachable("Invalid boolean contents");
}
int64_t llvm::getICmpTrueVal(const TargetLowering &TLI, bool IsVector,
bool IsFP) {
switch (TLI.getBooleanContents(IsVector, IsFP)) {

View File

@ -6,6 +6,7 @@
//
//===----------------------------------------------------------------------===//
#include "GISelMITest.h"
#include "llvm/CodeGen/GlobalISel/Utils.h"
#include "gtest/gtest.h"
@ -245,4 +246,23 @@ TEST(GISelUtilsTest, getLCMType) {
EXPECT_EQ(V4P1, getLCMType(P1, V2S64));
}
TEST_F(AArch64GISelMITest, ConstFalseTest) {
setUp();
if (!TM)
return;
const auto &TLI = *B.getMF().getSubtarget().getTargetLowering();
bool BooleanChoices[2] = {true, false};
// AArch64 uses ZeroOrOneBooleanContent for scalars, and
// ZeroOrNegativeOneBooleanContent for vectors.
for (auto IsVec : BooleanChoices) {
for (auto IsFP : BooleanChoices) {
EXPECT_TRUE(isConstFalseVal(TLI, 0, IsVec, IsFP));
EXPECT_FALSE(isConstFalseVal(TLI, 1, IsVec, IsFP));
// This would be true with UndefinedBooleanContent.
EXPECT_FALSE(isConstFalseVal(TLI, 2, IsVec, IsFP));
}
}
}
}