mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[CodeGen] Fix remaining zext() assertions in SelectionDAG
Fix remaining cases not committed in https://reviews.llvm.org/D49574 Differential Revision: https://reviews.llvm.org/D50659 llvm-svn: 341380
This commit is contained in:
parent
056ad948e2
commit
e97aca491d
@ -2677,7 +2677,7 @@ KnownBits SelectionDAG::computeKnownBits(SDValue Op, const APInt &DemandedElts,
|
||||
}
|
||||
case ISD::ZERO_EXTEND_VECTOR_INREG: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
|
||||
APInt InDemandedElts = DemandedElts.zextOrSelf(InVT.getVectorNumElements());
|
||||
Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
|
||||
Known = Known.zext(BitWidth);
|
||||
Known.Zero.setBitsFrom(InVT.getScalarSizeInBits());
|
||||
@ -3279,7 +3279,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
|
||||
case ISD::SIGN_EXTEND_VECTOR_INREG: {
|
||||
SDValue Src = Op.getOperand(0);
|
||||
EVT SrcVT = Src.getValueType();
|
||||
APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
|
||||
APInt DemandedSrcElts = DemandedElts.zextOrSelf(SrcVT.getVectorNumElements());
|
||||
Tmp = VTBits - SrcVT.getScalarSizeInBits();
|
||||
return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
|
||||
}
|
||||
|
@ -1481,22 +1481,20 @@ bool TargetLowering::SimplifyDemandedVectorElts(
|
||||
break;
|
||||
}
|
||||
case ISD::EXTRACT_SUBVECTOR: {
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(1)))
|
||||
break;
|
||||
SDValue Src = Op.getOperand(0);
|
||||
ConstantSDNode *SubIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
|
||||
unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
|
||||
const APInt& Idx = cast<ConstantSDNode>(Op.getOperand(1))->getAPIntValue();
|
||||
if (Idx.uge(NumSrcElts - NumElts))
|
||||
break;
|
||||
// Offset the demanded elts by the subvector index.
|
||||
uint64_t SubIdx = Idx.getZExtValue();
|
||||
APInt SrcElts = DemandedElts.zext(NumSrcElts).shl(SubIdx);
|
||||
APInt SrcUndef, SrcZero;
|
||||
if (SimplifyDemandedVectorElts(Src, SrcElts, SrcUndef, SrcZero, TLO,
|
||||
Depth + 1))
|
||||
return true;
|
||||
KnownUndef = SrcUndef.extractBits(NumElts, SubIdx);
|
||||
KnownZero = SrcZero.extractBits(NumElts, SubIdx);
|
||||
if (SubIdx && SubIdx->getAPIntValue().ule(NumSrcElts - NumElts)) {
|
||||
// Offset the demanded elts by the subvector index.
|
||||
uint64_t Idx = SubIdx->getZExtValue();
|
||||
APInt SrcElts = DemandedElts.zextOrSelf(NumSrcElts).shl(Idx);
|
||||
APInt SrcUndef, SrcZero;
|
||||
if (SimplifyDemandedVectorElts(Src, SrcElts, SrcUndef, SrcZero, TLO,
|
||||
Depth + 1))
|
||||
return true;
|
||||
KnownUndef = SrcUndef.extractBits(NumElts, Idx);
|
||||
KnownZero = SrcZero.extractBits(NumElts, Idx);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ISD::INSERT_VECTOR_ELT: {
|
||||
|
168
unittests/CodeGen/AArch64SelectionDAGTest.cpp
Normal file
168
unittests/CodeGen/AArch64SelectionDAGTest.cpp
Normal file
@ -0,0 +1,168 @@
|
||||
//===- llvm/unittest/CodeGen/AArch64SelectionDAGTest.cpp -------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
|
||||
#include "llvm/AsmParser/Parser.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/TargetLowering.h"
|
||||
#include "llvm/Support/SourceMgr.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
void initLLVM() {
|
||||
InitializeAllTargets();
|
||||
InitializeAllTargetMCs();
|
||||
}
|
||||
|
||||
class AArch64SelectionDAGTest : public testing::Test {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
StringRef Assembly = "define void @f() { ret void }";
|
||||
|
||||
Triple TargetTriple("aarch64--");
|
||||
std::string Error;
|
||||
const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
|
||||
// FIXME: These tests do not depend on AArch64 specifically, but we have to
|
||||
// initialize a target. A skeleton Target for unittests would allow us to
|
||||
// always run these tests.
|
||||
if (!T)
|
||||
return;
|
||||
|
||||
TargetOptions Options;
|
||||
TM = std::unique_ptr<TargetMachine>(T->createTargetMachine(
|
||||
"AArch64", "", "", Options, None, None, CodeGenOpt::Aggressive));
|
||||
if (!TM)
|
||||
return;
|
||||
|
||||
SMDiagnostic SMError;
|
||||
M = parseAssemblyString(Assembly, SMError, Context);
|
||||
if (!M)
|
||||
report_fatal_error(SMError.getMessage());
|
||||
M->setDataLayout(TM->createDataLayout());
|
||||
|
||||
F = M->getFunction("f");
|
||||
if (!F)
|
||||
report_fatal_error("F?");
|
||||
|
||||
MachineModuleInfo MMI(TM.get());
|
||||
|
||||
MF = make_unique<MachineFunction>(*F, *TM, *TM->getSubtargetImpl(*F), 0,
|
||||
MMI);
|
||||
|
||||
DAG = make_unique<SelectionDAG>(*TM, CodeGenOpt::None);
|
||||
if (!DAG)
|
||||
report_fatal_error("DAG?");
|
||||
OptimizationRemarkEmitter ORE(F);
|
||||
DAG->init(*MF, ORE, nullptr, nullptr, nullptr);
|
||||
}
|
||||
|
||||
LLVMContext Context;
|
||||
std::unique_ptr<TargetMachine> TM = nullptr;
|
||||
std::unique_ptr<Module> M;
|
||||
Function *F;
|
||||
std::unique_ptr<MachineFunction> MF;
|
||||
std::unique_ptr<SelectionDAG> DAG;
|
||||
};
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, computeKnownBits_ZERO_EXTEND_VECTOR_INREG) {
|
||||
if (!TM)
|
||||
return;
|
||||
SDLoc Loc;
|
||||
auto Int8VT = EVT::getIntegerVT(Context, 8);
|
||||
auto Int16VT = EVT::getIntegerVT(Context, 16);
|
||||
auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4);
|
||||
auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2);
|
||||
auto InVec = DAG->getConstant(0, Loc, InVecVT);
|
||||
auto Op = DAG->getZeroExtendVectorInReg(InVec, Loc, OutVecVT);
|
||||
auto DemandedElts = APInt(4, 15);
|
||||
KnownBits Known;
|
||||
DAG->computeKnownBits(Op, Known, DemandedElts);
|
||||
EXPECT_TRUE(Known.isZero());
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, computeKnownBits_EXTRACT_SUBVECTOR) {
|
||||
if (!TM)
|
||||
return;
|
||||
SDLoc Loc;
|
||||
auto IntVT = EVT::getIntegerVT(Context, 8);
|
||||
auto VecVT = EVT::getVectorVT(Context, IntVT, 3);
|
||||
auto IdxVT = EVT::getIntegerVT(Context, 64);
|
||||
auto Vec = DAG->getConstant(0, Loc, VecVT);
|
||||
auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
|
||||
auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
|
||||
auto DemandedElts = APInt(3, 7);
|
||||
KnownBits Known;
|
||||
DAG->computeKnownBits(Op, Known, DemandedElts);
|
||||
EXPECT_TRUE(Known.isZero());
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_SIGN_EXTEND_VECTOR_INREG) {
|
||||
if (!TM)
|
||||
return;
|
||||
SDLoc Loc;
|
||||
auto Int8VT = EVT::getIntegerVT(Context, 8);
|
||||
auto Int16VT = EVT::getIntegerVT(Context, 16);
|
||||
auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4);
|
||||
auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2);
|
||||
auto InVec = DAG->getConstant(1, Loc, InVecVT);
|
||||
auto Op = DAG->getSignExtendVectorInReg(InVec, Loc, OutVecVT);
|
||||
auto DemandedElts = APInt(4, 15);
|
||||
EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 15u);
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_EXTRACT_SUBVECTOR) {
|
||||
if (!TM)
|
||||
return;
|
||||
SDLoc Loc;
|
||||
auto IntVT = EVT::getIntegerVT(Context, 8);
|
||||
auto VecVT = EVT::getVectorVT(Context, IntVT, 3);
|
||||
auto IdxVT = EVT::getIntegerVT(Context, 64);
|
||||
auto Vec = DAG->getConstant(1, Loc, VecVT);
|
||||
auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
|
||||
auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
|
||||
auto DemandedElts = APInt(3, 7);
|
||||
EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 7u);
|
||||
}
|
||||
|
||||
TEST_F(AArch64SelectionDAGTest, SimplifyDemandedVectorElts_EXTRACT_SUBVECTOR) {
|
||||
if (!TM)
|
||||
return;
|
||||
|
||||
TargetLowering TL(*TM);
|
||||
|
||||
SDLoc Loc;
|
||||
auto IntVT = EVT::getIntegerVT(Context, 8);
|
||||
auto VecVT = EVT::getVectorVT(Context, IntVT, 3);
|
||||
auto IdxVT = EVT::getIntegerVT(Context, 64);
|
||||
auto Vec = DAG->getConstant(1, Loc, VecVT);
|
||||
auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT);
|
||||
auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx);
|
||||
auto DemandedElts = APInt(3, 7);
|
||||
auto KnownUndef = APInt(3, 0);
|
||||
auto KnownZero = APInt(3, 0);
|
||||
TargetLowering::TargetLoweringOpt TLO(*DAG, false, false);
|
||||
EXPECT_EQ(TL.SimplifyDemandedVectorElts(Op, DemandedElts, KnownUndef,
|
||||
KnownZero, TLO),
|
||||
false);
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
initLLVM();
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
set(LLVM_LINK_COMPONENTS
|
||||
${LLVM_TARGETS_TO_BUILD}
|
||||
AsmParser
|
||||
AsmPrinter
|
||||
CodeGen
|
||||
Core
|
||||
@ -9,6 +11,7 @@ set(LLVM_LINK_COMPONENTS
|
||||
)
|
||||
|
||||
add_llvm_unittest(CodeGenTests
|
||||
AArch64SelectionDAGTest.cpp
|
||||
DIEHashTest.cpp
|
||||
LowLevelTypeTest.cpp
|
||||
MachineInstrBundleIteratorTest.cpp
|
||||
|
Loading…
x
Reference in New Issue
Block a user