//===------------- llvm/unittest/CodeGen/InstrRefLDVTest.cpp --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/CodeGen/MIRParser/MIRParser.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"

#include "../lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.h"

#include "gtest/gtest.h"

using namespace llvm;
using namespace LiveDebugValues;

// Include helper functions to ease the manipulation of MachineFunctions
#include "MFCommon.inc"

class InstrRefLDVTest : public testing::Test {
public:
  friend class InstrRefBasedLDV;
  using MLocTransferMap = InstrRefBasedLDV::MLocTransferMap;

  LLVMContext Ctx;
  std::unique_ptr<Module> Mod;
  std::unique_ptr<TargetMachine> Machine;
  std::unique_ptr<MachineFunction> MF;
  std::unique_ptr<MachineDominatorTree> DomTree;
  std::unique_ptr<MachineModuleInfo> MMI;
  DICompileUnit *OurCU;
  DIFile *OurFile;
  DISubprogram *OurFunc;
  DILexicalBlock *OurBlock, *AnotherBlock;
  DISubprogram *ToInlineFunc;
  DILexicalBlock *ToInlineBlock;
  DILocalVariable *FuncVariable;
  DIBasicType *LongInt;
  DIExpression *EmptyExpr;
  LiveDebugValues::OverlapMap Overlaps;

  DebugLoc OutermostLoc, InBlockLoc, NotNestedBlockLoc, InlinedLoc;

  MachineBasicBlock *MBB0, *MBB1, *MBB2, *MBB3, *MBB4;

  std::unique_ptr<InstrRefBasedLDV> LDV;
  std::unique_ptr<MLocTracker> MTracker;
  std::unique_ptr<VLocTracker> VTracker;

  SmallString<256> MIRStr;

  InstrRefLDVTest() : Ctx(), Mod(std::make_unique<Module>("beehives", Ctx)) {}

  void SetUp() {
    // Boilerplate that creates a MachineFunction and associated blocks.

    Mod->setDataLayout("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-"
                       "n8:16:32:64-S128");
    Triple TargetTriple("x86_64--");
    std::string Error;
    const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
    if (!T)
      GTEST_SKIP();

    TargetOptions Options;
    Machine = std::unique_ptr<TargetMachine>(T->createTargetMachine(
        Triple::normalize("x86_64--"), "", "", Options, std::nullopt,
        std::nullopt, CodeGenOptLevel::Aggressive));

    auto Type = FunctionType::get(Type::getVoidTy(Ctx), false);
    auto F =
        Function::Create(Type, GlobalValue::ExternalLinkage, "Test", &*Mod);

    unsigned FunctionNum = 42;
    MMI = std::make_unique<MachineModuleInfo>((LLVMTargetMachine *)&*Machine);
    const TargetSubtargetInfo &STI = *Machine->getSubtargetImpl(*F);

    MF = std::make_unique<MachineFunction>(*F, (LLVMTargetMachine &)*Machine,
                                           STI, FunctionNum, *MMI);

    // Create metadata: CU, subprogram, some blocks and an inline function
    // scope.
    DIBuilder DIB(*Mod);
    OurFile = DIB.createFile("xyzzy.c", "/cave");
    OurCU =
        DIB.createCompileUnit(dwarf::DW_LANG_C99, OurFile, "nou", false, "", 0);
    auto OurSubT =
        DIB.createSubroutineType(DIB.getOrCreateTypeArray(std::nullopt));
    OurFunc =
        DIB.createFunction(OurCU, "bees", "", OurFile, 1, OurSubT, 1,
                           DINode::FlagZero, DISubprogram::SPFlagDefinition);
    F->setSubprogram(OurFunc);
    OurBlock = DIB.createLexicalBlock(OurFunc, OurFile, 2, 3);
    AnotherBlock = DIB.createLexicalBlock(OurFunc, OurFile, 2, 6);
    ToInlineFunc =
        DIB.createFunction(OurFile, "shoes", "", OurFile, 10, OurSubT, 10,
                           DINode::FlagZero, DISubprogram::SPFlagDefinition);

    // Make some nested scopes.
    OutermostLoc = DILocation::get(Ctx, 3, 1, OurFunc);
    InBlockLoc = DILocation::get(Ctx, 4, 1, OurBlock);
    InlinedLoc = DILocation::get(Ctx, 10, 1, ToInlineFunc, InBlockLoc.get());

    // Make a scope that isn't nested within the others.
    NotNestedBlockLoc = DILocation::get(Ctx, 4, 1, AnotherBlock);

    LongInt = DIB.createBasicType("long", 64, llvm::dwarf::DW_ATE_unsigned);
    FuncVariable = DIB.createAutoVariable(OurFunc, "lala", OurFile, 1, LongInt);
    EmptyExpr = DIExpression::get(Ctx, {});

    DIB.finalize();
  }

  Register getRegByName(const char *WantedName) {
    auto *TRI = MF->getRegInfo().getTargetRegisterInfo();
    // Slow, but works.
    for (unsigned int I = 1; I < TRI->getNumRegs(); ++I) {
      const char *Name = TRI->getName(I);
      if (strcmp(WantedName, Name) == 0)
        return I;
    }

    // If this ever fails, something is very wrong with this unit test.
    llvm_unreachable("Can't find register by name");
  }

  InstrRefBasedLDV *setupLDVObj(MachineFunction *MF) {
    // Create a new LDV object, and plug some relevant object ptrs into it.
    LDV = std::make_unique<InstrRefBasedLDV>();
    const TargetSubtargetInfo &STI = MF->getSubtarget();
    LDV->TII = STI.getInstrInfo();
    LDV->TRI = STI.getRegisterInfo();
    LDV->TFI = STI.getFrameLowering();
    LDV->MFI = &MF->getFrameInfo();
    LDV->MRI = &MF->getRegInfo();

    DomTree = std::make_unique<MachineDominatorTree>(*MF);
    LDV->DomTree = &*DomTree;

    // Future work: unit tests for mtracker / vtracker / ttracker.

    // Setup things like the artifical block map, and BlockNo <=> RPO Order
    // mappings.
    LDV->initialSetup(*MF);
    LDV->LS.initialize(*MF);
    addMTracker(MF);
    return &*LDV;
  }

  void addMTracker(MachineFunction *MF) {
    ASSERT_TRUE(LDV);
    // Add a machine-location-tracking object to LDV. Don't initialize any
    // register locations within it though.
    const TargetSubtargetInfo &STI = MF->getSubtarget();
    MTracker = std::make_unique<MLocTracker>(
          *MF, *LDV->TII, *LDV->TRI, *STI.getTargetLowering());
    LDV->MTracker = &*MTracker;
  }

  void addVTracker() {
    ASSERT_TRUE(LDV);
    VTracker = std::make_unique<VLocTracker>(Overlaps, EmptyExpr);
    LDV->VTracker = &*VTracker;
  }

  DbgOpID addValueDbgOp(ValueIDNum V) {
    return LDV->DbgOpStore.insert(DbgOp(V));
  }
  DbgOpID addConstDbgOp(MachineOperand MO) {
    return LDV->DbgOpStore.insert(DbgOp(MO));
  }

  // Some routines for bouncing into LDV,
  void buildMLocValueMap(FuncValueTable &MInLocs, FuncValueTable &MOutLocs,
                         SmallVectorImpl<MLocTransferMap> &MLocTransfer) {
    LDV->buildMLocValueMap(*MF, MInLocs, MOutLocs, MLocTransfer);
  }

  void placeMLocPHIs(MachineFunction &MF,
                     SmallPtrSetImpl<MachineBasicBlock *> &AllBlocks,
                     FuncValueTable &MInLocs,
                     SmallVectorImpl<MLocTransferMap> &MLocTransfer) {
    LDV->placeMLocPHIs(MF, AllBlocks, MInLocs, MLocTransfer);
  }

  bool
  pickVPHILoc(SmallVectorImpl<DbgOpID> &OutValues, const MachineBasicBlock &MBB,
              const InstrRefBasedLDV::LiveIdxT &LiveOuts,
              FuncValueTable &MOutLocs,
              const SmallVectorImpl<const MachineBasicBlock *> &BlockOrders) {
    return LDV->pickVPHILoc(OutValues, MBB, LiveOuts, MOutLocs, BlockOrders);
  }

  bool vlocJoin(MachineBasicBlock &MBB, InstrRefBasedLDV::LiveIdxT &VLOCOutLocs,
                SmallPtrSet<const MachineBasicBlock *, 8> &BlocksToExplore,
                DbgValue &InLoc) {
    return LDV->vlocJoin(MBB, VLOCOutLocs, BlocksToExplore, InLoc);
  }

  void buildVLocValueMap(const DILocation *DILoc,
                    const SmallSet<DebugVariable, 4> &VarsWeCareAbout,
                    SmallPtrSetImpl<MachineBasicBlock *> &AssignBlocks,
                    InstrRefBasedLDV::LiveInsT &Output, FuncValueTable &MOutLocs,
                    FuncValueTable &MInLocs,
                    SmallVectorImpl<VLocTracker> &AllTheVLocs) {
    LDV->buildVLocValueMap(DILoc, VarsWeCareAbout, AssignBlocks, Output,
                           MOutLocs, MInLocs, AllTheVLocs);
  }

  void initValueArray(FuncValueTable &Nums, unsigned Blks, unsigned Locs) {
    for (unsigned int I = 0; I < Blks; ++I)
      for (unsigned int J = 0; J < Locs; ++J)
        Nums[I][J] = ValueIDNum::EmptyValue;
  }

  void setupSingleBlock() {
    // Add an entry block with nothing but 'ret void' in it.
    Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "entry", &F);
    IRBuilder<> IRB(BB0);
    IRB.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  void setupDiamondBlocks() {
    //        entry
    //        /  \
    //      br1  br2
    //        \  /
    //         ret
    llvm::Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "a", &F);
    auto *BB1 = BasicBlock::Create(Ctx, "b", &F);
    auto *BB2 = BasicBlock::Create(Ctx, "c", &F);
    auto *BB3 = BasicBlock::Create(Ctx, "d", &F);
    IRBuilder<> IRB0(BB0), IRB1(BB1), IRB2(BB2), IRB3(BB3);
    IRB0.CreateBr(BB1);
    IRB1.CreateBr(BB2);
    IRB2.CreateBr(BB3);
    IRB3.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MBB1 = MF->CreateMachineBasicBlock(BB1);
    MF->insert(MF->end(), MBB1);
    MBB2 = MF->CreateMachineBasicBlock(BB2);
    MF->insert(MF->end(), MBB2);
    MBB3 = MF->CreateMachineBasicBlock(BB3);
    MF->insert(MF->end(), MBB3);
    MBB0->addSuccessor(MBB1);
    MBB0->addSuccessor(MBB2);
    MBB1->addSuccessor(MBB3);
    MBB2->addSuccessor(MBB3);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  void setupSimpleLoop() {
    //    entry
    //     |
    //     |/-----\
    //    loopblk |
    //     |\-----/
    //     |
    //     ret
    llvm::Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "entry", &F);
    auto *BB1 = BasicBlock::Create(Ctx, "loop", &F);
    auto *BB2 = BasicBlock::Create(Ctx, "ret", &F);
    IRBuilder<> IRB0(BB0), IRB1(BB1), IRB2(BB2);
    IRB0.CreateBr(BB1);
    IRB1.CreateBr(BB2);
    IRB2.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MBB1 = MF->CreateMachineBasicBlock(BB1);
    MF->insert(MF->end(), MBB1);
    MBB2 = MF->CreateMachineBasicBlock(BB2);
    MF->insert(MF->end(), MBB2);
    MBB0->addSuccessor(MBB1);
    MBB1->addSuccessor(MBB2);
    MBB1->addSuccessor(MBB1);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  void setupNestedLoops() {
    //    entry
    //     |
    //    loop1
    //     ^\
    //     | \    /-\
    //     |  loop2  |
    //     |  /   \-/
    //     ^ /
    //     join
    //     |
    //     ret
    llvm::Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "entry", &F);
    auto *BB1 = BasicBlock::Create(Ctx, "loop1", &F);
    auto *BB2 = BasicBlock::Create(Ctx, "loop2", &F);
    auto *BB3 = BasicBlock::Create(Ctx, "join", &F);
    auto *BB4 = BasicBlock::Create(Ctx, "ret", &F);
    IRBuilder<> IRB0(BB0), IRB1(BB1), IRB2(BB2), IRB3(BB3), IRB4(BB4);
    IRB0.CreateBr(BB1);
    IRB1.CreateBr(BB2);
    IRB2.CreateBr(BB3);
    IRB3.CreateBr(BB4);
    IRB4.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MBB1 = MF->CreateMachineBasicBlock(BB1);
    MF->insert(MF->end(), MBB1);
    MBB2 = MF->CreateMachineBasicBlock(BB2);
    MF->insert(MF->end(), MBB2);
    MBB3 = MF->CreateMachineBasicBlock(BB3);
    MF->insert(MF->end(), MBB3);
    MBB4 = MF->CreateMachineBasicBlock(BB4);
    MF->insert(MF->end(), MBB4);
    MBB0->addSuccessor(MBB1);
    MBB1->addSuccessor(MBB2);
    MBB2->addSuccessor(MBB2);
    MBB2->addSuccessor(MBB3);
    MBB3->addSuccessor(MBB1);
    MBB3->addSuccessor(MBB4);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  void setupNoDominatingLoop() {
    //           entry
    //            / \
    //           /   \
    //          /     \
    //        head1   head2
    //        ^  \   /   ^
    //        ^   \ /    ^
    //        \-joinblk -/
    //             |
    //            ret
    llvm::Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "entry", &F);
    auto *BB1 = BasicBlock::Create(Ctx, "head1", &F);
    auto *BB2 = BasicBlock::Create(Ctx, "head2", &F);
    auto *BB3 = BasicBlock::Create(Ctx, "joinblk", &F);
    auto *BB4 = BasicBlock::Create(Ctx, "ret", &F);
    IRBuilder<> IRB0(BB0), IRB1(BB1), IRB2(BB2), IRB3(BB3), IRB4(BB4);
    IRB0.CreateBr(BB1);
    IRB1.CreateBr(BB2);
    IRB2.CreateBr(BB3);
    IRB3.CreateBr(BB4);
    IRB4.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MBB1 = MF->CreateMachineBasicBlock(BB1);
    MF->insert(MF->end(), MBB1);
    MBB2 = MF->CreateMachineBasicBlock(BB2);
    MF->insert(MF->end(), MBB2);
    MBB3 = MF->CreateMachineBasicBlock(BB3);
    MF->insert(MF->end(), MBB3);
    MBB4 = MF->CreateMachineBasicBlock(BB4);
    MF->insert(MF->end(), MBB4);
    MBB0->addSuccessor(MBB1);
    MBB0->addSuccessor(MBB2);
    MBB1->addSuccessor(MBB3);
    MBB2->addSuccessor(MBB3);
    MBB3->addSuccessor(MBB1);
    MBB3->addSuccessor(MBB2);
    MBB3->addSuccessor(MBB4);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  void setupBadlyNestedLoops() {
    //           entry
    //             |
    //           loop1 -o
    //             | ^
    //             | ^
    //           loop2 -o
    //             | ^
    //             | ^
    //           loop3 -o
    //             |
    //            ret
    //
    // NB: the loop blocks self-loop, which is a bit too fiddly to draw on
    // accurately.
    llvm::Function &F = const_cast<llvm::Function &>(MF->getFunction());
    auto *BB0 = BasicBlock::Create(Ctx, "entry", &F);
    auto *BB1 = BasicBlock::Create(Ctx, "loop1", &F);
    auto *BB2 = BasicBlock::Create(Ctx, "loop2", &F);
    auto *BB3 = BasicBlock::Create(Ctx, "loop3", &F);
    auto *BB4 = BasicBlock::Create(Ctx, "ret", &F);
    IRBuilder<> IRB0(BB0), IRB1(BB1), IRB2(BB2), IRB3(BB3), IRB4(BB4);
    IRB0.CreateBr(BB1);
    IRB1.CreateBr(BB2);
    IRB2.CreateBr(BB3);
    IRB3.CreateBr(BB4);
    IRB4.CreateRetVoid();
    MBB0 = MF->CreateMachineBasicBlock(BB0);
    MF->insert(MF->end(), MBB0);
    MBB1 = MF->CreateMachineBasicBlock(BB1);
    MF->insert(MF->end(), MBB1);
    MBB2 = MF->CreateMachineBasicBlock(BB2);
    MF->insert(MF->end(), MBB2);
    MBB3 = MF->CreateMachineBasicBlock(BB3);
    MF->insert(MF->end(), MBB3);
    MBB4 = MF->CreateMachineBasicBlock(BB4);
    MF->insert(MF->end(), MBB4);
    MBB0->addSuccessor(MBB1);
    MBB1->addSuccessor(MBB1);
    MBB1->addSuccessor(MBB2);
    MBB2->addSuccessor(MBB1);
    MBB2->addSuccessor(MBB2);
    MBB2->addSuccessor(MBB3);
    MBB3->addSuccessor(MBB2);
    MBB3->addSuccessor(MBB3);
    MBB3->addSuccessor(MBB4);
    MF->RenumberBlocks();

    setupLDVObj(&*MF);
  }

  MachineFunction *readMIRBlock(const char *Input) {
    MIRStr.clear();
    StringRef S = Twine(Twine(R"MIR(
--- |
  target triple = "x86_64-unknown-linux-gnu"
  define void @test() { ret void }
...
---
name: test
tracksRegLiveness: true
stack:
  - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8,
      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
body:  |
   bb.0:
    liveins: $rdi, $rsi
)MIR") + Twine(Input) + Twine("...\n"))
                      .toNullTerminatedStringRef(MIRStr);
    ;

    // Clear the "test" function from MMI if it's still present.
    if (Function *Fn = Mod->getFunction("test"))
      MMI->deleteMachineFunctionFor(*Fn);

    auto MemBuf = MemoryBuffer::getMemBuffer(S, "<input>");
    auto MIRParse = createMIRParser(std::move(MemBuf), Ctx);
    Mod = MIRParse->parseIRModule();
    assert(Mod);
    Mod->setDataLayout("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-"
                       "n8:16:32:64-S128");

    bool Result = MIRParse->parseMachineFunctions(*Mod, *MMI);
    assert(!Result && "Failed to parse unit test machine function?");
    (void)Result;

    Function *Fn = Mod->getFunction("test");
    assert(Fn && "Failed to parse a unit test module string?");
    Fn->setSubprogram(OurFunc);
    return MMI->getMachineFunction(*Fn);
  }

  void
  produceMLocTransferFunction(MachineFunction &MF,
                              SmallVectorImpl<MLocTransferMap> &MLocTransfer,
                              unsigned MaxNumBlocks) {
    LDV->produceMLocTransferFunction(MF, MLocTransfer, MaxNumBlocks);
  }

  std::pair<FuncValueTable, FuncValueTable>
  allocValueTables(unsigned Blocks, unsigned Locs) {
    FuncValueTable MOutLocs = std::make_unique<ValueTable[]>(Blocks);
    FuncValueTable MInLocs = std::make_unique<ValueTable[]>(Blocks);

    for (unsigned int I = 0; I < Blocks; ++I) {
      MOutLocs[I] = std::make_unique<ValueIDNum[]>(Locs);
      MInLocs[I] = std::make_unique<ValueIDNum[]>(Locs);
    }

    return std::make_pair(std::move(MOutLocs), std::move(MInLocs));
  }
};

TEST_F(InstrRefLDVTest, MTransferDefs) {
  MachineFunction *MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    RET64 $rax\n");
  setupLDVObj(MF);

  // We should start with only SP tracked.
  EXPECT_TRUE(MTracker->getNumLocs() == 1);

  SmallVector<MLocTransferMap, 1> TransferMap;
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // Code contains only one register write: that should assign to each of the
  // aliasing registers. Test that all of them get locations, and have a
  // corresponding def at the first instr in the function.
  const char *RegNames[] = {"RAX", "HAX", "EAX", "AX", "AH", "AL"};
  EXPECT_TRUE(MTracker->getNumLocs() == 7);
  for (const char *RegName : RegNames) {
    Register R = getRegByName(RegName);
    ASSERT_TRUE(MTracker->isRegisterTracked(R));
    LocIdx L = MTracker->getRegMLoc(R);
    ValueIDNum V = MTracker->readReg(R);
    // Value of this register should be: block zero, instruction 1, and the
    // location it's defined in is itself.
    ValueIDNum ToCmp(0, 1, L);
    EXPECT_EQ(V, ToCmp);
  }

  // Do the same again, but with an aliasing write. This should write to all
  // the same registers again, except $ah and $hax (the upper 8 bits of $ax
  // and 32 bits of $rax resp.).
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    $al = MOV8ri 0\n"
   "    RET64 $rax\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  auto TestRegSetSite = [&](const char *Name, unsigned InstrNum) {
    Register R = getRegByName(Name);
    ASSERT_TRUE(MTracker->isRegisterTracked(R));
    LocIdx L = MTracker->getRegMLoc(R);
    ValueIDNum V = MTracker->readMLoc(L);
    ValueIDNum ToCmp(0, InstrNum, L);
    EXPECT_EQ(V, ToCmp);
  };

  TestRegSetSite("AL", 2);
  TestRegSetSite("AH", 1);
  TestRegSetSite("AX", 2);
  TestRegSetSite("EAX", 2);
  TestRegSetSite("HAX", 1);
  TestRegSetSite("RAX", 2);

  // This call should:
  //  * Def rax via the implicit-def,
  //  * Clobber rsi/rdi and all their subregs, via the register mask
  //  * Same for rcx, despite it not being a use in the instr, it's in the mask
  //  * NOT clobber $rsp / $esp $ sp, LiveDebugValues deliberately ignores
  //    these.
  //  * NOT clobber $rbx, because it's non-volatile
  //  * Not track every other register in the machine, only those needed.
 MF = readMIRBlock(
   "    $rax = MOV64ri 0\n" // instr 1
   "    $rbx = MOV64ri 0\n" // instr 2
   "    $rcx = MOV64ri 0\n" // instr 3
   "    $rdi = MOV64ri 0\n" // instr 4
   "    $rsi = MOV64ri 0\n" // instr 5
   "    CALL64r $rax, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $rsi, implicit-def $rsp, implicit-def $ssp, implicit-def $rax, implicit-def $esp, implicit-def $sp\n\n\n\n" // instr 6
   "    RET64 $rax\n"); // instr 7
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  const char *RegsSetInCall[] = {"AL",  "AH",  "AX", "EAX", "HAX", "RAX",
                                 "DIL", "DIH", "DI", "EDI", "HDI", "RDI",
                                 "SIL", "SIH", "SI", "ESI", "HSI", "RSI",
                                 "CL",  "CH",  "CX", "ECX", "HCX", "RCX"};
  for (const char *RegSetInCall : RegsSetInCall)
    TestRegSetSite(RegSetInCall, 6);

  const char *RegsLeftAlone[] = {"BL", "BH", "BX", "EBX", "HBX", "RBX"};
  for (const char *RegLeftAlone : RegsLeftAlone)
    TestRegSetSite(RegLeftAlone, 2);

  // Stack pointer should be the live-in to the function, instruction zero.
  TestRegSetSite("RSP", 0);
  // These stack regs should not be tracked either. Nor the (fake) subregs.
  EXPECT_FALSE(MTracker->isRegisterTracked(getRegByName("ESP")));
  EXPECT_FALSE(MTracker->isRegisterTracked(getRegByName("SP")));
  EXPECT_FALSE(MTracker->isRegisterTracked(getRegByName("SPL")));
  EXPECT_FALSE(MTracker->isRegisterTracked(getRegByName("SPH")));
  EXPECT_FALSE(MTracker->isRegisterTracked(getRegByName("HSP")));

  // Should only be tracking: 6 x {A, B, C, DI, SI} registers = 30,
  // Plus RSP, SSP = 32.
  EXPECT_EQ(32u, MTracker->getNumLocs());


  // When we DBG_PHI something, we should track all its subregs.
  MF = readMIRBlock(
   "    DBG_PHI $rdi, 0\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // All DI regs and RSP tracked.
  EXPECT_EQ(7u, MTracker->getNumLocs());

  // All the DI registers should have block live-in values, i.e. the argument
  // to the function.
  const char *DIRegs[] = {"DIL", "DIH", "DI", "EDI", "HDI", "RDI"};
  for (const char *DIReg : DIRegs)
    TestRegSetSite(DIReg, 0);
}

TEST_F(InstrRefLDVTest, MTransferMeta) {
  // Meta instructions should not have any effect on register values.
  SmallVector<MLocTransferMap, 1> TransferMap;
  MachineFunction *MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    $rax = IMPLICIT_DEF\n"
   "    $rax = KILL killed $rax\n"
   "    RET64 $rax\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  LocIdx RaxLoc = MTracker->getRegMLoc(getRegByName("RAX"));
  ValueIDNum V = MTracker->readMLoc(RaxLoc);
  // Def of rax should be from instruction 1, i.e., unmodified.
  ValueIDNum Cmp(0, 1, RaxLoc);
  EXPECT_EQ(Cmp, V);
}

TEST_F(InstrRefLDVTest, MTransferCopies) {
  SmallVector<MLocTransferMap, 1> TransferMap;
  // This memory spill should be recognised, and a spill slot created.
  MachineFunction *MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax :: (store 8 into %stack.0)\n"
   "    RET64 $rax\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // Check that the spill location contains the value defined in rax by
  // instruction 1. The MIR header says -16 offset, but it's stored as -8;
  // it's not completely clear why, but here we only care about correctly
  // identifying the slot, not that all the surrounding data is correct.
  SpillLoc L = {getRegByName("RSP"), StackOffset::getFixed(-8)};
  SpillLocationNo SpillNo = *MTracker->getOrTrackSpillLoc(L);
  unsigned SpillLocID = MTracker->getLocID(SpillNo, {64, 0});
  LocIdx SpillLoc = MTracker->getSpillMLoc(SpillLocID);
  ValueIDNum V = MTracker->readMLoc(SpillLoc);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->getRegMLoc(RAX);
  ValueIDNum Cmp(0, 1, RaxLoc);
  EXPECT_EQ(V, Cmp);

  // A spill and restore should be recognised.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax :: (store 8 into %stack.0)\n"
   "    $rbx = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load 8 from %stack.0)\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // Test that rbx contains rax from instruction 1.
  RAX = getRegByName("RAX");
  RaxLoc = MTracker->getRegMLoc(RAX);
  Register RBX = getRegByName("RBX");
  LocIdx RbxLoc = MTracker->getRegMLoc(RBX);
  Cmp = ValueIDNum(0, 1, RaxLoc);
  ValueIDNum RbxVal = MTracker->readMLoc(RbxLoc);
  EXPECT_EQ(RbxVal, Cmp);

  // Testing that all the subregisters are transferred happens in
  // MTransferSubregSpills.

  // Copies and x86 movs should be recognised and honoured. In addition, all
  // of the subregisters should be copied across too.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    $rcx = COPY $rax\n"
   "    $rbx = MOV64rr $rcx\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  const char *ARegs[] = {"AL", "AH", "AX", "EAX", "HAX", "RAX"};
  const char *BRegs[] = {"BL", "BH", "BX", "EBX", "HBX", "RBX"};
  const char *CRegs[] = {"CL", "CH", "CX", "ECX", "HCX", "RCX"};
  auto CheckReg = [&](unsigned int I) {
    LocIdx A = MTracker->getRegMLoc(getRegByName(ARegs[I]));
    LocIdx B = MTracker->getRegMLoc(getRegByName(BRegs[I]));
    LocIdx C = MTracker->getRegMLoc(getRegByName(CRegs[I]));
    ValueIDNum ARefVal(0, 1, A);
    ValueIDNum AVal = MTracker->readMLoc(A);
    ValueIDNum BVal = MTracker->readMLoc(B);
    ValueIDNum CVal = MTracker->readMLoc(C);
    EXPECT_EQ(ARefVal, AVal);
    EXPECT_EQ(ARefVal, BVal);
    EXPECT_EQ(ARefVal, CVal);
  };

  for (unsigned int I = 0; I < 6; ++I)
    CheckReg(I);

  // When we copy to a subregister, the super-register should be def'd too: it's
  // value will have changed.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    $ecx = COPY $eax\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // First four regs [al, ah, ax, eax] should be copied to *cx.
  for (unsigned int I = 0; I < 4; ++I) {
    LocIdx A = MTracker->getRegMLoc(getRegByName(ARegs[I]));
    LocIdx C = MTracker->getRegMLoc(getRegByName(CRegs[I]));
    ValueIDNum ARefVal(0, 1, A);
    ValueIDNum AVal = MTracker->readMLoc(A);
    ValueIDNum CVal = MTracker->readMLoc(C);
    EXPECT_EQ(ARefVal, AVal);
    EXPECT_EQ(ARefVal, CVal);
  }

  // But rcx should contain a value defined by the COPY.
  LocIdx RcxLoc = MTracker->getRegMLoc(getRegByName("RCX"));
  ValueIDNum RcxVal = MTracker->readMLoc(RcxLoc);
  ValueIDNum RcxDefVal(0, 2, RcxLoc); // instr 2 -> the copy
  EXPECT_EQ(RcxVal, RcxDefVal);
}

TEST_F(InstrRefLDVTest, MTransferSubregSpills) {
  SmallVector<MLocTransferMap, 1> TransferMap;
  MachineFunction *MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax :: (store 8 into %stack.0)\n"
   "    $rbx = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load 8 from %stack.0)\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // Check that all the subregs of rax and rbx contain the same values. One
  // should completely transfer to the other.
  const char *ARegs[] = {"AL", "AH", "AX", "EAX", "HAX", "RAX"};
  const char *BRegs[] = {"BL", "BH", "BX", "EBX", "HBX", "RBX"};
  for (unsigned int I = 0; I < 6; ++I) {
    LocIdx A = MTracker->getRegMLoc(getRegByName(ARegs[I]));
    LocIdx B = MTracker->getRegMLoc(getRegByName(BRegs[I]));
    EXPECT_EQ(MTracker->readMLoc(A), MTracker->readMLoc(B));
  }

  // Explicitly check what's in the different subreg slots, on the stack.
  // Pair up subreg idx fields with the corresponding subregister in $rax.
  MLocTracker::StackSlotPos SubRegIdxes[] = {{8, 0}, {8, 8}, {16, 0}, {32, 0}, {64, 0}};
  const char *SubRegNames[] = {"AL", "AH", "AX", "EAX", "RAX"};
  for (unsigned int I = 0; I < 5; ++I) {
    // Value number where it's defined,
    LocIdx RegLoc = MTracker->getRegMLoc(getRegByName(SubRegNames[I]));
    ValueIDNum DefNum(0, 1, RegLoc);
    // Read the corresponding subreg field from the stack.
    SpillLoc L = {getRegByName("RSP"), StackOffset::getFixed(-8)};
    SpillLocationNo SpillNo = *MTracker->getOrTrackSpillLoc(L);
    unsigned SpillID = MTracker->getLocID(SpillNo, SubRegIdxes[I]);
    LocIdx SpillLoc = MTracker->getSpillMLoc(SpillID);
    ValueIDNum SpillValue = MTracker->readMLoc(SpillLoc);
    EXPECT_EQ(DefNum, SpillValue);
  }

  // If we have exactly the same code, but we write $eax to the stack slot after
  // $rax, then we should still have exactly the same output in the lower five
  // subregisters. Storing $eax to the start of the slot will overwrite with the
  // same values. $rax, as an aliasing register, should be reset to something
  // else by that write.
  // In theory, we could try and recognise that we're writing the _same_ values
  // to the stack again, and so $rax doesn't need to be reset to something else.
  // It seems vanishingly unlikely that LLVM would generate such code though,
  // so the benefits would be small.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax :: (store 8 into %stack.0)\n"
   "    MOV32mr $rsp, 1, $noreg, 16, $noreg, $eax :: (store 4 into %stack.0)\n"
   "    $rbx = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load 8 from %stack.0)\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  // Check lower five registers up to and include $eax == $ebx,
  for (unsigned int I = 0; I < 5; ++I) {
    LocIdx A = MTracker->getRegMLoc(getRegByName(ARegs[I]));
    LocIdx B = MTracker->getRegMLoc(getRegByName(BRegs[I]));
    EXPECT_EQ(MTracker->readMLoc(A), MTracker->readMLoc(B));
  }

  // $rbx should contain something else; today it's a def at the spill point
  // of the 4 byte value.
  SpillLoc L = {getRegByName("RSP"), StackOffset::getFixed(-8)};
  SpillLocationNo SpillNo = *MTracker->getOrTrackSpillLoc(L);
  unsigned SpillID = MTracker->getLocID(SpillNo, {64, 0});
  LocIdx Spill64Loc = MTracker->getSpillMLoc(SpillID);
  ValueIDNum DefAtSpill64(0, 3, Spill64Loc);
  LocIdx RbxLoc = MTracker->getRegMLoc(getRegByName("RBX"));
  EXPECT_EQ(MTracker->readMLoc(RbxLoc), DefAtSpill64);

  // Same again, test that the lower four subreg slots on the stack are the
  // value defined by $rax in instruction 1.
  for (unsigned int I = 0; I < 4; ++I) {
    // Value number where it's defined,
    LocIdx RegLoc = MTracker->getRegMLoc(getRegByName(SubRegNames[I]));
    ValueIDNum DefNum(0, 1, RegLoc);
    // Read the corresponding subreg field from the stack.
    SpillNo = *MTracker->getOrTrackSpillLoc(L);
    SpillID = MTracker->getLocID(SpillNo, SubRegIdxes[I]);
    LocIdx SpillLoc = MTracker->getSpillMLoc(SpillID);
    ValueIDNum SpillValue = MTracker->readMLoc(SpillLoc);
    EXPECT_EQ(DefNum, SpillValue);
  }

  // Stack slot for $rax should be a different value, today it's EmptyValue.
  ValueIDNum SpillValue = MTracker->readMLoc(Spill64Loc);
  EXPECT_EQ(SpillValue, DefAtSpill64);

  // If we write something to the stack, then over-write with some register
  // from a completely different hierarchy, none of the "old" values should be
  // readable.
  // NB: slight hack, store 16 in to a 8 byte stack slot.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV64mr $rsp, 1, $noreg, 16, $noreg, $rax :: (store 8 into %stack.0)\n"
   "    $xmm0 = IMPLICIT_DEF\n"
   "    MOVUPDmr $rsp, 1, $noreg, 16, $noreg, killed $xmm0 :: (store (s128) into %stack.0)\n"
   "    $rbx = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load 8 from %stack.0)\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  for (unsigned int I = 0; I < 5; ++I) {
    // Read subreg fields from the stack.
    SpillLocationNo SpillNo = *MTracker->getOrTrackSpillLoc(L);
    unsigned SpillID = MTracker->getLocID(SpillNo, SubRegIdxes[I]);
    LocIdx SpillLoc = MTracker->getSpillMLoc(SpillID);
    ValueIDNum SpillValue = MTracker->readMLoc(SpillLoc);

    // Value should be defined by the spill-to-xmm0 instr, get value of a def
    // at the point of the spill.
    ValueIDNum SpillDef(0, 4, SpillLoc);
    EXPECT_EQ(SpillValue, SpillDef);
  }

  // Read xmm0's position and ensure it has a value. Should be the live-in
  // value to the block, as IMPLICIT_DEF isn't a real def.
  SpillNo = *MTracker->getOrTrackSpillLoc(L);
  SpillID = MTracker->getLocID(SpillNo, {128, 0});
  LocIdx Spill128Loc = MTracker->getSpillMLoc(SpillID);
  SpillValue = MTracker->readMLoc(Spill128Loc);
  Register XMM0 = getRegByName("XMM0");
  LocIdx Xmm0Loc = MTracker->getRegMLoc(XMM0);
  EXPECT_EQ(ValueIDNum(0, 0, Xmm0Loc), SpillValue);

  // What happens if we spill ah to the stack, then load al? It should find
  // the same value.
  MF = readMIRBlock(
   "    $rax = MOV64ri 0\n"
   "    MOV8mr $rsp, 1, $noreg, 16, $noreg, $ah :: (store 1 into %stack.0)\n"
   "    $al = MOV8rm $rsp, 1, $noreg, 0, $noreg :: (load 1 from %stack.0)\n"
   "    RET64\n");
  setupLDVObj(MF);
  TransferMap.clear();
  TransferMap.resize(1);
  produceMLocTransferFunction(*MF, TransferMap, 1);

  Register AL = getRegByName("AL");
  Register AH = getRegByName("AH");
  LocIdx AlLoc = MTracker->getRegMLoc(AL);
  LocIdx AhLoc = MTracker->getRegMLoc(AH);
  ValueIDNum AHDef(0, 1, AhLoc);
  ValueIDNum ALValue = MTracker->readMLoc(AlLoc);
  EXPECT_EQ(ALValue, AHDef);
}

TEST_F(InstrRefLDVTest, MLocSingleBlock) {
  // Test some very simple properties about interpreting the transfer function.
  setupSingleBlock();

  // We should start with a single location, the stack pointer.
  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);

  // Set up live-in and live-out tables for this function: two locations (we
  // add one later) in a single block.
  FuncValueTable MOutLocs, MInLocs;
  std::tie(MOutLocs, MInLocs) = allocValueTables(1, 2);

  // Transfer function: nothing.
  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(1);

  // Try and build value maps...
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);

  // The result should be that RSP is marked as a live-in-PHI -- this represents
  // an argument. And as there's no transfer function, the block live-out should
  // be the same.
  EXPECT_EQ(MInLocs[0][0], ValueIDNum(0, 0, RspLoc));
  EXPECT_EQ(MOutLocs[0][0], ValueIDNum(0, 0, RspLoc));

  // Try again, this time initialising the in-locs to be defined by an
  // instruction. The entry block should always be re-assigned to be the
  // arguments.
  initValueArray(MInLocs, 1, 2);
  initValueArray(MOutLocs, 1, 2);
  MInLocs[0][0] = ValueIDNum(0, 1, RspLoc);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], ValueIDNum(0, 0, RspLoc));
  EXPECT_EQ(MOutLocs[0][0], ValueIDNum(0, 0, RspLoc));

  // Now insert something into the transfer function to assign to the single
  // machine location.
  TransferFunc[0].insert({RspLoc, ValueIDNum(0, 1, RspLoc)});
  initValueArray(MInLocs, 1, 2);
  initValueArray(MOutLocs, 1, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], ValueIDNum(0, 0, RspLoc));
  EXPECT_EQ(MOutLocs[0][0], ValueIDNum(0, 1, RspLoc));
  TransferFunc[0].clear();

  // Add a new register to be tracked, and insert it into the transfer function
  // as a copy. The output of $rax should be the live-in value of $rsp.
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);
  TransferFunc[0].insert({RspLoc, ValueIDNum(0, 1, RspLoc)});
  TransferFunc[0].insert({RaxLoc, ValueIDNum(0, 0, RspLoc)});
  initValueArray(MInLocs, 1, 2);
  initValueArray(MOutLocs, 1, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], ValueIDNum(0, 0, RspLoc));
  EXPECT_EQ(MInLocs[0][1], ValueIDNum(0, 0, RaxLoc));
  EXPECT_EQ(MOutLocs[0][0], ValueIDNum(0, 1, RspLoc));
  EXPECT_EQ(MOutLocs[0][1], ValueIDNum(0, 0, RspLoc)); // Rax contains RspLoc.
  TransferFunc[0].clear();
}

TEST_F(InstrRefLDVTest, MLocDiamondBlocks) {
  // Test that information flows from the entry block to two successors.
  //        entry
  //        /  \
  //      br1  br2
  //        \  /
  //         ret
  setupDiamondBlocks();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(4, 2);

  // Transfer function: start with nothing.
  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(4);

  // Name some values.
  unsigned EntryBlk = 0, BrBlk1 = 1, BrBlk2 = 2, RetBlk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum RspDefInBlk0(EntryBlk, 1, RspLoc);
  ValueIDNum RspDefInBlk1(BrBlk1, 1, RspLoc);
  ValueIDNum RspDefInBlk2(BrBlk2, 1, RspLoc);
  ValueIDNum RspPHIInBlk3(RetBlk, 0, RspLoc);
  ValueIDNum RaxLiveInBlk1(BrBlk1, 0, RaxLoc);
  ValueIDNum RaxLiveInBlk2(BrBlk2, 0, RaxLoc);

  // With no transfer function, the live-in values to the entry block should
  // propagate to all live-outs and the live-ins to the two successor blocks.
  // IN ADDITION: this checks that the exit block doesn't get a PHI put in it.
  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  // (Skipped writing out locations for $rax).

  // Check that a def of $rsp in the entry block will likewise reach all the
  // successors.
  TransferFunc[0].insert({RspLoc, RspDefInBlk0});
  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[0][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk0);
  TransferFunc[0].clear();

  // Def in one branch of the diamond means that we need a PHI in the ret block
  TransferFunc[0].insert({RspLoc, RspDefInBlk0});
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  // This value map: like above, where RspDefInBlk0 is propagated through one
  // branch of the diamond, but is def'ed in the live-outs of the other. The
  // ret / merging block should have a PHI in its live-ins.
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[0][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[3][0], RspPHIInBlk3);
  TransferFunc[0].clear();
  TransferFunc[1].clear();

  // If we have differeing defs in either side of the diamond, we should
  // continue to produce a PHI,
  TransferFunc[0].insert({RspLoc, RspDefInBlk0});
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[2].insert({RspLoc, RspDefInBlk2});
  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[0][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspPHIInBlk3);
  TransferFunc[0].clear();
  TransferFunc[1].clear();
  TransferFunc[2].clear();

  // If we have defs of the same value on either side of the branch, a PHI will
  // initially be created, however value propagation should then eliminate it.
  // Encode this by copying the live-in value to $rax, and copying it to $rsp
  // from $rax in each branch of the diamond. We don't allow the definition of
  // arbitary values in transfer functions.
  TransferFunc[0].insert({RspLoc, RspDefInBlk0});
  TransferFunc[0].insert({RaxLoc, LiveInRsp});
  TransferFunc[1].insert({RspLoc, RaxLiveInBlk1});
  TransferFunc[2].insert({RspLoc, RaxLiveInBlk2});
  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk0);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], RspDefInBlk0);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  TransferFunc[0].clear();
  TransferFunc[1].clear();
  TransferFunc[2].clear();
}

TEST_F(InstrRefLDVTest, MLocDiamondSpills) {
  // Test that defs in stack locations that require PHIs, cause PHIs to be
  // installed in aliasing locations. i.e., if there's a PHI in the lower
  // 8 bits of the stack, there should be PHIs for 16/32/64 bit locations
  // on the stack too.
  // Technically this isn't needed for accuracy: we should calculate PHIs
  // independently for each location. However, because there's an optimisation
  // that only places PHIs for the lower "interfering" parts of stack slots,
  // test for this behaviour.
  setupDiamondBlocks();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);

  // Create a stack location and ensure it's tracked.
  SpillLoc SL = {getRegByName("RSP"), StackOffset::getFixed(-8)};
  SpillLocationNo SpillNo = *MTracker->getOrTrackSpillLoc(SL);
  ASSERT_EQ(MTracker->getNumLocs(), 11u); // Tracks all possible stack locs.
  // Locations are: RSP, stack slots from 2^3 bits wide up to 2^9 for zmm regs,
  // then slots for sub_8bit_hi and sub_16bit_hi ({8, 8} and {16, 16}).
  // Finally, one for spilt fp80 registers.

  // Pick out the locations on the stack that various x86 regs would be written
  // to. HAX is the upper 16 bits of EAX.
  unsigned ALID = MTracker->getLocID(SpillNo, {8, 0});
  unsigned AHID = MTracker->getLocID(SpillNo, {8, 8});
  unsigned AXID = MTracker->getLocID(SpillNo, {16, 0});
  unsigned EAXID = MTracker->getLocID(SpillNo, {32, 0});
  unsigned HAXID = MTracker->getLocID(SpillNo, {16, 16});
  unsigned RAXID = MTracker->getLocID(SpillNo, {64, 0});
  LocIdx ALStackLoc = MTracker->getSpillMLoc(ALID);
  LocIdx AHStackLoc = MTracker->getSpillMLoc(AHID);
  LocIdx AXStackLoc = MTracker->getSpillMLoc(AXID);
  LocIdx EAXStackLoc = MTracker->getSpillMLoc(EAXID);
  LocIdx HAXStackLoc = MTracker->getSpillMLoc(HAXID);
  LocIdx RAXStackLoc = MTracker->getSpillMLoc(RAXID);
  // There are other locations, for things like xmm0, which we're going to
  // ignore here.

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(4, 11);

  // Transfer function: start with nothing.
  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(4);

  // Name some values.
  unsigned EntryBlk = 0, Blk1 = 1, RetBlk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum ALLiveIn(EntryBlk, 0, ALStackLoc);
  ValueIDNum AHLiveIn(EntryBlk, 0, AHStackLoc);
  ValueIDNum HAXLiveIn(EntryBlk, 0, HAXStackLoc);
  ValueIDNum ALPHI(RetBlk, 0, ALStackLoc);
  ValueIDNum AXPHI(RetBlk, 0, AXStackLoc);
  ValueIDNum EAXPHI(RetBlk, 0, EAXStackLoc);
  ValueIDNum HAXPHI(RetBlk, 0, HAXStackLoc);
  ValueIDNum RAXPHI(RetBlk, 0, RAXStackLoc);

  ValueIDNum ALDefInBlk1(Blk1, 1, ALStackLoc);
  ValueIDNum HAXDefInBlk1(Blk1, 1, HAXStackLoc);

  SmallPtrSet<MachineBasicBlock *, 4> AllBlocks{MBB0, MBB1, MBB2, MBB3};

  // If we put defs into one side of the diamond, for AL and HAX, then we should
  // find all aliasing positions have PHIs placed. This isn't technically what
  // the transfer function says to do: but we're testing that the optimisation
  // to reduce IDF calculation does the right thing.
  // AH should not be def'd: it don't alias AL or HAX.
  //
  // NB: we don't call buildMLocValueMap, because it will try to eliminate the
  // upper-slot PHIs, and succeed because of our slightly cooked transfer
  // function.
  TransferFunc[1].insert({ALStackLoc, ALDefInBlk1});
  TransferFunc[1].insert({HAXStackLoc, HAXDefInBlk1});
  initValueArray(MInLocs, 4, 11);
  placeMLocPHIs(*MF, AllBlocks, MInLocs, TransferFunc);
  EXPECT_EQ(MInLocs[3][ALStackLoc.asU64()], ALPHI);
  EXPECT_EQ(MInLocs[3][AXStackLoc.asU64()], AXPHI);
  EXPECT_EQ(MInLocs[3][EAXStackLoc.asU64()], EAXPHI);
  EXPECT_EQ(MInLocs[3][HAXStackLoc.asU64()], HAXPHI);
  EXPECT_EQ(MInLocs[3][RAXStackLoc.asU64()], RAXPHI);
  // AH should be left untouched,
  EXPECT_EQ(MInLocs[3][AHStackLoc.asU64()], ValueIDNum::EmptyValue);
}

TEST_F(InstrRefLDVTest, MLocSimpleLoop) {
  //    entry
  //     |
  //     |/-----\
  //    loopblk |
  //     |\-----/
  //     |
  //     ret
  setupSimpleLoop();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(3, 2);

  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(3);

  // Name some values.
  unsigned EntryBlk = 0, LoopBlk = 1, RetBlk = 2;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum RspPHIInBlk1(LoopBlk, 0, RspLoc);
  ValueIDNum RspDefInBlk1(LoopBlk, 1, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk1(LoopBlk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk2(RetBlk, 0, RaxLoc);

  // Begin test with all locations being live-through.
  initValueArray(MInLocs, 3, 2);
  initValueArray(MOutLocs, 3, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);

  // Add a def of $rsp to the loop block: it should be in the live-outs, but
  // should cause a PHI to be placed in the live-ins. Test the transfer function
  // by copying that PHI into $rax in the loop, then back to $rsp in the ret
  // block.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[1].insert({RaxLoc, RspPHIInBlk1});
  TransferFunc[2].insert({RspLoc, RaxPHIInBlk2});
  initValueArray(MInLocs, 3, 2);
  initValueArray(MOutLocs, 3, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk1);
  // Check rax as well,
  EXPECT_EQ(MInLocs[0][1], LiveInRax);
  EXPECT_EQ(MInLocs[1][1], RaxPHIInBlk1);
  EXPECT_EQ(MInLocs[2][1], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[0][1], LiveInRax);
  EXPECT_EQ(MOutLocs[1][1], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][1], RspPHIInBlk1);
  TransferFunc[1].clear();
  TransferFunc[2].clear();

  // As with the diamond case, a PHI will be created if there's a (implicit)
  // def in the entry block and loop block; but should be value propagated away
  // if it copies in the same value. Copy live-in $rsp to $rax, then copy it
  // into $rsp in the loop. Encoded as copying the live-in $rax value in block 1
  // to $rsp.
  TransferFunc[0].insert({RaxLoc, LiveInRsp});
  TransferFunc[1].insert({RspLoc, RaxPHIInBlk1});
  initValueArray(MInLocs, 3, 2);
  initValueArray(MOutLocs, 3, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  // Check $rax's values.
  EXPECT_EQ(MInLocs[0][1], LiveInRax);
  EXPECT_EQ(MInLocs[1][1], LiveInRsp);
  EXPECT_EQ(MInLocs[2][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][1], LiveInRsp);
  TransferFunc[0].clear();
  TransferFunc[1].clear();
}

TEST_F(InstrRefLDVTest, MLocNestedLoop) {
  //    entry
  //     |
  //    loop1
  //     ^\
  //     | \    /-\
  //     |  loop2  |
  //     |  /   \-/
  //     ^ /
  //     join
  //     |
  //     ret
  setupNestedLoops();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(5, 2);

  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(5);

  unsigned EntryBlk = 0, Loop1Blk = 1, Loop2Blk = 2, JoinBlk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum RspPHIInBlk1(Loop1Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk1(Loop1Blk, 1, RspLoc);
  ValueIDNum RspPHIInBlk2(Loop2Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk2(Loop2Blk, 1, RspLoc);
  ValueIDNum RspDefInBlk3(JoinBlk, 1, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk1(Loop1Blk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk2(Loop2Blk, 0, RaxLoc);

  // Like the other tests: first ensure that if there's nothing in the transfer
  // function, then everything is live-through (check $rsp).
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MInLocs[4][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][0], LiveInRsp);

  // A def in the inner loop means we should get PHIs at the heads of both
  // loops. Live-outs of the last three blocks will be the def, as it dominates
  // those.
  TransferFunc[2].insert({RspLoc, RspDefInBlk2});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk2);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk2);
  TransferFunc[2].clear();

  // Adding a def to the outer loop header shouldn't affect this much -- the
  // live-out of block 1 changes.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[2].insert({RspLoc, RspDefInBlk2});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk2);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk2);
  TransferFunc[1].clear();
  TransferFunc[2].clear();

  // Likewise, putting a def in the outer loop tail shouldn't affect where
  // the PHIs go, and should propagate into the ret block.

  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[2].insert({RspLoc, RspDefInBlk2});
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk2);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[1].clear();
  TransferFunc[2].clear();
  TransferFunc[3].clear();

  // However: if we don't def in the inner-loop, then we just have defs in the
  // head and tail of the outer loop. The inner loop should be live-through.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[1].clear();
  TransferFunc[3].clear();

  // Check that this still works if we copy RspDefInBlk1 to $rax and then
  // copy it back into $rsp in the inner loop.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  TransferFunc[1].insert({RaxLoc, RspDefInBlk1});
  TransferFunc[2].insert({RspLoc, RaxPHIInBlk2});
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  // Look at raxes value in the relevant blocks,
  EXPECT_EQ(MInLocs[2][1], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[1][1], RspDefInBlk1);
  TransferFunc[1].clear();
  TransferFunc[2].clear();
  TransferFunc[3].clear();

  // If we have a single def in the tail of the outer loop, that should produce
  // a PHI at the loop head, and be live-through the inner loop.
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[3].clear();

  // And if we copy from $rsp to $rax in block 2, it should resolve to the PHI
  // in block 1, and we should keep that value in rax until the ret block.
  // There'll be a PHI in block 1 and 2, because we're putting a def in the
  // inner loop.
  TransferFunc[2].insert({RaxLoc, RspPHIInBlk2});
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  // Examining the values of rax,
  EXPECT_EQ(MInLocs[0][1], LiveInRax);
  EXPECT_EQ(MInLocs[1][1], RaxPHIInBlk1);
  EXPECT_EQ(MInLocs[2][1], RaxPHIInBlk2);
  EXPECT_EQ(MInLocs[3][1], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[4][1], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[0][1], LiveInRax);
  EXPECT_EQ(MOutLocs[1][1], RaxPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][1], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[3][1], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[4][1], RspPHIInBlk1);
  TransferFunc[2].clear();
  TransferFunc[3].clear();
}

TEST_F(InstrRefLDVTest, MLocNoDominatingLoop) {
  //           entry
  //            / \
  //           /   \
  //          /     \
  //        head1   head2
  //        ^  \   /   ^
  //        ^   \ /    ^
  //        \-joinblk -/
  //             |
  //            ret
  setupNoDominatingLoop();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(5, 2);

  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(5);

  unsigned EntryBlk = 0, Head1Blk = 1, Head2Blk = 2, JoinBlk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum RspPHIInBlk1(Head1Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk1(Head1Blk, 1, RspLoc);
  ValueIDNum RspPHIInBlk2(Head2Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk2(Head2Blk, 1, RspLoc);
  ValueIDNum RspPHIInBlk3(JoinBlk, 0, RspLoc);
  ValueIDNum RspDefInBlk3(JoinBlk, 1, RspLoc);
  ValueIDNum RaxPHIInBlk1(Head1Blk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk2(Head2Blk, 0, RaxLoc);

  // As ever, test that everything is live-through if there are no defs.
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MInLocs[4][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][0], LiveInRsp);

  // Putting a def in the 'join' block will cause us to have two distinct
  // PHIs in each loop head, then on entry to the join block.
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[3].clear();

  // We should get the same behaviour if we put the def in either of the
  // loop heads -- it should force the other head to be a PHI.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MInLocs[4][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspPHIInBlk3);
  TransferFunc[1].clear();

  // Check symmetry,
  TransferFunc[2].insert({RspLoc, RspDefInBlk2});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MInLocs[4][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspPHIInBlk3);
  TransferFunc[2].clear();

  // Test some scenarios where there _shouldn't_ be any PHIs created at heads.
  // These are those PHIs are created, but value propagation eliminates them.
  // For example, lets copy rsp-livein to $rsp inside each loop head, so that
  // there's no need for a PHI in the join block. Put a def of $rsp in block 3
  // to force PHIs elsewhere.
  TransferFunc[0].insert({RaxLoc, LiveInRsp});
  TransferFunc[1].insert({RspLoc, RaxPHIInBlk1});
  TransferFunc[2].insert({RspLoc, RaxPHIInBlk2});
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[0].clear();
  TransferFunc[1].clear();
  TransferFunc[2].clear();
  TransferFunc[3].clear();

  // In fact, if we eliminate the def in block 3, none of those PHIs are
  // necessary, as we're just repeatedly copying LiveInRsp into $rsp. They
  // should all be value propagated out.
  TransferFunc[0].insert({RaxLoc, LiveInRsp});
  TransferFunc[1].insert({RspLoc, RaxPHIInBlk1});
  TransferFunc[2].insert({RspLoc, RaxPHIInBlk2});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MInLocs[4][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][0], LiveInRsp);
  TransferFunc[0].clear();
  TransferFunc[1].clear();
  TransferFunc[2].clear();
}

TEST_F(InstrRefLDVTest, MLocBadlyNestedLoops) {
  //           entry
  //             |
  //           loop1 -o
  //             | ^
  //             | ^
  //           loop2 -o
  //             | ^
  //             | ^
  //           loop3 -o
  //             |
  //            ret
  setupBadlyNestedLoops();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(5, 2);

  SmallVector<MLocTransferMap, 1> TransferFunc;
  TransferFunc.resize(5);

  unsigned EntryBlk = 0, Loop1Blk = 1, Loop2Blk = 2, Loop3Blk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum RspPHIInBlk1(Loop1Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk1(Loop1Blk, 1, RspLoc);
  ValueIDNum RspPHIInBlk2(Loop2Blk, 0, RspLoc);
  ValueIDNum RspPHIInBlk3(Loop3Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk3(Loop3Blk, 1, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum RaxPHIInBlk3(Loop3Blk, 0, RaxLoc);

  // As ever, test that everything is live-through if there are no defs.
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], LiveInRsp);
  EXPECT_EQ(MInLocs[2][0], LiveInRsp);
  EXPECT_EQ(MInLocs[3][0], LiveInRsp);
  EXPECT_EQ(MInLocs[4][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][0], LiveInRsp);

  // A def in loop3 should cause PHIs in every loop block: they're all
  // reachable from each other.
  TransferFunc[3].insert({RspLoc, RspDefInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk3);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk3);
  TransferFunc[3].clear();

  // A def in loop1 should cause a PHI in loop1, but not the other blocks.
  // loop2 and loop3 are dominated by the def in loop1, so they should have
  // that value live-through.
  TransferFunc[1].insert({RspLoc, RspDefInBlk1});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[3][0], RspDefInBlk1);
  EXPECT_EQ(MInLocs[4][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[3][0], RspDefInBlk1);
  EXPECT_EQ(MOutLocs[4][0], RspDefInBlk1);
  TransferFunc[1].clear();

  // As with earlier tricks: copy $rsp to $rax in the entry block, then $rax
  // to $rsp in block 3. The only def of $rsp is simply copying the same value
  // back into itself, and the value of $rsp is LiveInRsp all the way through.
  // PHIs should be created, then value-propagated away...  however this
  // doesn't work in practice.
  // Consider the entry to loop3: we can determine that there's an incoming
  // PHI value from loop2, and LiveInRsp from the self-loop. This would still
  // justify having a PHI on entry to loop3. The only way to completely
  // value-propagate these PHIs away would be to speculatively explore what
  // PHIs could be eliminated and what that would lead to; which is
  // combinatorially complex.
  // Happily:
  //  a) In this scenario, we always have a tracked location for LiveInRsp
  //     anyway, so there's no loss in availability,
  //  b) Only DBG_PHIs of a register would be vunlerable to this scenario, and
  //     even then only if a true PHI became a DBG_PHI and was then optimised
  //     through branch folding to no longer be at a CFG join,
  //  c) The register allocator can spot this kind of redundant COPY easily,
  //     and eliminate it.
  //
  // This unit test left in as a reference for the limitations of this
  // approach. PHIs will be left in $rsp on entry to each block.
  TransferFunc[0].insert({RaxLoc, LiveInRsp});
  TransferFunc[3].insert({RspLoc, RaxPHIInBlk3});
  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);
  buildMLocValueMap(MInLocs, MOutLocs, TransferFunc);
  EXPECT_EQ(MInLocs[0][0], LiveInRsp);
  EXPECT_EQ(MInLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MInLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MInLocs[3][0], RspPHIInBlk3);
  EXPECT_EQ(MInLocs[4][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][0], RspPHIInBlk1);
  EXPECT_EQ(MOutLocs[2][0], RspPHIInBlk2);
  EXPECT_EQ(MOutLocs[3][0], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][0], LiveInRsp);
  // Check $rax's value. It should have $rsps value from the entry block
  // onwards.
  EXPECT_EQ(MInLocs[0][1], LiveInRax);
  EXPECT_EQ(MInLocs[1][1], LiveInRsp);
  EXPECT_EQ(MInLocs[2][1], LiveInRsp);
  EXPECT_EQ(MInLocs[3][1], LiveInRsp);
  EXPECT_EQ(MInLocs[4][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[0][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[1][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[2][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[3][1], LiveInRsp);
  EXPECT_EQ(MOutLocs[4][1], LiveInRsp);
}

TEST_F(InstrRefLDVTest, pickVPHILocDiamond) {
  //        entry
  //        /  \
  //      br1  br2
  //        \  /
  //         ret
  setupDiamondBlocks();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(4, 2);

  initValueArray(MOutLocs, 4, 2);

  unsigned EntryBlk = 0, Br2Blk = 2, RetBlk = 3;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum RspPHIInBlk2(Br2Blk, 0, RspLoc);
  ValueIDNum RspPHIInBlk3(RetBlk, 0, RspLoc);
  ValueIDNum RaxPHIInBlk3(RetBlk, 0, RaxLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID RspPHIInBlk2ID = addValueDbgOp(RspPHIInBlk2);
  DbgOpID RspPHIInBlk3ID = addValueDbgOp(RspPHIInBlk3);
  DbgOpID RaxPHIInBlk3ID = addValueDbgOp(RaxPHIInBlk3);
  DbgOpID ConstZeroID = addConstDbgOp(MachineOperand::CreateImm(0));

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  DIExpression *TwoOpExpr =
      DIExpression::get(Ctx, {dwarf::DW_OP_LLVM_arg, 0, dwarf::DW_OP_LLVM_arg,
                              1, dwarf::DW_OP_plus});
  DbgValueProperties TwoOpProps(TwoOpExpr, false, true);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(4, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];
  VLiveOutIdx[MBB3] = &VLiveOuts[3];

  SmallVector<const MachineBasicBlock *, 2> Preds;
  for (const auto *Pred : MBB3->predecessors())
    Preds.push_back(Pred);

  // Specify the live-outs around the joining block.
  MOutLocs[1][0] = LiveInRsp;
  MOutLocs[2][0] = LiveInRax;

  bool Result;
  SmallVector<DbgOpID> OutValues;

  // Simple case: join two distinct values on entry to the block.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRaxID, EmptyProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  // Should have picked a PHI in $rsp in block 3.
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk3ID);
  }

  // If the incoming values are swapped between blocks, we should not
  // successfully join. The CFG merge would select the right values, but in
  // the wrong conditions.
  std::swap(VLiveOuts[1], VLiveOuts[2]);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Swap back,
  std::swap(VLiveOuts[1], VLiveOuts[2]);
  // Setting one of these to being a constant should prohibit merging.
  VLiveOuts[1].setDbgOpIDs(ConstZeroID);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Setting both to being identical constants should result in a valid join
  // with a constant value.
  VLiveOuts[2] = VLiveOuts[1];
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], ConstZeroID);
  }

  // NoVals shouldn't join with anything else.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(2, EmptyProps, DbgValue::NoVal);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // We might merge in another VPHI in such a join. Present pickVPHILoc with
  // such a scenario: first, where one incoming edge has a VPHI with no known
  // value. This represents an edge where there was a PHI value that can't be
  // found in the register file -- we can't subsequently find a PHI here.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(2, EmptyProps, DbgValue::VPHI);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // However, if we know the value of the incoming VPHI, we can search for its
  // location. Use a PHI machine-value for doing this, as VPHIs should always
  // have PHI values, or they should have been eliminated.
  MOutLocs[2][0] = RspPHIInBlk2;
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(2, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2].setDbgOpIDs(RspPHIInBlk2ID); // Set location where PHI happens.
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk3ID);
  }

  // If that value isn't available from that block, don't join.
  MOutLocs[2][0] = LiveInRsp;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Check that we don't pick values when the properties disagree, for example
  // different indirectness or DIExpression.
  MOutLocs[2][0] = LiveInRax;
  DIExpression *NewExpr =
      DIExpression::prepend(EmptyExpr, DIExpression::ApplyOffset, 4);
  DbgValueProperties PropsWithExpr(NewExpr, false, false);
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, PropsWithExpr);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  DbgValueProperties PropsWithIndirect(EmptyExpr, true, false);
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, PropsWithIndirect);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // When we have operands with values [A, B] and [B, A], we do not necessarily
  // pick identical join locations for each operand if the locations of those
  // values differ between incoming basic blocks.
  MOutLocs[1][0] = LiveInRsp;
  MOutLocs[2][0] = LiveInRax;
  MOutLocs[1][1] = LiveInRax;
  MOutLocs[2][1] = LiveInRsp;
  DbgOpID Locs0[] = {LiveInRspID, LiveInRaxID};
  DbgOpID Locs1[] = {LiveInRaxID, LiveInRspID};
  VLiveOuts[1] = DbgValue(Locs0, TwoOpProps);
  VLiveOuts[2] = DbgValue(Locs1, TwoOpProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  // Should have picked PHIs in block 3.
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk3ID);
    EXPECT_EQ(OutValues[1], RaxPHIInBlk3ID);
  }

  // When joining identical constants for an operand, we should simply keep that
  // constant while joining the remaining operands as normal.
  DbgOpID Locs2[] = {LiveInRspID, ConstZeroID};
  DbgOpID Locs3[] = {LiveInRaxID, ConstZeroID};
  VLiveOuts[1] = DbgValue(Locs2, TwoOpProps);
  VLiveOuts[2] = DbgValue(Locs3, TwoOpProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk3ID);
    EXPECT_EQ(OutValues[1], ConstZeroID);
  }

  // If the debug values have different constants for the same operand, they
  // cannot be joined.
  DbgOpID ConstOneID = addConstDbgOp(MachineOperand::CreateImm(1));
  DbgOpID Locs4[] = {LiveInRaxID, ConstOneID};
  VLiveOuts[1] = DbgValue(Locs3, TwoOpProps);
  VLiveOuts[2] = DbgValue(Locs4, TwoOpProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB3, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);
}

TEST_F(InstrRefLDVTest, pickVPHILocLoops) {
  setupSimpleLoop();
  //    entry
  //     |
  //     |/-----\
  //    loopblk |
  //     |\-----/
  //     |
  //     ret

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(3, 2);

  initValueArray(MOutLocs, 3, 2);

  unsigned EntryBlk = 0, LoopBlk = 1;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum RspPHIInBlk1(LoopBlk, 0, RspLoc);
  ValueIDNum RaxPHIInBlk1(LoopBlk, 0, RaxLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID RspPHIInBlk1ID = addValueDbgOp(RspPHIInBlk1);
  DbgOpID RaxPHIInBlk1ID = addValueDbgOp(RaxPHIInBlk1);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  DIExpression *TwoOpExpr =
      DIExpression::get(Ctx, {dwarf::DW_OP_LLVM_arg, 0, dwarf::DW_OP_LLVM_arg,
                              1, dwarf::DW_OP_plus});
  DbgValueProperties TwoOpProps(TwoOpExpr, false, true);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(3, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];

  SmallVector<const MachineBasicBlock *, 2> Preds;
  for (const auto *Pred : MBB1->predecessors())
    Preds.push_back(Pred);

  // Specify the live-outs around the joining block.
  MOutLocs[0][0] = LiveInRsp;
  MOutLocs[1][0] = LiveInRax;

  bool Result;
  SmallVector<DbgOpID> OutValues;

  // See that we can merge as normal on a backedge.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(LiveInRaxID, EmptyProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  // Should have picked a PHI in $rsp in block 1.
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk1ID);
  }

  // And that, if the desired values aren't available, we don't merge.
  MOutLocs[1][0] = LiveInRsp;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Test the backedge behaviour: PHIs that feed back into themselves can
  // carry this variables value. Feed in LiveInRsp in both $rsp and $rax
  // from the entry block, but only put an appropriate backedge PHI in $rax.
  // Only the $rax location can form the correct PHI.
  MOutLocs[0][0] = LiveInRsp;
  MOutLocs[0][1] = LiveInRsp;
  MOutLocs[1][0] = RaxPHIInBlk1;
  MOutLocs[1][1] = RaxPHIInBlk1;
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  // Crucially, a VPHI originating in this block:
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RaxPHIInBlk1ID);
  }

  // Test that we can also find a location when joining a backedge PHI with
  // a variadic debug value.
  MOutLocs[1][0] = RspPHIInBlk1;
  MOutLocs[0][1] = LiveInRax;
  DbgOpID Locs0[] = {LiveInRspID, LiveInRaxID};
  VLiveOuts[0] = DbgValue(Locs0, TwoOpProps);
  // Crucially, a VPHI originating in this block:
  VLiveOuts[1] = DbgValue(1, TwoOpProps, DbgValue::VPHI);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk1ID);
    EXPECT_EQ(OutValues[1], RaxPHIInBlk1ID);
  }

  // Merging should not be permitted if there's a usable PHI on the backedge,
  // but it's in the wrong place. (Overwrite $rax).
  MOutLocs[1][1] = LiveInRax;
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Additionally, if the VPHI coming back on the loop backedge isn't from
  // this block (block 1), we can't merge it.
  MOutLocs[1][1] = RaxPHIInBlk1;
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(0, EmptyProps, DbgValue::VPHI);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);
}

TEST_F(InstrRefLDVTest, pickVPHILocBadlyNestedLoops) {
  // Run some tests similar to pickVPHILocLoops, with more than one backedge,
  // and check that we merge correctly over many candidate locations.
  setupBadlyNestedLoops();
  //           entry
  //             |
  //           loop1 -o
  //             | ^
  //             | ^
  //           loop2 -o
  //             | ^
  //             | ^
  //           loop3 -o
  //             |
  //            ret
  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);
  Register RBX = getRegByName("RBX");
  LocIdx RbxLoc = MTracker->lookupOrTrackRegister(RBX);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(5, 3);

  initValueArray(MOutLocs, 5, 3);

  unsigned EntryBlk = 0, Loop1Blk = 1;

  ValueIDNum LiveInRsp(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax(EntryBlk, 0, RaxLoc);
  ValueIDNum LiveInRbx(EntryBlk, 0, RbxLoc);
  ValueIDNum RspPHIInBlk1(Loop1Blk, 0, RspLoc);
  ValueIDNum RaxPHIInBlk1(Loop1Blk, 0, RaxLoc);
  ValueIDNum RbxPHIInBlk1(Loop1Blk, 0, RbxLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID LiveInRbxID = addValueDbgOp(LiveInRbx);
  DbgOpID RspPHIInBlk1ID = addValueDbgOp(RspPHIInBlk1);
  addValueDbgOp(RaxPHIInBlk1);
  DbgOpID RbxPHIInBlk1ID = addValueDbgOp(RbxPHIInBlk1);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(5, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];
  VLiveOutIdx[MBB3] = &VLiveOuts[3];
  VLiveOutIdx[MBB4] = &VLiveOuts[4];

  // We're going to focus on block 1.
  SmallVector<const MachineBasicBlock *, 2> Preds;
  for (const auto *Pred : MBB1->predecessors())
    Preds.push_back(Pred);

  // Specify the live-outs around the joining block. Incoming edges from the
  // entry block, self, and loop2.
  MOutLocs[0][0] = LiveInRsp;
  MOutLocs[1][0] = LiveInRax;
  MOutLocs[2][0] = LiveInRbx;

  bool Result;
  SmallVector<DbgOpID> OutValues;

  // See that we can merge as normal on a backedge.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(LiveInRaxID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRbxID, EmptyProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  // Should have picked a PHI in $rsp in block 1.
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk1ID);
  }

  // Check too that permuting the live-out locations prevents merging
  MOutLocs[0][0] = LiveInRax;
  MOutLocs[1][0] = LiveInRbx;
  MOutLocs[2][0] = LiveInRsp;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  MOutLocs[0][0] = LiveInRsp;
  MOutLocs[1][0] = LiveInRax;
  MOutLocs[2][0] = LiveInRbx;

  // Feeding a PHI back on one backedge shouldn't merge (block 1 self backedge
  // wants LiveInRax).
  MOutLocs[1][0] = RspPHIInBlk1;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // If the variables value on that edge is a VPHI feeding into itself, that's
  // fine.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2] = DbgValue(LiveInRbxID, EmptyProps);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk1ID);
  }

  // Likewise: the other backedge being a VPHI from block 1 should be accepted.
  MOutLocs[2][0] = RspPHIInBlk1;
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RspPHIInBlk1ID);
  }

  // Here's where it becomes tricky: we should not merge if there are two
  // _distinct_ backedge PHIs. We can't have a PHI that happens in both rsp
  // and rax for example. We can only pick one location as the live-in.
  MOutLocs[2][0] = RaxPHIInBlk1;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // The above test sources correct machine-PHI-value from two places. Now
  // try with one machine-PHI-value, but placed in two different locations
  // on the backedge. Again, we can't merge a location here, there's no
  // location that works on all paths.
  MOutLocs[0][0] = LiveInRsp;
  MOutLocs[1][0] = RspPHIInBlk1;
  MOutLocs[2][0] = LiveInRsp;
  MOutLocs[2][1] = RspPHIInBlk1;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_FALSE(Result);

  // Scatter various PHI values across the available locations. Only rbx (loc 2)
  // has the right value in both backedges -- that's the loc that should be
  // picked.
  MOutLocs[0][2] = LiveInRsp;
  MOutLocs[1][0] = RspPHIInBlk1;
  MOutLocs[1][1] = RaxPHIInBlk1;
  MOutLocs[1][2] = RbxPHIInBlk1;
  MOutLocs[2][0] = LiveInRsp;
  MOutLocs[2][1] = RspPHIInBlk1;
  MOutLocs[2][2] = RbxPHIInBlk1;
  OutValues.clear();
  Result = pickVPHILoc(OutValues, *MBB1, VLiveOutIdx, MOutLocs, Preds);
  EXPECT_TRUE(Result);
  if (Result) {
    EXPECT_EQ(OutValues[0], RbxPHIInBlk1ID);
  }
}

TEST_F(InstrRefLDVTest, vlocJoinDiamond) {
  //        entry
  //        /  \
  //      br1  br2
  //        \  /
  //         ret
  setupDiamondBlocks();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  MTracker->lookupOrTrackRegister(RAX);

  DbgOpID LiveInRspID = DbgOpID(false, 0);
  DbgOpID LiveInRaxID = DbgOpID(false, 1);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(4, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];
  VLiveOutIdx[MBB3] = &VLiveOuts[3];

  SmallPtrSet<const MachineBasicBlock *, 8> AllBlocks;
  AllBlocks.insert(MBB0);
  AllBlocks.insert(MBB1);
  AllBlocks.insert(MBB2);
  AllBlocks.insert(MBB3);

  SmallVector<const MachineBasicBlock *, 2> Preds;
  for (const auto *Pred : MBB3->predecessors())
    Preds.push_back(Pred);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  // vlocJoin is here to propagate incoming values, and eliminate PHIs. Start
  // off by propagating a value into the merging block, number 3.
  DbgValue JoinedLoc = DbgValue(3, EmptyProps, DbgValue::NoVal);
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, EmptyProps);
  bool Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result); // Output locs should have changed.
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // And if we did it a second time, leaving the live-ins as it was, then
  // we should report no change.
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);

  // If the live-in variable values are different, but there's no PHI placed
  // in this block, then just pick a location. It should be the first (in RPO)
  // predecessor to avoid being a backedge.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRaxID, EmptyProps);
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::NoVal);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  // RPO is blocks 0 2 1 3, so LiveInRax is picked as the first predecessor
  // of this join.
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRaxID);

  // No tests for whether vlocJoin will pass-through a variable with differing
  // expressions / properties. Those can only come about due to assignments; and
  // for any assignment at all, a PHI should have been placed at the dominance
  // frontier. We rely on the IDF calculator being accurate (which is OK,
  // because so does the rest of LLVM).

  // Try placing a PHI. With differing input values (LiveInRsp, LiveInRax),
  // this PHI should not be eliminated.
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  // Expect no change.
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  // This should not have been assigned a fixed value.
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), DbgOpID::UndefID);
  EXPECT_EQ(JoinedLoc.BlockNo, 3);

  // Try a simple PHI elimination. Put a PHI in block 3, but LiveInRsp on both
  // incoming edges. Re-load in and out-locs with unrelated values; they're
  // irrelevant.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, EmptyProps);
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // Try the same PHI elimination but with one incoming value being a VPHI
  // referring to the same value.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(2, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2].setDbgOpIDs(LiveInRspID);
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // If the "current" live-in is a VPHI, but not a VPHI generated in the current
  // block, then it's the remains of an earlier value propagation. We should
  // value propagate through this merge. Even if the current incoming values
  // disagree, because we've previously determined any VPHI here is redundant.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRaxID, EmptyProps);
  JoinedLoc = DbgValue(2, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRaxID); // from block 2

  // The above test, but test that we will install one value-propagated VPHI
  // over another.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(0, EmptyProps, DbgValue::VPHI);
  JoinedLoc = DbgValue(2, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 0);

  // We shouldn't eliminate PHIs when properties disagree.
  DbgValueProperties PropsWithIndirect(EmptyExpr, true, false);
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, PropsWithIndirect);
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 3);

  // Even if properties disagree, we should still value-propagate if there's no
  // PHI to be eliminated. The disagreeing values should work themselves out,
  // seeing how we've determined no PHI is necessary.
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, PropsWithIndirect);
  JoinedLoc = DbgValue(2, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);
  // Also check properties come from block 2, the first RPO predecessor to block
  // three.
  EXPECT_EQ(JoinedLoc.Properties, PropsWithIndirect);

  // Again, disagreeing properties, this time the expr, should cause a PHI to
  // not be eliminated.
  DIExpression *NewExpr =
      DIExpression::prepend(EmptyExpr, DIExpression::ApplyOffset, 4);
  DbgValueProperties PropsWithExpr(NewExpr, false, false);
  VLiveOuts[1] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRspID, PropsWithExpr);
  JoinedLoc = DbgValue(3, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);

  // Try placing a PHI with variadic debug values. With differing input values
  // (LiveInRsp, LiveInRax), this PHI should not be eliminated.
  DIExpression *TwoOpExpr =
      DIExpression::get(Ctx, {dwarf::DW_OP_LLVM_arg, 0, dwarf::DW_OP_LLVM_arg,
                              1, dwarf::DW_OP_plus});
  DbgValueProperties TwoOpProps(TwoOpExpr, false, true);
  DbgOpID Locs0[] = {LiveInRspID, LiveInRaxID};
  DbgOpID Locs1[] = {LiveInRaxID, LiveInRspID};
  JoinedLoc = DbgValue(3, TwoOpProps, DbgValue::VPHI);
  VLiveOuts[1] = DbgValue(Locs0, TwoOpProps);
  VLiveOuts[2] = DbgValue(Locs1, TwoOpProps);
  Result = vlocJoin(*MBB3, VLiveOutIdx, AllBlocks, JoinedLoc);
  // Expect no change.
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  // This should not have been assigned a fixed value.
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), DbgOpID::UndefID);
  EXPECT_EQ(JoinedLoc.BlockNo, 3);
}

TEST_F(InstrRefLDVTest, vlocJoinLoops) {
  setupSimpleLoop();
  //    entry
  //     |
  //     |/-----\
  //    loopblk |
  //     |\-----/
  //     |
  //     ret
  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  MTracker->lookupOrTrackRegister(RAX);

  DbgOpID LiveInRspID = DbgOpID(false, 0);
  DbgOpID LiveInRaxID = DbgOpID(false, 1);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(3, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];

  SmallPtrSet<const MachineBasicBlock *, 8> AllBlocks;
  AllBlocks.insert(MBB0);
  AllBlocks.insert(MBB1);
  AllBlocks.insert(MBB2);

  SmallVector<const MachineBasicBlock *, 2> Preds;
  for (const auto *Pred : MBB1->predecessors())
    Preds.push_back(Pred);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  // Test some back-edge-specific behaviours of vloc join. Mostly: the fact that
  // VPHIs that arrive on backedges can be eliminated, despite having different
  // values to the predecessor.

  // First: when there's no VPHI placed already, propagate the live-in value of
  // the first RPO predecessor.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(LiveInRaxID, EmptyProps);
  DbgValue JoinedLoc = DbgValue(LiveInRaxID, EmptyProps);
  bool Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // If there is a VPHI: don't elimiante it if there are disagreeing values.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(LiveInRaxID, EmptyProps);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);

  // If we feed this VPHI back into itself though, we can eliminate it.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // Don't eliminate backedge VPHIs if the predecessors have different
  // properties.
  DIExpression *NewExpr =
      DIExpression::prepend(EmptyExpr, DIExpression::ApplyOffset, 4);
  DbgValueProperties PropsWithExpr(NewExpr, false, false);
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, PropsWithExpr, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);

  // Backedges with VPHIs, but from the wrong block, shouldn't be eliminated.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(0, EmptyProps, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);
}

TEST_F(InstrRefLDVTest, vlocJoinBadlyNestedLoops) {
  // Test PHI elimination in the presence of multiple backedges.
  setupBadlyNestedLoops();
  //           entry
  //             |
  //           loop1 -o
  //             | ^
  //             | ^
  //           loop2 -o
  //             | ^
  //             | ^
  //           loop3 -o
  //             |
  //            ret
  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  MTracker->lookupOrTrackRegister(RAX);
  Register RBX = getRegByName("RBX");
  MTracker->lookupOrTrackRegister(RBX);

  DbgOpID LiveInRspID = DbgOpID(false, 0);
  DbgOpID LiveInRaxID = DbgOpID(false, 1);
  DbgOpID LiveInRbxID = DbgOpID(false, 2);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  SmallVector<DbgValue, 32> VLiveOuts;
  VLiveOuts.resize(5, DbgValue(EmptyProps, DbgValue::Undef));
  InstrRefBasedLDV::LiveIdxT VLiveOutIdx;
  VLiveOutIdx[MBB0] = &VLiveOuts[0];
  VLiveOutIdx[MBB1] = &VLiveOuts[1];
  VLiveOutIdx[MBB2] = &VLiveOuts[2];
  VLiveOutIdx[MBB3] = &VLiveOuts[3];
  VLiveOutIdx[MBB4] = &VLiveOuts[4];

  SmallPtrSet<const MachineBasicBlock *, 8> AllBlocks;
  AllBlocks.insert(MBB0);
  AllBlocks.insert(MBB1);
  AllBlocks.insert(MBB2);
  AllBlocks.insert(MBB3);
  AllBlocks.insert(MBB4);

  // We're going to focus on block 1.
  SmallVector<const MachineBasicBlock *, 3> Preds;
  for (const auto *Pred : MBB1->predecessors())
    Preds.push_back(Pred);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  // Test a normal VPHI isn't eliminated.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(LiveInRaxID, EmptyProps);
  VLiveOuts[2] = DbgValue(LiveInRbxID, EmptyProps);
  DbgValue JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  bool Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);

  // Common VPHIs on backedges should merge.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_TRUE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::Def);
  EXPECT_EQ(JoinedLoc.getDbgOpID(0), LiveInRspID);

  // They shouldn't merge if one of their properties is different.
  DbgValueProperties PropsWithIndirect(EmptyExpr, true, false);
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2] = DbgValue(1, PropsWithIndirect, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);

  // VPHIs from different blocks should not merge.
  VLiveOuts[0] = DbgValue(LiveInRspID, EmptyProps);
  VLiveOuts[1] = DbgValue(1, EmptyProps, DbgValue::VPHI);
  VLiveOuts[2] = DbgValue(2, EmptyProps, DbgValue::VPHI);
  JoinedLoc = DbgValue(1, EmptyProps, DbgValue::VPHI);
  Result = vlocJoin(*MBB1, VLiveOutIdx, AllBlocks, JoinedLoc);
  EXPECT_FALSE(Result);
  EXPECT_EQ(JoinedLoc.Kind, DbgValue::VPHI);
  EXPECT_EQ(JoinedLoc.BlockNo, 1);
}

// Above are tests for picking VPHI locations, and eliminating VPHIs. No
// unit-tests are written for evaluating the transfer function as that's
// pretty straight forwards, or applying VPHI-location-picking to live-ins.
// Instead, pre-set some machine locations and apply buildVLocValueMap to the
// existing CFG patterns.
TEST_F(InstrRefLDVTest, VLocSingleBlock) {
  setupSingleBlock();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(1, 2);

  ValueIDNum LiveInRsp = ValueIDNum(0, 0, RspLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  MInLocs[0][0] = MOutLocs[0][0] = LiveInRsp;

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  // Mild hack: rather than constructing machine instructions in each block
  // and creating lexical scopes across them, instead just tell
  // buildVLocValueMap that there's an assignment in every block. That makes
  // every block in scope.
  SmallPtrSet<MachineBasicBlock *, 4> AssignBlocks;
  AssignBlocks.insert(MBB0);

  SmallVector<VLocTracker, 1> VLocs;
  VLocs.resize(1, VLocTracker(Overlaps, EmptyExpr));

  InstrRefBasedLDV::LiveInsT Output;

  // Test that, with no assignments at all, no mappings are created for the
  // variable in this function.
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output.size(), 0ul);

  // If we put an assignment in the transfer function, that should... well,
  // do nothing, because we don't store the live-outs.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output.size(), 0ul);

  // There is pretty much nothing else of interest to test with a single block.
  // It's not relevant to the SSA-construction parts of variable values.
}

TEST_F(InstrRefLDVTest, VLocDiamondBlocks) {
  setupDiamondBlocks();
  //        entry
  //        /  \
  //      br1  br2
  //        \  /
  //         ret

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  unsigned EntryBlk = 0, RetBlk = 3;

  ValueIDNum LiveInRsp = ValueIDNum(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax = ValueIDNum(EntryBlk, 0, RaxLoc);
  ValueIDNum RspPHIInBlk3 = ValueIDNum(RetBlk, 0, RspLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID RspPHIInBlk3ID = addValueDbgOp(RspPHIInBlk3);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(4, 2);

  initValueArray(MInLocs, 4, 2);
  initValueArray(MOutLocs, 4, 2);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  // Mild hack: rather than constructing machine instructions in each block
  // and creating lexical scopes across them, instead just tell
  // buildVLocValueMap that there's an assignment in every block. That makes
  // every block in scope.
  SmallPtrSet<MachineBasicBlock *, 4> AssignBlocks;
  AssignBlocks.insert(MBB0);
  AssignBlocks.insert(MBB1);
  AssignBlocks.insert(MBB2);
  AssignBlocks.insert(MBB3);

  SmallVector<VLocTracker, 1> VLocs;
  VLocs.resize(4, VLocTracker(Overlaps, EmptyExpr));

  InstrRefBasedLDV::LiveInsT Output;

  // Start off with LiveInRsp in every location.
  for (unsigned int I = 0; I < 4; ++I) {
    MInLocs[I][0] = MInLocs[I][1] = LiveInRsp;
    MOutLocs[I][0] = MOutLocs[I][1] = LiveInRsp;
  }

  auto ClearOutputs = [&]() {
    for (auto &Elem : Output)
      Elem.clear();
  };
  Output.resize(4);

  // No assignments -> no values.
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  EXPECT_EQ(Output[3].size(), 0ul);

  // An assignment in the end block should also not affect other blocks; or
  // produce any live-ins.
  VLocs[3].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  ClearOutputs();

  // Assignments in either of the side-of-diamond blocks should also not be
  // propagated anywhere.
  VLocs[3].Vars.clear();
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  VLocs[2].Vars.clear();
  ClearOutputs();

  VLocs[1].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  VLocs[1].Vars.clear();
  ClearOutputs();

  // However: putting an assignment in the first block should propagate variable
  // values through to all other blocks, as it dominates.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();

  // Additionally, even if that value isn't available in the register file, it
  // should still be propagated, as buildVLocValueMap shouldn't care about
  // what's in the registers (except for PHIs).
  // values through to all other blocks, as it dominates.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();

  // We should get a live-in to the merging block, if there are two assigns of
  // the same value in either side of the diamond.
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[1].Vars.clear();
  VLocs[2].Vars.clear();

  // If we assign a value in the entry block, then 'undef' on a branch, we
  // shouldn't have a live-in in the merge block.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(EmptyProps, DbgValue::Undef)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Having different values joining into the merge block should mean we have
  // no live-in in that block. Block ones LiveInRax value doesn't appear as a
  // live-in anywhere, it's block internal.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // But on the other hand, if there's a location in the register file where
  // those two values can be joined, do so.
  MOutLocs[1][0] = LiveInRax;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), RspPHIInBlk3ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();
}

TEST_F(InstrRefLDVTest, VLocSimpleLoop) {
  setupSimpleLoop();
  //    entry
  //     |
  //     |/-----\
  //    loopblk |
  //     |\-----/
  //     |
  //     ret

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  unsigned EntryBlk = 0, LoopBlk = 1;

  ValueIDNum LiveInRsp = ValueIDNum(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax = ValueIDNum(EntryBlk, 0, RaxLoc);
  ValueIDNum RspPHIInBlk1 = ValueIDNum(LoopBlk, 0, RspLoc);
  ValueIDNum RspDefInBlk1 = ValueIDNum(LoopBlk, 1, RspLoc);
  ValueIDNum RaxPHIInBlk1 = ValueIDNum(LoopBlk, 0, RaxLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID RspPHIInBlk1ID = addValueDbgOp(RspPHIInBlk1);
  DbgOpID RspDefInBlk1ID = addValueDbgOp(RspDefInBlk1);
  DbgOpID RaxPHIInBlk1ID = addValueDbgOp(RaxPHIInBlk1);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(3, 2);

  initValueArray(MInLocs, 3, 2);
  initValueArray(MOutLocs, 3, 2);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);
  DIExpression *TwoOpExpr =
      DIExpression::get(Ctx, {dwarf::DW_OP_LLVM_arg, 0, dwarf::DW_OP_LLVM_arg,
                              1, dwarf::DW_OP_plus});
  DbgValueProperties VariadicProps(TwoOpExpr, false, true);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  SmallPtrSet<MachineBasicBlock *, 4> AssignBlocks;
  AssignBlocks.insert(MBB0);
  AssignBlocks.insert(MBB1);
  AssignBlocks.insert(MBB2);

  SmallVector<VLocTracker, 3> VLocs;
  VLocs.resize(3, VLocTracker(Overlaps, EmptyExpr));

  InstrRefBasedLDV::LiveInsT Output;

  // Start off with LiveInRsp in every location.
  for (unsigned int I = 0; I < 3; ++I) {
    MInLocs[I][0] = MInLocs[I][1] = LiveInRsp;
    MOutLocs[I][0] = MOutLocs[I][1] = LiveInRsp;
  }

  auto ClearOutputs = [&]() {
    for (auto &Elem : Output)
      Elem.clear();
  };
  Output.resize(3);

  // Easy starter: a dominating assign should propagate to all blocks.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // A variadic assignment should behave the same.
  DbgOpID Locs0[] = {LiveInRspID, LiveInRaxID};
  VLocs[0].Vars.insert({Var, DbgValue(Locs0, VariadicProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output, MOutLocs,
                    MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(1), LiveInRaxID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Put an undef assignment in the loop. Should get no live-in value.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(EmptyProps, DbgValue::Undef)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Assignment of the same value should naturally join.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Assignment of different values shouldn't join with no machine PHI vals.
  // Will be live-in to exit block as it's dominated.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Install a completely unrelated PHI value, that we should not join on. Try
  // with unrelated assign in loop block again.
  MInLocs[1][0] = RspPHIInBlk1;
  MOutLocs[1][0] = RspDefInBlk1;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Now, if we assign RspDefInBlk1 in the loop block, we should be able to
  // find the appropriate PHI.
  MInLocs[1][0] = RspPHIInBlk1;
  MOutLocs[1][0] = RspDefInBlk1;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(RspDefInBlk1ID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), RspPHIInBlk1ID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), RspDefInBlk1ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // If the PHI happens in a different location, the live-in should happen
  // there.
  MInLocs[1][0] = LiveInRsp;
  MOutLocs[1][0] = LiveInRsp;
  MInLocs[1][1] = RaxPHIInBlk1;
  MOutLocs[1][1] = RspDefInBlk1;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(RspDefInBlk1ID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), RaxPHIInBlk1ID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), RspDefInBlk1ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // The PHI happening in both places should be handled too. Exactly where
  // isn't important, but if the location picked changes, this test will let
  // you know.
  MInLocs[1][0] = RaxPHIInBlk1;
  MOutLocs[1][0] = RspDefInBlk1;
  MInLocs[1][1] = RaxPHIInBlk1;
  MOutLocs[1][1] = RspDefInBlk1;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(RspDefInBlk1ID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  // Today, the first register is picked.
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), RspPHIInBlk1ID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), RspDefInBlk1ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // If the loop block looked a bit like this:
  //    %0 = PHI %1, %2
  //    [...]
  //    DBG_VALUE %0
  // Then with instr-ref it becomes:
  //    DBG_PHI %0
  //    [...]
  //    DBG_INSTR_REF
  // And we would be feeding a machine PHI-value back around the loop. However:
  // this does not mean we can eliminate the variable value PHI and use the
  // variable value from the entry block: they are distinct values that must be
  // joined at some location by the control flow.
  // [This test input would never occur naturally, the machine-PHI would be
  //  eliminated]
  MInLocs[1][0] = RspPHIInBlk1;
  MOutLocs[1][0] = RspPHIInBlk1;
  MInLocs[1][1] = LiveInRax;
  MOutLocs[1][1] = LiveInRax;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(RspPHIInBlk1ID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), RspPHIInBlk1ID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), RspPHIInBlk1ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // Test that we can eliminate PHIs. A PHI will be placed at the loop head
  // because there's a def in it.
  MInLocs[1][0] = LiveInRsp;
  MOutLocs[1][0] = LiveInRsp;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();
}

// test phi elimination with the nested situation
TEST_F(InstrRefLDVTest, VLocNestedLoop) {
  //    entry
  //     |
  //    loop1
  //     ^\
  //     | \    /-\
  //     |  loop2  |
  //     |  /   \-/
  //     ^ /
  //     join
  //     |
  //     ret
  setupNestedLoops();

  ASSERT_TRUE(MTracker->getNumLocs() == 1);
  LocIdx RspLoc(0);
  Register RAX = getRegByName("RAX");
  LocIdx RaxLoc = MTracker->lookupOrTrackRegister(RAX);

  unsigned EntryBlk = 0, Loop1Blk = 1, Loop2Blk = 2;

  ValueIDNum LiveInRsp = ValueIDNum(EntryBlk, 0, RspLoc);
  ValueIDNum LiveInRax = ValueIDNum(EntryBlk, 0, RaxLoc);
  ValueIDNum RspPHIInBlk1 = ValueIDNum(Loop1Blk, 0, RspLoc);
  ValueIDNum RspPHIInBlk2 = ValueIDNum(Loop2Blk, 0, RspLoc);
  ValueIDNum RspDefInBlk2 = ValueIDNum(Loop2Blk, 1, RspLoc);
  DbgOpID LiveInRspID = addValueDbgOp(LiveInRsp);
  DbgOpID LiveInRaxID = addValueDbgOp(LiveInRax);
  DbgOpID RspPHIInBlk1ID = addValueDbgOp(RspPHIInBlk1);
  DbgOpID RspPHIInBlk2ID = addValueDbgOp(RspPHIInBlk2);
  DbgOpID RspDefInBlk2ID = addValueDbgOp(RspDefInBlk2);

  FuncValueTable MInLocs, MOutLocs;
  std::tie(MInLocs, MOutLocs) = allocValueTables(5, 2);

  initValueArray(MInLocs, 5, 2);
  initValueArray(MOutLocs, 5, 2);

  DebugVariable Var(FuncVariable, std::nullopt, nullptr);
  DbgValueProperties EmptyProps(EmptyExpr, false, false);

  SmallSet<DebugVariable, 4> AllVars;
  AllVars.insert(Var);

  SmallPtrSet<MachineBasicBlock *, 5> AssignBlocks;
  AssignBlocks.insert(MBB0);
  AssignBlocks.insert(MBB1);
  AssignBlocks.insert(MBB2);
  AssignBlocks.insert(MBB3);
  AssignBlocks.insert(MBB4);

  SmallVector<VLocTracker, 5> VLocs;
  VLocs.resize(5, VLocTracker(Overlaps, EmptyExpr));

  InstrRefBasedLDV::LiveInsT Output;

  // Start off with LiveInRsp in every location.
  for (unsigned int I = 0; I < 5; ++I) {
    MInLocs[I][0] = MInLocs[I][1] = LiveInRsp;
    MOutLocs[I][0] = MOutLocs[I][1] = LiveInRsp;
  }

  auto ClearOutputs = [&]() {
    for (auto &Elem : Output)
      Elem.clear();
  };
  Output.resize(5);

  // A dominating assign should propagate to all blocks.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();

  // Test that an assign in the inner loop causes unresolved PHIs at the heads
  // of both loops, and no output location. Dominated blocks do get values.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[2].Vars.clear();

  // Same test, but with no assignment in block 0. We should still get values
  // in dominated blocks.
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[2].Vars.clear();

  // Similarly, assignments in the outer loop gives location to dominated
  // blocks, but no PHI locations are found at the outer loop head.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[3].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  EXPECT_EQ(Output[3].size(), 0ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[3].Vars.clear();

  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[1].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[1].Vars.clear();

  // With an assignment of the same value in the inner loop, we should work out
  // that all PHIs can be eliminated and the same value is live-through the
  // whole function.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 1ul);
  EXPECT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRspID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRspID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[2].Vars.clear();

  // If we have an assignment in the inner loop, and a PHI for it at the inner
  // loop head, we could find a live-in location for the inner loop. But because
  // the outer loop has no PHI, we can't find a variable value for outer loop
  // head, so can't have a live-in value for the inner loop head.
  MInLocs[2][0] = RspPHIInBlk2;
  MOutLocs[2][0] = LiveInRax;
  // NB: all other machine locations are LiveInRsp, disallowing a PHI in block
  // one. Even though RspPHIInBlk2 isn't available later in the function, we
  // should still produce a live-in value. The fact it's unavailable is a
  // different concern.
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[2].Vars.insert({Var, DbgValue(LiveInRaxID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  EXPECT_EQ(Output[1].size(), 0ul);
  EXPECT_EQ(Output[2].size(), 0ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), LiveInRaxID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), LiveInRaxID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[2].Vars.clear();

  // Have an assignment in inner loop that can have a PHI resolved; and add a
  // machine value PHI to the outer loop head, so that we can find a location
  // all the way through the function.
  MInLocs[1][0] = RspPHIInBlk1;
  MOutLocs[1][0] = RspPHIInBlk1;
  MInLocs[2][0] = RspPHIInBlk2;
  MOutLocs[2][0] = RspDefInBlk2;
  MInLocs[3][0] = RspDefInBlk2;
  MOutLocs[3][0] = RspDefInBlk2;
  VLocs[0].Vars.insert({Var, DbgValue(LiveInRspID, EmptyProps)});
  VLocs[2].Vars.insert({Var, DbgValue(RspDefInBlk2ID, EmptyProps)});
  buildVLocValueMap(OutermostLoc, AllVars, AssignBlocks, Output,
                    MOutLocs, MInLocs, VLocs);
  EXPECT_EQ(Output[0].size(), 0ul);
  ASSERT_EQ(Output[1].size(), 1ul);
  ASSERT_EQ(Output[2].size(), 1ul);
  ASSERT_EQ(Output[3].size(), 1ul);
  ASSERT_EQ(Output[4].size(), 1ul);
  EXPECT_EQ(Output[1][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[1][0].second.getDbgOpID(0), RspPHIInBlk1ID);
  EXPECT_EQ(Output[2][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[2][0].second.getDbgOpID(0), RspPHIInBlk2ID);
  EXPECT_EQ(Output[3][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[3][0].second.getDbgOpID(0), RspDefInBlk2ID);
  EXPECT_EQ(Output[4][0].second.Kind, DbgValue::Def);
  EXPECT_EQ(Output[4][0].second.getDbgOpID(0), RspDefInBlk2ID);
  ClearOutputs();
  VLocs[0].Vars.clear();
  VLocs[2].Vars.clear();
}
