From 1ff5f1a0614f50a5eef467d030cec2e10a9c4972 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 1 Apr 2014 18:13:22 +0000 Subject: [PATCH] Add helpers for checking if a value is a target boolean constant. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205335 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetLowering.h | 8 ++++ lib/CodeGen/SelectionDAG/TargetLowering.cpp | 48 +++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index 06cc75f4d33..2f6445fb7a9 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -1934,6 +1934,14 @@ public: void CommitTargetLoweringOpt(const TargetLoweringOpt &TLO); }; + /// Return if the N is a constant or constant vector equal to the true value + /// from getBooleanContents(). + bool isConstTrueVal(const SDNode *N) const; + + /// Return if the N is a constant or constant vector equal to the false value + /// from getBooleanContents(). + bool isConstFalseVal(const SDNode *N) const; + /// Try to simplify a setcc built with the specified operands and cc. If it is /// unable to simplify it, return a null SDValue. SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 115129ec3a4..5de0b030c7c 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1117,6 +1117,54 @@ static bool ValueHasExactlyOneBitSet(SDValue Val, const SelectionDAG &DAG) { (KnownOne.countPopulation() == 1); } +bool TargetLowering::isConstTrueVal(const SDNode *N) const { + if (!N) + return false; + + bool IsVec = false; + const ConstantSDNode *CN = dyn_cast(N); + if (!CN) { + const BuildVectorSDNode *BV = dyn_cast(N); + if (!BV) + return false; + + IsVec = true; + CN = BV->getConstantSplatValue(); + } + + switch (getBooleanContents(IsVec)) { + case UndefinedBooleanContent: + return CN->getAPIntValue()[0]; + case ZeroOrOneBooleanContent: + return CN->isOne(); + case ZeroOrNegativeOneBooleanContent: + return CN->isAllOnesValue(); + } + + llvm_unreachable("Invalid boolean contents"); +} + +bool TargetLowering::isConstFalseVal(const SDNode *N) const { + if (!N) + return false; + + bool IsVec = false; + const ConstantSDNode *CN = dyn_cast(N); + if (!CN) { + const BuildVectorSDNode *BV = dyn_cast(N); + if (!BV) + return false; + + IsVec = true; + CN = BV->getConstantSplatValue(); + } + + if (getBooleanContents(IsVec) == UndefinedBooleanContent) + return !CN->getAPIntValue()[0]; + + return CN->isNullValue(); +} + /// SimplifySetCC - Try to simplify a setcc built with the specified operands /// and cc. If it is unable to simplify it, return a null SDValue. SDValue