summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp')
-rw-r--r--llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp
index 2ba95ab0826..608c0ddf084 100644
--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp
@@ -9,6 +9,10 @@
#include "GISelMITest.h"
+using namespace LegalizeActions;
+using namespace LegalizeMutations;
+using namespace LegalityPredicates;
+
namespace {
class DummyGISelObserver : public GISelChangeObserver {
@@ -900,4 +904,34 @@ TEST_F(GISelMITest, WidenScalarBuildVector) {
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
}
+TEST_F(GISelMITest, LowerMergeValues) {
+ if (!TM)
+ return;
+
+ const LLT S24 = LLT::scalar(24);
+ const LLT S9 = LLT::scalar(9);
+ const LLT S3 = LLT::scalar(3);
+
+ DefineLegalizerInfo(A, {
+ getActionDefinitionsBuilder(G_UNMERGE_VALUES)
+ .widenScalarIf(typeIs(1, LLT::scalar(3)), changeTo(1, LLT::scalar(9)));
+ });
+
+ AInfo Info(MF->getSubtarget());
+ DummyGISelObserver Observer;
+ LegalizerHelper Helper(*MF, Info, Observer, B);
+ B.setInsertPt(*EntryMBB, EntryMBB->end());
+
+ // 24 = 3 3 3 3 3 3 3 3
+ // => 9
+ //
+ // This can do 2 merges for the first parts, but has 2 leftover operands.
+ SmallVector<Register, 7> MergeOps;
+ for (int I = 0; I != 8; ++I)
+ MergeOps.push_back(B.buildConstant(S3, I).getReg(0));
+
+ auto Merge = B.buildMerge(S24, MergeOps);
+ EXPECT_EQ(LegalizerHelper::LegalizeResult::UnableToLegalize,
+ Helper.lower(*Merge, 1, S9));
+}
} // namespace
OpenPOWER on IntegriCloud