Index: llvm/lib/CodeGen/InlineSpiller.cpp =================================================================== --- llvm/lib/CodeGen/InlineSpiller.cpp +++ llvm/lib/CodeGen/InlineSpiller.cpp @@ -1246,6 +1246,14 @@ bool HoistSpillHelper::isSpillCandBB(LiveInterval &OrigLI, VNInfo &OrigVNI, MachineBasicBlock &BB, Register &LiveReg) { SlotIndex Idx = IPA.getLastInsertPoint(OrigLI, BB); + // The original def could be after the last insert point in the root block, + // we can't hoist to here. + if (Idx < OrigVNI.def) { + // TODO: We could be better here. If LI is not alive in landing pad + // we could hoist spill after LIP. + LLVM_DEBUG(dbgs() << "can't spill in root block - def after LIP\n"); + return false; + } Register OrigReg = OrigLI.reg(); SmallSetVector &Siblings = Virt2SiblingsMap[OrigReg]; assert(OrigLI.getVNInfoAt(Idx) == &OrigVNI && "Unexpected VNI"); Index: llvm/lib/CodeGen/SplitKit.h =================================================================== --- llvm/lib/CodeGen/SplitKit.h +++ llvm/lib/CodeGen/SplitKit.h @@ -511,7 +511,8 @@ SlotIndex leaveIntvAtTop(MachineBasicBlock &MBB); /// overlapIntv - Indicate that all instructions in range should use the open - /// interval, but also let the complement interval be live. + /// interval if End does not have tied-def usage of the register and in this + /// case compliment interval is used. Let the complement interval be live. /// /// This doubles the register pressure, but is sometimes required to deal with /// register uses after the last valid split point. Index: llvm/lib/CodeGen/SplitKit.cpp =================================================================== --- llvm/lib/CodeGen/SplitKit.cpp +++ llvm/lib/CodeGen/SplitKit.cpp @@ -118,6 +118,13 @@ if (!VNI) return LIP.first; + // The def of statepoint instruction is a gc relocation and it should be alive + // in landing pad. So we cannot split interval after statepoint instruction. + if (SlotIndex::isSameInstr(VNI->def, LIP.second)) + if (auto *I = LIS.getInstructionFromIndex(LIP.second)) + if (I->getOpcode() == TargetOpcode::STATEPOINT) + return LIP.second; + // If the value leaving MBB was defined after the call in MBB, it can't // really be live-in to the landing pad. This can happen if the landing pad // has a PHI, and this register is undef on the exceptional edge. @@ -695,6 +702,23 @@ LLVM_DEBUG(dbgs() << ": not live\n"); return End; } + SlotIndex LSP = SA.getLastSplitPoint(&MBB); + if (LSP < Last) { + // It could be that the use after LSP is a def, and thus the ParentVNI + // just selected starts at that def. For this case to exist, the def + // must be part of a tied def/use pair (as otherwise we'd have split + // distinct live ranges into individual live intervals), and thus we + // can insert the def into the VNI of the use and the tied def/use + // pair can live in the resulting interval. + Last = LSP; + ParentVNI = Edit->getParent().getVNInfoAt(Last); + if (!ParentVNI) { + // undef use --> undef tied def + LLVM_DEBUG(dbgs() << ": tied use not live\n"); + return End; + } + } + LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id); VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Last, MBB, SA.getLastSplitPointIter(&MBB)); @@ -784,6 +808,12 @@ return VNI->def; } +static bool hasTiedUseOf(MachineInstr &MI, unsigned Reg) { + return any_of(MI.defs(), [Reg](const MachineOperand &MO) { + return MO.isReg() && MO.isTied() && MO.getReg() == Reg; + }); +} + void SplitEditor::overlapIntv(SlotIndex Start, SlotIndex End) { assert(OpenIdx && "openIntv not called before overlapIntv"); const VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start); @@ -795,6 +825,16 @@ // The complement interval will be extended as needed by LICalc.extend(). if (ParentVNI) forceRecompute(0, *ParentVNI); + + // If the last use is tied to a def, we can't mark it as live for the + // interval which includes only the use. That would cause the tied pair + // to end up in two different intervals. + if (auto *MI = LIS.getInstructionFromIndex(End)) + if (hasTiedUseOf(*MI, Edit->getReg())) { + LLVM_DEBUG(dbgs() << "skip overlap due to tied def at end\n"); + return; + } + LLVM_DEBUG(dbgs() << " overlapIntv [" << Start << ';' << End << "):"); RegAssign.insert(Start, End, OpenIdx); LLVM_DEBUG(dump()); @@ -835,12 +875,18 @@ if (AssignI.stop() != Def) continue; unsigned RegIdx = AssignI.value(); - if (AtBegin || !MBBI->readsVirtualRegister(Edit->getReg())) { + // We could hoist back-copy right after another back-copy. As a result + // MMBI points to copy instruction which is actually dead now. + // We cannot set its stop to MBBI which will be the same as start and + // interval does not support that. + SlotIndex Kill = + AtBegin ? SlotIndex() : LIS.getInstructionIndex(*MBBI).getRegSlot(); + if (AtBegin || !MBBI->readsVirtualRegister(Edit->getReg()) || + Kill <= AssignI.start()) { LLVM_DEBUG(dbgs() << " cannot find simple kill of RegIdx " << RegIdx << '\n'); forceRecompute(RegIdx, *Edit->getParent().getVNInfoAt(Def)); } else { - SlotIndex Kill = LIS.getInstructionIndex(*MBBI).getRegSlot(); LLVM_DEBUG(dbgs() << " move kill to " << Kill << '\t' << *MBBI); AssignI.setStop(Kill); } @@ -1046,10 +1092,13 @@ NotToHoistSet.insert(ParentVNI->id); continue; } - SlotIndex Last = LIS.getMBBEndIdx(Dom.first).getPrevSlot(); - Dom.second = - defFromParent(0, ParentVNI, Last, *Dom.first, - SA.getLastSplitPointIter(Dom.first))->def; + SlotIndex LSP = SA.getLastSplitPoint(Dom.first); + if (LSP <= ParentVNI->def) { + NotToHoistSet.insert(ParentVNI->id); + continue; + } + Dom.second = defFromParent(0, ParentVNI, LSP, *Dom.first, + SA.getLastSplitPointIter(Dom.first))->def; } // Remove redundant back-copies that are now known to be dominated by another Index: llvm/test/CodeGen/X86/statepoint-invoke-ra-hoist-copies.mir =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/statepoint-invoke-ra-hoist-copies.mir @@ -0,0 +1,756 @@ +# REQUIRES: asserts +# RUN: llc -x mir -run-pass=simple-register-coalescing,greedy -verify-machineinstrs < %s 2>&1 | FileCheck %s + +# CHECK-NOT: Bad Parent VNI +--- | + ; ModuleID = 'hoist-copies' + source_filename = "hoist-copies.ll" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" + + define float @hoge(i8 addrspace(3)* %arg) gc "statepoint-example" personality i32* ()* @widget { + bb: + %tmp = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* null, align 8 + %tmp1 = load i32, i32 addrspace(3)* undef, align 4 + %tmp2 = load i32, i32 addrspace(3)* undef, align 4 + %tmp3 = load i32, i32 addrspace(3)* null, align 4 + %tmp4 = load i32, i32 addrspace(3)* null, align 4 + %tmp5 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* undef, align 8 + %tmp6 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* undef, align 8 + %tmp7 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* undef, align 8 + %tmp8 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* undef, align 8 + %tmp9 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(3)* undef, align 8 + %tmp10 = inttoptr i64 undef to i8 addrspace(1)* + %tmp11 = inttoptr i64 undef to i8 addrspace(1)* + br i1 undef, label %bb12, label %bb93 + + bb12: ; preds = %bb + %tmp13 = load atomic i32, i32 addrspace(1)* undef unordered, align 4 + %tmp14 = and i32 %tmp13, 33554431 + %tmp15 = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* nonnull @barney, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 1, i32 0, i32 83, i32 0, i32 19, i32 0, i32 0, i8 addrspace(1)* %tmp, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp5, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp6, i32 0, i8 addrspace(1)* %tmp7, i32 0, i8 addrspace(1)* %tmp8, i32 0, i8 addrspace(1)* %tmp9, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %tmp, i8 addrspace(1)* %tmp6, i8 addrspace(1)* %tmp7, i8 addrspace(1)* %tmp8, i8 addrspace(1)* %tmp9, i8 addrspace(1)* %tmp5, i8 addrspace(1)* %tmp10, i8 addrspace(1)* %tmp11) ] + %tmp16 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 1, i32 1) ; (%tmp6, %tmp6) + %tmp17 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 2, i32 2) ; (%tmp7, %tmp7) + %tmp18 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 4, i32 4) ; (%tmp9, %tmp9) + %tmp19 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 5, i32 5) ; (%tmp5, %tmp5) + %tmp20 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 6, i32 6) ; (%tmp10, %tmp10) + %tmp21 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp15, i32 7, i32 7) ; (%tmp11, %tmp11) + %tmp22 = invoke token (i64, i32, float (i32, i8 addrspace(1)*, i64, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_f32i32p1i8i64i32f(i64 1, i32 16, float (i32, i8 addrspace(1)*, i64, i32)* nonnull @quux, i32 4, i32 0, i32 %tmp14, i8 addrspace(1)* %tmp16, i64 -170, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 103, i32 1, i32 19, i32 0, i32 3, float undef, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp19, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp16, i32 0, i8 addrspace(1)* %tmp17, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* %tmp18, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* %tmp16, i8 addrspace(1)* %tmp17, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp18, i8 addrspace(1)* %tmp19, i8 addrspace(1)* %tmp20, i8 addrspace(1)* %tmp21) ] + to label %bb23 unwind label %bb75 + + bb23: ; preds = %bb12 + %tmp24 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 1, i32 1) ; (%tmp16, %tmp16) + %tmp25 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 2, i32 2) ; (%tmp17, %tmp17) + %tmp26 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 4, i32 4) ; (%tmp18, %tmp18) + %tmp27 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 5, i32 5) ; (%tmp19, %tmp19) + %tmp28 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 6, i32 6) ; (%tmp20, %tmp20) + %tmp29 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp22, i32 7, i32 7) ; (%tmp21, %tmp21) + %tmp30 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* %tmp26, i32 undef, i32 %tmp4, i32 %tmp4, i32 0, i32 0) [ "deopt"(i32 0, i32 8, i32 0, i32 153, i32 4, i32 19, i32 0, i32 4, i64 undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp27, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp24, i32 0, i8 addrspace(1)* %tmp25, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* %tmp26, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* %tmp27, i8 addrspace(1)* %tmp24, i8 addrspace(1)* %tmp25, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp26, i8 addrspace(1)* %tmp28, i8 addrspace(1)* %tmp29) ] + to label %bb56 unwind label %bb65 + + bb31: ; preds = %bb67 + %tmp32 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* %tmp71, i32 %tmp4, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 537, i32 2, i32 19, i32 0, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* null, i32 3, i32 undef, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 1, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp69, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp70, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* %tmp71, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* %tmp69, i8 addrspace(1)* %tmp70, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp71, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp72, i8 addrspace(1)* undef) ] + to label %bb33 unwind label %bb77 + + bb33: ; preds = %bb31 + %tmp34 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 0, i32 15, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 591, i32 0, i32 19, i32 0, i32 7, i8* null, i32 3, i32 undef, i32 3, i32 63, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 1, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 1, i32 1, i32 16, i32 0, i32 0, i32 0), "gc-live"() ] + unreachable + + bb35: ; preds = %bb67 + %tmp36 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* %tmp71, i32 %tmp4, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 8, i32 0, i32 300, i32 2, i32 19, i32 0, i32 0, i8 addrspace(1)* %tmp71, i32 3, i32 undef, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp69, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp70, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* %tmp71, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* %tmp69, i8 addrspace(1)* %tmp70, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp71, i8 addrspace(1)* %tmp72, i8 addrspace(1)* undef) ] + to label %bb37 unwind label %bb79 + + bb37: ; preds = %bb35 + %tmp38 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 1, i32 1) ; (%tmp69, %tmp69) + %tmp39 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 6, i32 6) ; (%tmp72, %tmp72) + %tmp40 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* undef, i32 undef, i32 undef, i32 -7122, i32 0, i32 0) [ "deopt"(i32 0, i32 8, i32 0, i32 308, i32 0, i32 19, i32 0, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp38, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* %tmp38, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp39, i8 addrspace(1)* undef) ] + to label %bb41 unwind label %bb85 + + bb41: ; preds = %bb37 + %tmp42 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp40, i32 6, i32 6) ; (%tmp39, %tmp39) + %tmp43 = getelementptr inbounds i8, i8 addrspace(1)* %tmp42, i64 904 + %tmp44 = bitcast i8 addrspace(1)* %tmp43 to i8 addrspace(1)* addrspace(1)* + %tmp45 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* %tmp44 unordered, align 8 + %tmp46 = icmp eq i8 addrspace(1)* %tmp45, null + %tmp47 = xor i64 0, -1 + %tmp48 = inttoptr i64 %tmp47 to i8 addrspace(1)* + %tmp49 = select i1 %tmp46, i8 addrspace(1)* null, i8 addrspace(1)* %tmp48 + br i1 undef, label %bb52, label %bb50 + + bb50: ; preds = %bb41 + %0 = bitcast i8 addrspace(1)* %tmp43 to i8 addrspace(1)* addrspace(1)* + %tmp51 = call i8 addrspace(1)* @wombat(i8 addrspace(1)* %tmp49, i8 addrspace(1)* addrspace(1)* %0) + br label %bb52 + + bb52: ; preds = %bb50, %bb41 + %tmp53 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* undef, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 335, i32 2, i32 19, i32 0, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp42, i8 addrspace(1)* undef) ] + to label %bb54 unwind label %bb90 + + bb54: ; preds = %bb52 + %tmp55 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 10, i32 0, i32 0) [ "deopt"(i32 0, i32 1, i32 0, i32 344, i32 4, i32 19, i32 0, i32 0, i8 addrspace(1)* null, i32 3, i32 undef, i32 4, i64 undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb56: ; preds = %bb23 + %tmp57 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp30, i32 1, i32 1) ; (%tmp27, %tmp27) + %tmp58 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp30, i32 2, i32 2) ; (%tmp24, %tmp24) + %tmp59 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp30, i32 5, i32 5) ; (%tmp26, %tmp26) + %tmp60 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp30, i32 6, i32 6) ; (%tmp28, %tmp28) + %tmp61 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp30, i32 7, i32 7) ; (%tmp29, %tmp29) + %tmp62 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* %tmp59, i32 %tmp1, i32 7, i32 %tmp3, i32 0, i32 0) [ "deopt"(i32 0, i32 8, i32 0, i32 208, i32 4, i32 19, i32 0, i32 0, i8 addrspace(1)* %tmp57, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* null, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp57, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp58, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* %tmp59, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %tmp57, i8 addrspace(1)* %tmp58, i8 addrspace(1)* undef, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp59, i8 addrspace(1)* null, i8 addrspace(1)* %tmp60, i8 addrspace(1)* %tmp61) ] + to label %bb63 unwind label %bb67 + + bb63: ; preds = %bb56 + %tmp64 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 10, i32 0, i32 0) [ "deopt"(i32 0, i32 9, i32 0, i32 215, i32 8, i32 19, i32 0, i32 0, i8 addrspace(1)* null, i32 7, i32 undef, i32 7, i32 undef, i32 7, double undef, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 4, double undef, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 2, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb65: ; preds = %bb23 + %tmp66 = landingpad token + cleanup + unreachable + + bb67: ; preds = %bb56 + %tmp68 = landingpad token + cleanup + %tmp69 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp68, i32 0, i32 0) ; (%tmp57, %tmp57) + %tmp70 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp68, i32 1, i32 1) ; (%tmp58, %tmp58) + %tmp71 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp68, i32 4, i32 4) ; (%tmp59, %tmp59) + %tmp72 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp68, i32 6, i32 6) ; (%tmp60, %tmp60) + switch i32 undef, label %bb99 [ + i32 66, label %bb35 + i32 57, label %bb31 + ] + + bb75: ; preds = %bb12 + %tmp76 = landingpad token + cleanup + unreachable + + bb77: ; preds = %bb31 + %tmp78 = landingpad token + cleanup + br label %bb95 + + bb79: ; preds = %bb35 + %tmp80 = landingpad token + cleanup + %tmp81 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp80, i32 5, i32 5) ; (%tmp71, %tmp71) + %tmp84 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(256)* inttoptr (i64 8 to i8 addrspace(1)* addrspace(256)*), align 8 + br label %bb99 + + bb85: ; preds = %bb37 + %tmp86 = landingpad token + cleanup + %tmp87 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp86, i32 6, i32 6) ; (%tmp39, %tmp39) + br label %bb99 + + bb90: ; preds = %bb52 + %tmp91 = landingpad token + cleanup + %tmp92 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp91, i32 7, i32 7) ; (%tmp42, %tmp42) + br label %bb95 + + bb93: ; preds = %bb + %tmp94 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 14, i32 0, i32 0) [ "deopt"(i32 0, i32 1, i32 0, i32 94, i32 4, i32 19, i32 0, i32 3, float undef, i32 0, i8 addrspace(1)* %tmp6, i32 0, i8 addrspace(1)* %tmp7, i32 3, i32 -170, i32 0, i8 addrspace(1)* %tmp, i32 3, i32 %tmp1, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 %tmp4, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp5, i32 3, float undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp6, i32 0, i8 addrspace(1)* %tmp7, i32 0, i8 addrspace(1)* %tmp8, i32 0, i8 addrspace(1)* %tmp9, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb95: ; preds = %bb114, %bb90, %bb77 + %tmp96 = phi i8 addrspace(1)* [ undef, %bb114 ], [ undef, %bb77 ], [ %tmp92, %bb90 ] + %tmp97 = getelementptr inbounds i8, i8 addrspace(1)* %tmp96, i64 928 + %tmp98 = bitcast i8 addrspace(1)* %tmp97 to i64 addrspace(1)* + store atomic i64 undef, i64 addrspace(1)* %tmp98 unordered, align 8 + ret float undef + + bb99: ; preds = %bb85, %bb79, %bb67 + %tmp101 = phi i8 addrspace(1)* [ %tmp87, %bb85 ], [ undef, %bb79 ], [ %tmp72, %bb67 ] + %tmp102 = phi i8 addrspace(1)* [ undef, %bb85 ], [ %tmp81, %bb79 ], [ %tmp71, %bb67 ] + %tmp103 = phi i8 addrspace(1)* [ undef, %bb85 ], [ undef, %bb79 ], [ %tmp69, %bb67 ] + %tmp104 = phi i8 addrspace(1)* [ undef, %bb85 ], [ %tmp84, %bb79 ], [ undef, %bb67 ] + %sunkaddr = getelementptr inbounds i8, i8 addrspace(1)* %tmp101, i64 904 + %1 = bitcast i8 addrspace(1)* %sunkaddr to i8 addrspace(1)* addrspace(1)* + %tmp105 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* %1 unordered, align 8 + %tmp106 = icmp eq i8 addrspace(1)* %tmp105, null + %tmp107 = xor i64 0, -1 + %tmp108 = inttoptr i64 %tmp107 to i8 addrspace(1)* + %tmp109 = select i1 %tmp106, i8 addrspace(1)* null, i8 addrspace(1)* %tmp108 + %tmp110 = invoke token (i64, i32, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 1, i32 16, i32 (i32, i8 addrspace(1)*, i32, i32, i32)* nonnull @hoge.1, i32 5, i32 0, i32 undef, i8 addrspace(1)* %tmp102, i32 undef, i32 undef, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 0, i32 0, i32 572, i32 2, i32 19, i32 0, i32 0, i8 addrspace(1)* %tmp109, i32 3, i32 undef, i32 7, i8* null, i32 3, i32 undef, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* %tmp103, i32 3, float undef, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp104, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %tmp109, i8 addrspace(1)* %tmp103, i8 addrspace(1)* %tmp104, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp101) ] + to label %bb111 unwind label %bb114 + + bb111: ; preds = %bb99 + %tmp112 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp110, i32 4, i32 4) ; (%tmp101, %tmp101) + %tmp113 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 10, i32 0, i32 0) [ "deopt"(i32 0, i32 1, i32 0, i32 581, i32 4, i32 19, i32 0, i32 0, i8 addrspace(1)* null, i32 3, i32 undef, i32 4, i64 undef, i32 7, i8* null, i32 7, i8* null, i32 3, i32 undef, i32 3, i32 %tmp2, i32 3, i32 %tmp3, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, float undef, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 7, i8* null), "gc-live"() ] + unreachable + + bb114: ; preds = %bb99 + %tmp115 = landingpad token + cleanup + br label %bb95 + } + + declare i32* @widget() + + declare float @quux(i32, i8 addrspace(1)*, i64, i32) + + declare i32 @hoge.1(i32, i8 addrspace(1)*, i32, i32, i32) + + declare void @barney() + + declare void @ham(i32) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 immarg, i32 immarg, void (i32)*, i32 immarg, i32 immarg, ...) + + ; Function Attrs: nounwind readnone + declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32 immarg, i32 immarg) #0 + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 immarg, i32 immarg, void ()*, i32 immarg, i32 immarg, ...) + + declare token @llvm.experimental.gc.statepoint.p0f_f32i32p1i8i64i32f(i64 immarg, i32 immarg, float (i32, i8 addrspace(1)*, i64, i32)*, i32 immarg, i32 immarg, ...) + + declare token @llvm.experimental.gc.statepoint.p0f_i32i32p1i8i32i32i32f(i64 immarg, i32 immarg, i32 (i32, i8 addrspace(1)*, i32, i32, i32)*, i32 immarg, i32 immarg, ...) + + declare i8 addrspace(1)* @wombat(i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)*) + + attributes #0 = { nounwind readnone } + +... +--- +name: hoge +alignment: 16 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +failedISel: false +tracksRegLiveness: true +hasWinCFI: false +registers: + - { id: 0, class: gr64, preferred-register: '' } + - { id: 1, class: gr32, preferred-register: '' } + - { id: 2, class: gr32, preferred-register: '' } + - { id: 3, class: gr32, preferred-register: '' } + - { id: 4, class: gr32, preferred-register: '' } + - { id: 5, class: gr64, preferred-register: '' } + - { id: 6, class: gr64, preferred-register: '' } + - { id: 7, class: gr64, preferred-register: '' } + - { id: 8, class: gr64, preferred-register: '' } + - { id: 9, class: gr64, preferred-register: '' } + - { id: 10, class: gr64, preferred-register: '' } + - { id: 11, class: gr64, preferred-register: '' } + - { id: 12, class: gr64, preferred-register: '' } + - { id: 13, class: gr64, preferred-register: '' } + - { id: 14, class: gr64, preferred-register: '' } + - { id: 15, class: gr64, preferred-register: '' } + - { id: 16, class: gr64, preferred-register: '' } + - { id: 17, class: gr64, preferred-register: '' } + - { id: 18, class: gr64, preferred-register: '' } + - { id: 19, class: gr64, preferred-register: '' } + - { id: 20, class: gr64, preferred-register: '' } + - { id: 21, class: gr64, preferred-register: '' } + - { id: 22, class: gr64, preferred-register: '' } + - { id: 23, class: gr64, preferred-register: '' } + - { id: 24, class: gr64, preferred-register: '' } + - { id: 25, class: gr64, preferred-register: '' } + - { id: 26, class: gr64, preferred-register: '' } + - { id: 27, class: gr64, preferred-register: '' } + - { id: 28, class: gr64, preferred-register: '' } + - { id: 29, class: gr64, preferred-register: '' } + - { id: 30, class: gr64, preferred-register: '' } + - { id: 31, class: gr32, preferred-register: '' } + - { id: 32, class: gr8, preferred-register: '' } + - { id: 33, class: gr32, preferred-register: '' } + - { id: 34, class: gr64, preferred-register: '' } + - { id: 35, class: gr64, preferred-register: '' } + - { id: 36, class: gr64, preferred-register: '' } + - { id: 37, class: gr64, preferred-register: '' } + - { id: 38, class: gr64, preferred-register: '' } + - { id: 39, class: gr64, preferred-register: '' } + - { id: 40, class: gr64, preferred-register: '' } + - { id: 41, class: gr64, preferred-register: '' } + - { id: 42, class: gr64, preferred-register: '' } + - { id: 43, class: gr64, preferred-register: '' } + - { id: 44, class: gr64, preferred-register: '' } + - { id: 45, class: gr64, preferred-register: '' } + - { id: 46, class: gr64, preferred-register: '' } + - { id: 47, class: gr64, preferred-register: '' } + - { id: 48, class: gr64, preferred-register: '' } + - { id: 49, class: gr64, preferred-register: '' } + - { id: 50, class: gr64, preferred-register: '' } + - { id: 51, class: gr64, preferred-register: '' } + - { id: 52, class: gr32, preferred-register: '' } + - { id: 53, class: gr64, preferred-register: '' } + - { id: 54, class: gr32, preferred-register: '' } + - { id: 55, class: gr64, preferred-register: '' } + - { id: 56, class: gr64, preferred-register: '' } + - { id: 57, class: gr64, preferred-register: '' } + - { id: 58, class: gr32, preferred-register: '' } + - { id: 59, class: gr64, preferred-register: '' } + - { id: 60, class: fr32, preferred-register: '' } + - { id: 61, class: gr64, preferred-register: '' } + - { id: 62, class: gr64, preferred-register: '' } + - { id: 63, class: gr64, preferred-register: '' } + - { id: 64, class: gr64, preferred-register: '' } + - { id: 65, class: gr64, preferred-register: '' } + - { id: 66, class: gr64, preferred-register: '' } + - { id: 67, class: gr64, preferred-register: '' } + - { id: 68, class: gr32, preferred-register: '' } + - { id: 69, class: gr32, preferred-register: '' } + - { id: 70, class: gr64, preferred-register: '' } + - { id: 71, class: gr64, preferred-register: '' } + - { id: 72, class: gr32, preferred-register: '' } + - { id: 73, class: gr64, preferred-register: '' } + - { id: 74, class: gr64, preferred-register: '' } + - { id: 75, class: gr64, preferred-register: '' } + - { id: 76, class: gr64, preferred-register: '' } + - { id: 77, class: gr64, preferred-register: '' } + - { id: 78, class: gr64, preferred-register: '' } + - { id: 79, class: gr32, preferred-register: '' } + - { id: 80, class: gr32, preferred-register: '' } + - { id: 81, class: gr64, preferred-register: '' } + - { id: 82, class: gr32, preferred-register: '' } + - { id: 83, class: gr64, preferred-register: '' } + - { id: 84, class: gr64, preferred-register: '' } + - { id: 85, class: gr64, preferred-register: '' } + - { id: 86, class: gr32, preferred-register: '' } + - { id: 87, class: gr8, preferred-register: '' } + - { id: 88, class: gr32, preferred-register: '' } + - { id: 89, class: gr8, preferred-register: '' } + - { id: 90, class: gr32, preferred-register: '' } + - { id: 91, class: gr32, preferred-register: '' } + - { id: 92, class: gr32, preferred-register: '' } + - { id: 93, class: gr64, preferred-register: '' } + - { id: 94, class: gr64, preferred-register: '' } + - { id: 95, class: gr64, preferred-register: '' } + - { id: 96, class: gr64, preferred-register: '' } + - { id: 97, class: gr32, preferred-register: '' } + - { id: 98, class: gr64, preferred-register: '' } + - { id: 99, class: gr64, preferred-register: '' } + - { id: 100, class: gr64, preferred-register: '' } + - { id: 101, class: gr32, preferred-register: '' } + - { id: 102, class: gr64, preferred-register: '' } + - { id: 103, class: gr64, preferred-register: '' } + - { id: 104, class: gr64, preferred-register: '' } + - { id: 105, class: gr32, preferred-register: '' } + - { id: 106, class: gr32, preferred-register: '' } + - { id: 107, class: gr32, preferred-register: '' } + - { id: 108, class: gr64, preferred-register: '' } + - { id: 109, class: gr64, preferred-register: '' } + - { id: 110, class: gr32, preferred-register: '' } + - { id: 111, class: gr64, preferred-register: '' } + - { id: 112, class: gr64, preferred-register: '' } + - { id: 113, class: gr64, preferred-register: '' } + - { id: 114, class: gr64, preferred-register: '' } + - { id: 115, class: gr32, preferred-register: '' } + - { id: 116, class: gr32, preferred-register: '' } + - { id: 117, class: gr64, preferred-register: '' } + - { id: 118, class: gr32, preferred-register: '' } + - { id: 119, class: gr32, preferred-register: '' } + - { id: 120, class: gr64, preferred-register: '' } + - { id: 121, class: gr64, preferred-register: '' } + - { id: 122, class: gr32, preferred-register: '' } + - { id: 123, class: gr64, preferred-register: '' } + - { id: 124, class: gr64, preferred-register: '' } + - { id: 125, class: gr64, preferred-register: '' } + - { id: 126, class: gr64, preferred-register: '' } + - { id: 127, class: gr64, preferred-register: '' } + - { id: 128, class: gr32, preferred-register: '' } + - { id: 129, class: gr8, preferred-register: '' } + - { id: 130, class: gr64, preferred-register: '' } + - { id: 131, class: gr64, preferred-register: '' } + - { id: 132, class: gr32, preferred-register: '' } + - { id: 133, class: gr64, preferred-register: '' } + - { id: 134, class: gr32, preferred-register: '' } + - { id: 135, class: gr32, preferred-register: '' } + - { id: 136, class: gr32, preferred-register: '' } + - { id: 137, class: gr64, preferred-register: '' } + - { id: 138, class: gr32, preferred-register: '' } + - { id: 139, class: gr64, preferred-register: '' } + - { id: 140, class: gr64, preferred-register: '' } + - { id: 141, class: gr32, preferred-register: '' } + - { id: 142, class: gr64, preferred-register: '' } + - { id: 143, class: gr64, preferred-register: '' } + - { id: 144, class: gr64, preferred-register: '' } + - { id: 145, class: gr64, preferred-register: '' } + - { id: 146, class: gr32, preferred-register: '' } + - { id: 147, class: gr32, preferred-register: '' } + - { id: 148, class: gr32, preferred-register: '' } + - { id: 149, class: gr32, preferred-register: '' } + - { id: 150, class: gr64, preferred-register: '' } + - { id: 151, class: gr64, preferred-register: '' } + - { id: 152, class: gr64, preferred-register: '' } + - { id: 153, class: gr64, preferred-register: '' } + - { id: 154, class: gr32, preferred-register: '' } + - { id: 155, class: gr64, preferred-register: '' } + - { id: 156, class: gr64, preferred-register: '' } + - { id: 157, class: gr64, preferred-register: '' } + - { id: 158, class: gr64, preferred-register: '' } + - { id: 159, class: fr32, preferred-register: '' } + - { id: 160, class: gr32, preferred-register: '' } + - { id: 161, class: gr32, preferred-register: '' } + - { id: 162, class: gr64, preferred-register: '' } + - { id: 163, class: gr64, preferred-register: '' } + - { id: 164, class: gr64, preferred-register: '' } + - { id: 165, class: gr64, preferred-register: '' } + - { id: 166, class: gr64, preferred-register: '' } +liveins: [] +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 1 + adjustsStack: false + hasCalls: true + stackProtector: '' + maxCallFrameSize: 4294967295 + cvBytesOfCalleeSavedRegisters: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false + hasTailCall: false + localFrameSize: 0 + savePoint: '' + restorePoint: '' +fixedStack: [] +stack: [] +callSites: [] +debugValueSubstitutions: [] +constants: [] +machineFunctionInfo: {} +body: | + bb.0.bb: + successors: %bb.1(0x80000000), %bb.21(0x00000000) + + %0:gr64 = MOV64rm $noreg, 1, $noreg, 0, $noreg :: (load 8 from `i8 addrspace(1)* addrspace(3)* null`, addrspace 3) + %2:gr32 = MOV32rm undef %29:gr64, 1, $noreg, 0, $noreg :: (load 4 from `i32 addrspace(3)* undef`, addrspace 3) + %1:gr32 = COPY %2 + %4:gr32 = MOV32rm $noreg, 1, $noreg, 0, $noreg :: (load 4 from `i32 addrspace(3)* null`, addrspace 3) + %3:gr32 = COPY %4 + %9:gr64 = MOV64rm undef %30:gr64, 1, $noreg, 0, $noreg :: (load 8 from `i8 addrspace(1)* addrspace(3)* undef`, addrspace 3) + %5:gr64 = COPY %9 + %31:gr32 = MOV32r0 implicit-def dead $eflags + %32:gr8 = COPY killed %31.sub_8bit + TEST8rr killed %32, %32, implicit-def $eflags + JCC_1 %bb.21, 5, implicit killed $eflags + JMP_1 %bb.1 + + bb.1.bb12: + successors: %bb.2(0x80000000), %bb.16(0x00000000) + + %52:gr32 = MOV32rm undef %53:gr64, 1, $noreg, 0, $noreg :: (load unordered 4 from `i32 addrspace(1)* undef`, addrspace 1) + %54:gr32 = COPY killed %52 + %54:gr32 = AND32ri %54, 33554431, implicit-def dead $eflags + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %55:gr64 = COPY killed %0 + %43:gr64 = COPY killed %9 + %42:gr64 = COPY %5 + %44:gr64 = COPY %5 + %45:gr64 = COPY %5 + %56:gr64 = COPY killed %5 + %40:gr64, %41:gr64, %42:gr64, %43:gr64, %44:gr64, %45:gr64, dead %55:gr64, dead %56:gr64 = STATEPOINT 2882400000, 0, 0, target-flags(x86-plt) @barney, 2, 0, 2, 0, 2, 45, 2, 0, 2, 1, 2, 0, 2, 83, 2, 0, 2, 19, 2, 0, 2, 0, %55, 2, 3, %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %56, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %56, 2, 0, %56, 2, 0, %56, 2, 0, %43, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 8, undef %40(tied-def 0), undef %41(tied-def 1), %42(tied-def 2), %43(tied-def 3), %44(tied-def 4), %45(tied-def 5), %55(tied-def 6), %56(tied-def 7), 2, 0, 2, 8, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %57:gr64 = MOV64ri32 -170 + $edi = COPY killed %54 + $rsi = COPY %45 + $rdx = COPY killed %57 + %51:gr64 = COPY killed %45 + %46:gr64 = COPY killed %40 + %48:gr64 = COPY killed %42 + %50:gr64 = COPY killed %44 + %47:gr64 = COPY killed %41 + %49:gr64 = COPY killed %43 + %46:gr64, %47:gr64, %48:gr64, %49:gr64, %50:gr64, %51:gr64 = STATEPOINT 1, 16, 4, undef %59:gr64, killed $edi, killed $rsi, killed $rdx, undef $ecx, 2, 0, 2, 0, 2, 47, 2, 0, 2, 0, 2, 0, 2, 103, 2, 1, 2, 19, 2, 0, 2, 3, 2, 4278124286, 2, 0, 2, 0, 2, 3, %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %48, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %51, 2, 0, %50, 2, 0, 2, 4278124286, 2, 0, %49, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 8, %46(tied-def 0), %47(tied-def 1), %48(tied-def 2), %49(tied-def 3), %50(tied-def 4), %51(tied-def 5), 2, 0, 2, 4278124286, 2, 0, 2, 8, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $xmm0 + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.2 + + bb.2.bb23: + successors: %bb.11(0x80000000), %bb.13(0x00000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rsi = COPY %49 + $ecx = COPY %4 + $r8d = COPY %4 + %64:gr64 = COPY killed %47 + %65:gr64 = COPY killed %49 + %66:gr64 = COPY killed %51 + %63:gr64 = COPY killed %46 + %67:gr64 = COPY killed %48 + %70:gr64 = COPY killed %50 + dead %63:gr64, %64:gr64, %65:gr64, %66:gr64, %67:gr64, dead %70:gr64 = STATEPOINT 1, 16, 5, undef %71:gr64, undef $edi, killed $rsi, undef $edx, killed $ecx, killed $r8d, 2, 0, 2, 0, 2, 53, 2, 0, 2, 8, 2, 0, 2, 153, 2, 4, 2, 19, 2, 0, 2, 4, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 0, 2, 3, %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %67, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %66, 2, 0, %70, 2, 0, 2, 4278124286, 2, 0, %65, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 8, %63(tied-def 0), %64(tied-def 1), %65(tied-def 2), %66(tied-def 3), %67(tied-def 4), 2, 4278124286, 2, 0, %70(tied-def 5), 2, 0, 2, 8, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.11 + + bb.3.bb31: + successors: %bb.4(0x00000000), %bb.17(0x80000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rsi = COPY %76 + $edx = COPY %4 + %93:gr64 = COPY killed %78 + %94:gr64 = COPY killed %77 + %95:gr64 = COPY killed %76 + dead %93:gr64, dead %94:gr64, dead %95:gr64 = STATEPOINT 1, 16, 5, undef %96:gr64, undef $edi, killed $rsi, killed $edx, undef $ecx, undef $r8d, 2, 0, 2, 0, 2, 49, 2, 0, 2, 0, 2, 0, 2, 537, 2, 2, 2, 19, 2, 0, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 0, 2, 3, 2, 4278124286, 2, 3, killed %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %4, 2, 3, 2, 1, 2, 3, 2, 4278124286, 2, 0, %93, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %94, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, %95, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 5, 2, 4278124286, 2, 0, %93(tied-def 0), %94(tied-def 1), %95(tied-def 2), 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.4 + + bb.4.bb33: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %101:gr32 = MOV32ri 15 + $edi = COPY killed %101 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, killed $edi, 2, 0, 2, 0, 2, 51, 2, 0, 2, 2, 2, 0, 2, 591, 2, 0, 2, 19, 2, 0, 2, 7, 2, 0, 2, 3, 2, 4278124286, 2, 3, 2, 63, 2, 3, killed %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, killed %4, 2, 3, 2, 1, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 1, 2, 16, 2, 0, 2, 0, 2, 0, 2, 1, 2, 4278124286, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.5.bb35: + successors: %bb.6(0x40000000), %bb.18(0x40000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rsi = COPY %76 + $edx = COPY killed %4 + %103:gr64 = COPY killed %78 + %102:gr64 = COPY killed %75 + %108:gr64 = COPY killed %77 + %104:gr64 = COPY killed %76 + %102:gr64, %103:gr64, %104:gr64, dead %108:gr64 = STATEPOINT 1, 16, 5, undef %109:gr64, undef $edi, killed $rsi, killed $edx, undef $ecx, undef $r8d, 2, 0, 2, 0, 2, 49, 2, 0, 2, 8, 2, 0, 2, 300, 2, 2, 2, 19, 2, 0, 2, 0, %104, 2, 3, 2, 4278124286, 2, 0, 2, 0, 2, 3, %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %103, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %108, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, %104, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 6, %102(tied-def 0), %103(tied-def 1), %104(tied-def 2), 2, 0, %108(tied-def 3), 2, 4278124286, 2, 0, 2, 6, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.6 + + bb.6.bb37: + successors: %bb.7(0x40000000), %bb.19(0x40000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %115:gr32 = MOV32ri -7122 + $r8d = COPY killed %115 + %120:gr64 = COPY killed %103 + %114:gr64 = COPY killed %102 + %114:gr64, dead %120:gr64 = STATEPOINT 1, 16, 5, undef %121:gr64, undef $edi, undef $rsi, undef $edx, undef $ecx, killed $r8d, 2, 0, 2, 0, 2, 45, 2, 0, 2, 8, 2, 0, 2, 308, 2, 0, 2, 19, 2, 0, 2, 0, 2, 0, 2, 3, killed %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %120, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 4, %114(tied-def 0), 2, 0, %120(tied-def 1), 2, 4278124286, 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.7 + + bb.7.bb41: + successors: %bb.9(0x40000000), %bb.8(0x40000000) + + %12:gr64 = COPY %114 + %126:gr64 = MOV64rm %114, 1, $noreg, 904, $noreg :: (load unordered 8 from %ir.tmp44, addrspace 1) + %127:gr64 = COPY killed %126 + dead %127:gr64 = NEG64r %127, implicit-def $eflags + %14:gr64 = SETB_C64r implicit-def dead $eflags, implicit killed $eflags + %128:gr32 = MOV32r0 implicit-def dead $eflags + %129:gr8 = COPY killed %128.sub_8bit + TEST8rr killed %129, %129, implicit-def $eflags + JCC_1 %bb.9, 5, implicit killed $eflags + JMP_1 %bb.8 + + bb.8.bb50: + successors: %bb.9(0x80000000) + + %13:gr64 = COPY killed %114 + %13:gr64 = nuw ADD64ri32 %13, 904, implicit-def dead $eflags + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rdi = COPY killed %14 + $rsi = COPY killed %13 + CALL64pcrel32 target-flags(x86-plt) @wombat, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit killed $rsi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.9.bb52: + successors: %bb.10(0x00000000), %bb.20(0x80000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %131:gr64 = COPY killed %12 + %131:gr64 = STATEPOINT 1, 16, 5, undef %137:gr64, undef $edi, undef $rsi, undef $edx, undef $ecx, undef $r8d, 2, 0, 2, 0, 2, 49, 2, 0, 2, 0, 2, 0, 2, 335, 2, 2, 2, 19, 2, 0, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 2, %131(tied-def 0), 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.10 + + bb.10.bb54: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %141:gr32 = MOV32ri 10 + $edi = COPY killed %141 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, killed $edi, 2, 0, 2, 2, 2, 53, 2, 0, 2, 1, 2, 0, 2, 344, 2, 4, 2, 19, 2, 0, 2, 0, 2, 0, 2, 3, 2, 4278124286, 2, 4, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, killed %2, 2, 3, killed %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 2, 2, 0, 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.11.bb56: + successors: %bb.12(0x00000000), %bb.14(0x80000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %79:gr32 = MOV32ri 7 + $rsi = COPY %65 + $edx = COPY %1 + $ecx = COPY killed %79 + $r8d = COPY %3 + %75:gr64 = COPY killed %64 + %77:gr64 = COPY killed %66 + %76:gr64 = COPY killed %65 + %78:gr64 = COPY killed %67 + %75:gr64, %76:gr64, %77:gr64, %78:gr64 = STATEPOINT 1, 16, 5, undef %81:gr64, undef $edi, killed $rsi, killed $edx, killed $ecx, killed $r8d, 2, 0, 2, 0, 2, 53, 2, 0, 2, 8, 2, 0, 2, 208, 2, 4, 2, 19, 2, 0, 2, 0, %78, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 0, 2, 0, 2, 0, 2, 3, %1, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %78, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %77, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, %76, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 6, %75(tied-def 0), %76(tied-def 1), %77(tied-def 2), %78(tied-def 3), 2, 0, 2, 4278124286, 2, 0, 2, 6, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.12 + + bb.12.bb63: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %161:gr32 = MOV32ri 10 + $edi = COPY killed %161 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, killed $edi, 2, 0, 2, 2, 2, 61, 2, 0, 2, 9, 2, 0, 2, 215, 2, 8, 2, 19, 2, 0, 2, 0, 2, 0, 2, 7, 2, 4278124286, 2, 7, 2, 4278124286, 2, 7, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 0, 2, 4, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 0, 2, 3, killed %1, 2, 3, killed %2, 2, 3, killed %3, 2, 3, 2, 2, 2, 3, 2, 4278124286, 2, 3, killed %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 2, 2, 0, 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.13.bb65 (landing-pad): + successors: + liveins: $rax, $rdx + + EH_LABEL + + bb.14.bb67 (landing-pad): + successors: %bb.3(0x2aaaaaab), %bb.15(0x55555555) + liveins: $rax, $rdx + + EH_LABEL + %86:gr32 = MOV32r0 implicit-def dead $eflags + %87:gr8 = COPY killed %86.sub_8bit + TEST8rr killed %87, %87, implicit-def $eflags + JCC_1 %bb.3, 5, implicit killed $eflags + JMP_1 %bb.15 + + bb.15.bb67: + successors: %bb.5(0x40000001), %bb.26(0x3fffffff) + + %88:gr32 = MOV32r0 implicit-def dead $eflags + %89:gr8 = COPY killed %88.sub_8bit + TEST8rr killed %89, %89, implicit-def $eflags + JCC_1 %bb.5, 5, implicit killed $eflags + + bb.26: + successors: %bb.23(0x80000000) + + %163:gr64 = COPY killed %75 + %164:gr64 = COPY killed %76 + %165:gr64 = COPY killed %78 + %166:gr64 = IMPLICIT_DEF + JMP_1 %bb.23 + + bb.16.bb75 (landing-pad): + successors: + liveins: $rax, $rdx + + EH_LABEL + + bb.17.bb77 (landing-pad): + successors: %bb.22(0x80000000) + liveins: $rax, $rdx + + EH_LABEL + %162:gr64 = IMPLICIT_DEF + JMP_1 %bb.22 + + bb.18.bb79 (landing-pad): + successors: %bb.23(0x80000000) + liveins: $rax, $rdx + + EH_LABEL + %19:gr64 = COPY killed %104 + %20:gr64 = MOV64rm $noreg, 1, $noreg, 8, $gs :: (load 8 from `i8 addrspace(1)* addrspace(256)* inttoptr (i64 8 to i8 addrspace(1)* addrspace(256)*)`, addrspace 256) + %163:gr64 = IMPLICIT_DEF + %164:gr64 = COPY killed %19 + %165:gr64 = IMPLICIT_DEF + %166:gr64 = COPY killed %20 + JMP_1 %bb.23 + + bb.19.bb85 (landing-pad): + successors: %bb.23(0x80000000) + liveins: $rax, $rdx + + EH_LABEL + %21:gr64 = COPY killed %114 + %163:gr64 = COPY killed %21 + %164:gr64 = IMPLICIT_DEF + %165:gr64 = IMPLICIT_DEF + %166:gr64 = IMPLICIT_DEF + JMP_1 %bb.23 + + bb.20.bb90 (landing-pad): + successors: %bb.22(0x80000000) + liveins: $rax, $rdx + + EH_LABEL + %22:gr64 = COPY killed %131 + %162:gr64 = COPY killed %22 + JMP_1 %bb.22 + + bb.21.bb93: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %33:gr32 = MOV32ri 14 + $edi = COPY killed %33 + %36:gr64 = COPY killed %0 + %39:gr64 = COPY killed %9 + %34:gr64 = COPY %5 + %35:gr64 = COPY %5 + %37:gr64 = COPY %5 + %38:gr64 = COPY killed %5 + dead %34:gr64, dead %35:gr64, dead %36:gr64, dead %37:gr64, dead %38:gr64, dead %39:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, killed $edi, 2, 0, 2, 2, 2, 53, 2, 0, 2, 1, 2, 0, 2, 94, 2, 4, 2, 19, 2, 0, 2, 3, 2, 4278124286, 2, 0, %38, 2, 0, %38, 2, 3, 2, -170, 2, 0, %36, 2, 3, killed %1, 2, 3, killed %2, 2, 3, killed %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, killed %4, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %38, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %38, 2, 0, %38, 2, 0, %38, 2, 0, %39, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 6, %34(tied-def 0), %35(tied-def 1), %36(tied-def 2), %37(tied-def 3), %38(tied-def 4), %39(tied-def 5), 2, 0, 2, 6, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.22.bb95: + %23:gr64 = COPY killed %162 + MOV64mr killed %23, 1, $noreg, 928, $noreg, undef %158:gr64 :: (store unordered 8 into %ir.tmp98, addrspace 1) + RET 0, undef $xmm0 + + bb.23.bb99: + successors: %bb.24(0x00000000), %bb.25(0x80000000) + + %27:gr64 = COPY killed %166 + %26:gr64 = COPY killed %165 + %25:gr64 = COPY killed %164 + %24:gr64 = COPY killed %163 + %143:gr64 = MOV64rm %24, 1, $noreg, 904, $noreg :: (load unordered 8 from %ir.1, addrspace 1) + %144:gr64 = COPY killed %143 + dead %144:gr64 = NEG64r %144, implicit-def $eflags + %145:gr64 = SETB_C64r implicit-def dead $eflags, implicit killed $eflags + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rsi = COPY killed %25 + %151:gr64 = COPY killed %26 + %152:gr64 = COPY killed %27 + %150:gr64 = COPY killed %145 + %142:gr64 = COPY killed %24 + dead %142:gr64, dead %150:gr64, dead %151:gr64, dead %152:gr64 = STATEPOINT 1, 16, 5, undef %153:gr64, undef $edi, killed $rsi, undef $edx, undef $ecx, undef $r8d, 2, 0, 2, 0, 2, 49, 2, 0, 2, 0, 2, 0, 2, 572, 2, 2, 2, 19, 2, 0, 2, 0, %150, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 3, 2, 4278124286, 2, 3, %2, 2, 3, %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, %151, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %152, 2, 7, 2, 0, 2, 4, %142(tied-def 0), %150(tied-def 1), %151(tied-def 2), %152(tied-def 3), 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def dead $eax + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.24 + + bb.24.bb111: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %160:gr32 = MOV32ri 10 + $edi = COPY killed %160 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, killed $edi, 2, 0, 2, 2, 2, 53, 2, 0, 2, 1, 2, 0, 2, 581, 2, 4, 2, 19, 2, 0, 2, 0, 2, 0, 2, 3, 2, 4278124286, 2, 4, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 3, 2, 4278124286, 2, 3, killed %2, 2, 3, killed %3, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 2, 2, 0, 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.25.bb114 (landing-pad): + successors: %bb.22(0x80000000) + liveins: $rax, $rdx + + EH_LABEL + %162:gr64 = IMPLICIT_DEF + JMP_1 %bb.22 + +... Index: llvm/test/CodeGen/X86/statepoint-invoke-ra-inline-spiller.mir =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/statepoint-invoke-ra-inline-spiller.mir @@ -0,0 +1,404 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# REQUIRES: asserts +# RUN: llc -x mir -run-pass=simple-register-coalescing,greedy -verify-machineinstrs < %s | FileCheck %s + +## Check that Inline Spiller cannot insert spill after last insertion point. +# CHECK-NOT: Unexpected VNI + +--- | + ; ModuleID = 'inline-spiller' + source_filename = "inline-spiller.ll" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" + + define void @hoge() gc "statepoint-example" personality i32* ()* @widget { + bb: + %tmp = call token (i64, i32, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 2, i32 5, void (i8 addrspace(1)*, i8 addrspace(1)*)* nonnull @quux, i32 2, i32 0, i8 addrspace(1)* nonnull null, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 6, i32 0, i32 4, i32 1, i32 0, i8 addrspace(1)* null, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 2, i32 4, i32 5, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* undef) ] + br label %bb1 + + bb1: ; preds = %bb21, %bb + %tmp2 = phi i32 addrspace(1)* [ undef, %bb ], [ %tmp22, %bb21 ] + %tmp3 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp23, %bb21 ] + %tmp4 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp24, %bb21 ] + %tmp5 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp25, %bb21 ] + %tmp6 = phi i8 addrspace(1)* [ null, %bb ], [ %tmp26, %bb21 ] + %tmp7 = phi i32 [ 0, %bb ], [ %tmp13, %bb21 ] + %tmp8 = load atomic i32, i32 addrspace(1)* undef unordered, align 8 + %tmp9 = load atomic i32, i32 addrspace(1)* %tmp2 unordered, align 4 + %tmp10 = sub i32 %tmp8, %tmp9 + %tmp11 = icmp slt i32 %tmp10, undef + %tmp12 = select i1 %tmp11, i32 %tmp10, i32 undef + %tmp13 = add i32 %tmp12, %tmp7 + %tmp14 = call token (i64, i32, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i32i32p1i8i32f(i64 2, i32 5, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)* nonnull @hoge.1, i32 5, i32 0, i8 addrspace(1)* %tmp4, i32 %tmp7, i32 %tmp13, i8 addrspace(1)* undef, i32 %tmp9, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp6, i32 0, i8 addrspace(1)* %tmp6, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 63, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* %tmp5, i32 0, i8 addrspace(1)* %tmp4, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp3, i32 3, i32 %tmp7, i32 3, i32 undef, i32 3, i32 %tmp12, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp3), "gc-live"(i8 addrspace(1)* %tmp6, i8 addrspace(1)* %tmp5, i8 addrspace(1)* %tmp4, i8 addrspace(1)* %tmp3) ] + %tmp15 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 0, i32 0) ; (%tmp6, %tmp6) + %tmp16 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 1, i32 1) ; (%tmp5, %tmp5) + %tmp17 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 2, i32 2) ; (%tmp4, %tmp4) + %tmp18 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 3, i32 3) ; (%tmp3, %tmp3) + %tmp19 = add i32 0, %tmp12 + %tmp20 = icmp slt i32 %tmp19, undef + br i1 %tmp20, label %bb21, label %bb28 + + bb21: ; preds = %bb30, %bb1 + %tmp22 = phi i32 addrspace(1)* [ undef, %bb1 ], [ %tmp34, %bb30 ] + %tmp23 = phi i8 addrspace(1)* [ %tmp18, %bb1 ], [ undef, %bb30 ] + %tmp24 = phi i8 addrspace(1)* [ %tmp17, %bb1 ], [ undef, %bb30 ] + %tmp25 = phi i8 addrspace(1)* [ %tmp16, %bb1 ], [ %tmp32, %bb30 ] + %tmp26 = phi i8 addrspace(1)* [ %tmp15, %bb1 ], [ %tmp31, %bb30 ] + br label %bb1 + + bb28: ; preds = %bb1 + %tmp29 = invoke token (i64, i32, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 1, i32 16, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)* nonnull @ham, i32 5, i32 0, i32 undef, i8 addrspace(1)* nonnull undef, i8 addrspace(1)* undef, i32 0, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp15, i32 0, i8 addrspace(1)* %tmp15, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* %tmp16, i32 0, i8 addrspace(1)* %tmp17, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp18, i32 3, i32 %tmp13, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp18, i32 8, i32 12, i32 34, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp16, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef), "gc-live"(i8 addrspace(1)* %tmp15, i8 addrspace(1)* %tmp16, i8 addrspace(1)* %tmp17, i8 addrspace(1)* %tmp18, i8 addrspace(1)* undef) ] + to label %bb30 unwind label %bb35 + + bb30: ; preds = %bb28 + %tmp31 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 0, i32 0) ; (%tmp15, %tmp15) + %tmp32 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 1, i32 1) ; (%tmp16, %tmp16) + %tmp33 = getelementptr inbounds i8, i8 addrspace(1)* %tmp32, i64 28 + %tmp34 = bitcast i8 addrspace(1)* %tmp33 to i32 addrspace(1)* + call void @barney() #2 + br label %bb21 + + bb35: ; preds = %bb28 + %tmp36 = landingpad token + cleanup + %tmp37 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 0, i32 0) ; (%tmp15, %tmp15) + %tmp38 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 3, i32 3) ; (%tmp18, %tmp18) + %tmp39 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @wombat, i32 1, i32 2, i32 3, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp37, i32 0, i8 addrspace(1)* %tmp37, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp38, i32 3, i32 %tmp13, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp38, i32 0, i32 12, i32 51, i32 0, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + } + + ; Function Attrs: willreturn + declare i32* @widget() #0 + + declare void @quux(i8 addrspace(1)*, i8 addrspace(1)*) + + declare void @hoge.1(i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32) + + ; Function Attrs: willreturn + declare void @barney() #0 + + declare void @ham(i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32) + + declare void @wombat(i32) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 immarg, i32 immarg, void (i32)*, i32 immarg, i32 immarg, ...) + + ; Function Attrs: nounwind readnone + declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32 immarg, i32 immarg) #1 + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 immarg, i32 immarg, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32 immarg, i32 immarg, ...) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i32i32p1i8i32f(i64 immarg, i32 immarg, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)*, i32 immarg, i32 immarg, ...) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 immarg, i32 immarg, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32 immarg, i32 immarg, ...) + + attributes #0 = { willreturn } + attributes #1 = { nounwind readnone } + attributes #2 = { nounwind } + +... +--- +name: hoge +alignment: 16 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +failedISel: false +tracksRegLiveness: true +hasWinCFI: false +registers: + - { id: 0, class: gr64, preferred-register: '' } + - { id: 1, class: gr64, preferred-register: '' } + - { id: 2, class: gr64, preferred-register: '' } + - { id: 3, class: gr64, preferred-register: '' } + - { id: 4, class: gr64, preferred-register: '' } + - { id: 5, class: gr32, preferred-register: '' } + - { id: 6, class: gr32, preferred-register: '' } + - { id: 7, class: gr64, preferred-register: '' } + - { id: 8, class: gr64, preferred-register: '' } + - { id: 9, class: gr64, preferred-register: '' } + - { id: 10, class: gr64, preferred-register: '' } + - { id: 11, class: gr64, preferred-register: '' } + - { id: 12, class: gr64, preferred-register: '' } + - { id: 13, class: gr64, preferred-register: '' } + - { id: 14, class: gr64, preferred-register: '' } + - { id: 15, class: gr64, preferred-register: '' } + - { id: 16, class: gr64, preferred-register: '' } + - { id: 17, class: gr64, preferred-register: '' } + - { id: 18, class: gr64, preferred-register: '' } + - { id: 19, class: gr64, preferred-register: '' } + - { id: 20, class: gr64, preferred-register: '' } + - { id: 21, class: gr64, preferred-register: '' } + - { id: 22, class: gr32, preferred-register: '' } + - { id: 23, class: gr64, preferred-register: '' } + - { id: 24, class: gr64, preferred-register: '' } + - { id: 25, class: gr64, preferred-register: '' } + - { id: 26, class: gr64, preferred-register: '' } + - { id: 27, class: gr64, preferred-register: '' } + - { id: 28, class: gr64, preferred-register: '' } + - { id: 29, class: gr64, preferred-register: '' } + - { id: 30, class: gr32, preferred-register: '' } + - { id: 31, class: gr64, preferred-register: '' } + - { id: 32, class: gr32, preferred-register: '' } + - { id: 33, class: gr32, preferred-register: '' } + - { id: 34, class: gr64, preferred-register: '' } + - { id: 35, class: gr64, preferred-register: '' } + - { id: 36, class: gr32, preferred-register: '' } + - { id: 37, class: gr32, preferred-register: '' } + - { id: 38, class: gr64, preferred-register: '' } + - { id: 39, class: gr64, preferred-register: '' } + - { id: 40, class: gr64, preferred-register: '' } + - { id: 41, class: gr32, preferred-register: '' } + - { id: 42, class: gr32, preferred-register: '' } + - { id: 43, class: gr64, preferred-register: '' } + - { id: 44, class: gr64, preferred-register: '' } + - { id: 45, class: gr32, preferred-register: '' } + - { id: 46, class: gr64, preferred-register: '' } + - { id: 47, class: gr64, preferred-register: '' } + - { id: 48, class: gr64, preferred-register: '' } + - { id: 49, class: gr64, preferred-register: '' } + - { id: 50, class: gr32, preferred-register: '' } + - { id: 51, class: gr64, preferred-register: '' } + - { id: 52, class: gr64, preferred-register: '' } + - { id: 53, class: gr64, preferred-register: '' } + - { id: 54, class: gr64, preferred-register: '' } + - { id: 55, class: gr64, preferred-register: '' } + - { id: 56, class: gr64, preferred-register: '' } + - { id: 57, class: gr64, preferred-register: '' } + - { id: 58, class: gr64, preferred-register: '' } + - { id: 59, class: gr32, preferred-register: '' } + - { id: 60, class: gr64, preferred-register: '' } + - { id: 61, class: gr64, preferred-register: '' } + - { id: 62, class: gr64, preferred-register: '' } + - { id: 63, class: gr64, preferred-register: '' } + - { id: 64, class: gr64, preferred-register: '' } + - { id: 65, class: gr64, preferred-register: '' } + - { id: 66, class: gr64_nosp, preferred-register: '' } +liveins: [] +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 4 + adjustsStack: false + hasCalls: true + stackProtector: '' + maxCallFrameSize: 4294967295 + cvBytesOfCalleeSavedRegisters: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false + hasTailCall: false + localFrameSize: 0 + savePoint: '' + restorePoint: '' +fixedStack: [] +stack: + - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } + - { id: 1, name: '', type: default, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +callSites: [] +debugValueSubstitutions: [] +constants: [] +machineFunctionInfo: {} +body: | + ; CHECK-LABEL: name: hoge + ; CHECK: bb.0.bb: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: undef %75.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags + ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, %75 :: (store 8 into %stack.2) + ; CHECK: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi + ; CHECK: STATEPOINT 2, 5, 2, undef %24:gr64, $rdi, undef $rsi, 2, 0, 2, 0, 2, 37, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 2, 2, 4, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 0, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: [[DEF:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF2:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF3:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: bb.1.bb1: + ; CHECK: successors: %bb.2(0x40000000), %bb.4(0x40000000) + ; CHECK: undef %66.sub_32bit:gr64_nosp = COPY [[MOV32r0_]] + ; CHECK: undef %65.sub_32bit:gr64_with_sub_8bit = MOV32rm undef %31:gr64, 1, $noreg, 0, $noreg :: (load unordered 4 from `i32 addrspace(1)* undef`, align 8, addrspace 1) + ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[DEF]], 1, $noreg, 0, $noreg :: (load unordered 4 from %ir.tmp2, addrspace 1) + ; CHECK: %65.sub_32bit:gr64_with_sub_8bit = SUB32rr %65.sub_32bit, [[MOV32rm]], implicit-def dead $eflags + ; CHECK: [[LEA64_32r:%[0-9]+]]:gr32 = LEA64_32r %65, 1, %66, 0, $noreg + ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, %66.sub_32bit :: (store 4 into %stack.0) + ; CHECK: MOV32mr %stack.1, 1, $noreg, 0, $noreg, %65.sub_32bit :: (store 4 into %stack.1) + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $rdi = COPY [[DEF2]] + ; CHECK: $esi = COPY %66.sub_32bit + ; CHECK: $edx = COPY [[LEA64_32r]] + ; CHECK: $r8d = COPY [[MOV32rm]] + ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm %stack.2, 1, $noreg, 0, $noreg :: (load 8 from %stack.2) + ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY [[MOV64rm]] + ; CHECK: [[STATEPOINT:%[0-9]+]]:gr64, [[STATEPOINT1:%[0-9]+]]:gr64, [[STATEPOINT2:%[0-9]+]]:gr64, [[STATEPOINT3:%[0-9]+]]:gr64 = STATEPOINT 2, 5, 5, undef %35:gr64, $rdi, $esi, $edx, undef $rcx, $r8d, 2, 0, 2, 0, 2, 85, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, [[STATEPOINT1]], 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 3, 1, 4, %stack.1, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 4, [[STATEPOINT]](tied-def 0), [[STATEPOINT1]](tied-def 1), [[STATEPOINT2]](tied-def 2), [[STATEPOINT3]](tied-def 3), 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0), (volatile load store 4 on %stack.1) + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: CMP32rr %65.sub_32bit, undef %37:gr32, implicit-def $eflags + ; CHECK: JCC_1 %bb.4, 13, implicit killed $eflags + ; CHECK: bb.2: + ; CHECK: successors: %bb.3(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY [[STATEPOINT3]] + ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, [[COPY]] :: (store 8 into %stack.2) + ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY [[LEA64_32r]] + ; CHECK: bb.3.bb21: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: JMP_1 %bb.1 + ; CHECK: bb.4.bb28: + ; CHECK: successors: %bb.5(0x80000000), %bb.6(0x00000000) + ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, [[LEA64_32r]] :: (store 4 into %stack.0) + ; CHECK: EH_LABEL + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $ecx = MOV32r0 implicit-def dead $eflags + ; CHECK: [[COPY4:%[0-9]+]]:gr32 = COPY [[LEA64_32r]] + ; CHECK: [[STATEPOINT2]]:gr64, [[STATEPOINT3]]:gr64, [[STATEPOINT]]:gr64, dead [[STATEPOINT1]]:gr64 = STATEPOINT 1, 16, 5, undef %47:gr64, undef $edi, undef $rsi, undef $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 99, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, [[STATEPOINT1]], 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 8, 2, 12, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, [[STATEPOINT2]](tied-def 0), [[STATEPOINT3]](tied-def 1), [[STATEPOINT]](tied-def 2), [[STATEPOINT1]](tied-def 3), 2, 4278124286, 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0) + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: EH_LABEL + ; CHECK: JMP_1 %bb.5 + ; CHECK: bb.5.bb30: + ; CHECK: successors: %bb.3(0x80000000) + ; CHECK: [[COPY2:%[0-9]+]]:gr64 = COPY [[STATEPOINT3]] + ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, [[COPY2]] :: (store 8 into %stack.2) + ; CHECK: [[COPY3:%[0-9]+]]:gr64 = COPY [[STATEPOINT2]] + ; CHECK: [[ADD64ri8_:%[0-9]+]]:gr64 = nuw ADD64ri8 [[ADD64ri8_]], 28, implicit-def dead $eflags + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: CALL64pcrel32 target-flags(x86-plt) @barney, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ; CHECK: [[COPY3:%[0-9]+]]:gr64 = COPY [[ADD64ri8_]] + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: [[DEF:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: JMP_1 %bb.3 + ; CHECK: bb.6.bb35 (landing-pad): + ; CHECK: liveins: $rax, $rdx + ; CHECK: EH_LABEL + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri 3 + ; CHECK: dead [[STATEPOINT3]]:gr64, dead [[DEF]]:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @wombat, $edi, 2, 0, 2, 2, 2, 97, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 3, [[COPY4]], 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 0, 2, 12, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 3, [[STATEPOINT3]](tied-def 0), 2, 4278124286, [[DEF]](tied-def 1), 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + bb.0.bb: + successors: %bb.1(0x80000000) + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %22:gr32 = MOV32r0 implicit-def dead $eflags + %21:gr64 = SUBREG_TO_REG 0, %22, %subreg.sub_32bit + $rdi = COPY %21 + STATEPOINT 2, 5, 2, undef %24:gr64, killed $rdi, undef $rsi, 2, 0, 2, 0, 2, 37, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 2, 2, 4, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 0, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %54:gr64 = IMPLICIT_DEF + %55:gr64 = IMPLICIT_DEF + %56:gr64 = IMPLICIT_DEF + %57:gr64 = IMPLICIT_DEF + %58:gr64 = COPY killed %21 + %59:gr32 = COPY %22 + + bb.1.bb1: + successors: %bb.6(0x40000000), %bb.3(0x40000000) + + %5:gr32 = COPY killed %59 + %4:gr64 = COPY killed %58 + %3:gr64 = COPY killed %57 + %2:gr64 = COPY killed %56 + %1:gr64 = COPY killed %55 + %0:gr64 = COPY killed %54 + %30:gr32 = MOV32rm undef %31:gr64, 1, $noreg, 0, $noreg :: (load unordered 4 from `i32 addrspace(1)* undef`, align 8, addrspace 1) + %32:gr32 = MOV32rm killed %0, 1, $noreg, 0, $noreg :: (load unordered 4 from %ir.tmp2, addrspace 1) + %33:gr32 = COPY killed %30 + %33:gr32 = SUB32rr %33, %32, implicit-def dead $eflags + undef %65.sub_32bit:gr64 = COPY %33 + undef %66.sub_32bit:gr64_nosp = COPY %5 + %6:gr32 = LEA64_32r killed %65, 1, killed %66, 0, $noreg + MOV32mr %stack.0, 1, $noreg, 0, $noreg, %5 :: (store 4 into %stack.0) + MOV32mr %stack.1, 1, $noreg, 0, $noreg, %33 :: (store 4 into %stack.1) + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rdi = COPY %2 + $esi = COPY killed %5 + $edx = COPY %6 + $r8d = COPY killed %32 + %26:gr64 = COPY killed %2 + %28:gr64 = COPY killed %4 + %25:gr64 = COPY killed %1 + %27:gr64 = COPY killed %3 + %25:gr64, %26:gr64, %27:gr64, %28:gr64 = STATEPOINT 2, 5, 5, undef %35:gr64, killed $rdi, killed $esi, killed $edx, undef $rcx, killed $r8d, 2, 0, 2, 0, 2, 85, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %28, 2, 7, 2, 0, 2, 0, %28, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %28, 2, 0, %28, 2, 7, 2, 0, 2, 0, %28, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, %27, 2, 0, %26, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %25, 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 3, 1, 4, %stack.1, 0, 2, 7, 2, 0, 2, 0, %25, 2, 4, %25(tied-def 0), %26(tied-def 1), %27(tied-def 2), %28(tied-def 3), 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0), (volatile load store 4 on %stack.1) + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + CMP32rr killed %33, undef %37:gr32, implicit-def $eflags + JCC_1 %bb.3, 13, implicit killed $eflags + + bb.6: + successors: %bb.2(0x80000000) + + %60:gr64 = IMPLICIT_DEF + %61:gr64 = COPY killed %25 + %62:gr64 = COPY killed %26 + %63:gr64 = COPY killed %27 + %64:gr64 = COPY killed %28 + + bb.2.bb21: + successors: %bb.1(0x80000000) + + %15:gr64 = COPY killed %64 + %14:gr64 = COPY killed %63 + %13:gr64 = COPY killed %62 + %12:gr64 = COPY killed %61 + %11:gr64 = COPY killed %60 + %54:gr64 = COPY killed %11 + %55:gr64 = COPY killed %12 + %56:gr64 = COPY killed %13 + %57:gr64 = COPY killed %14 + %58:gr64 = COPY killed %15 + %59:gr32 = COPY killed %6 + JMP_1 %bb.1 + + bb.3.bb28: + successors: %bb.4(0x80000000), %bb.5(0x00000000) + + MOV32mr %stack.0, 1, $noreg, 0, $noreg, %6 :: (store 4 into %stack.0) + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $ecx = COPY %22 + %46:gr64 = COPY killed %26 + %39:gr64 = COPY killed %28 + %40:gr64 = COPY killed %25 + %38:gr64 = COPY killed %27 + %38:gr64, %39:gr64, %40:gr64, dead %46:gr64 = STATEPOINT 1, 16, 5, undef %47:gr64, undef $edi, undef $rsi, undef $rdx, killed $ecx, undef $r8d, 2, 0, 2, 0, 2, 99, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %39, 2, 7, 2, 0, 2, 0, %39, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %39, 2, 0, %39, 2, 7, 2, 0, 2, 0, %39, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, %38, 2, 0, %46, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %40, 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %40, 2, 8, 2, 12, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, %38, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, %38(tied-def 0), %39(tied-def 1), %40(tied-def 2), %46(tied-def 3), 2, 4278124286, 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0) + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.4 + + bb.4.bb30: + successors: %bb.2(0x80000000) + + %16:gr64 = COPY killed %39 + %17:gr64 = COPY %38 + %18:gr64 = COPY killed %38 + %18:gr64 = nuw ADD64ri8 %18, 28, implicit-def dead $eflags + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + CALL64pcrel32 target-flags(x86-plt) @barney, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %60:gr64 = COPY killed %18 + %61:gr64 = IMPLICIT_DEF + %62:gr64 = IMPLICIT_DEF + %63:gr64 = COPY killed %17 + %64:gr64 = COPY killed %16 + JMP_1 %bb.2 + + bb.5.bb35 (landing-pad): + liveins: $rax, $rdx + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %50:gr32 = MOV32ri 3 + $edi = COPY killed %50 + %52:gr64 = COPY killed %40 + %51:gr64 = COPY killed %39 + dead %51:gr64, dead %52:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @wombat, killed $edi, 2, 0, 2, 2, 2, 97, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %51, 2, 7, 2, 0, 2, 0, %51, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %51, 2, 0, %51, 2, 7, 2, 0, 2, 0, %51, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %52, 2, 3, killed %6, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %52, 2, 0, 2, 12, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 3, %51(tied-def 0), 2, 4278124286, %52(tied-def 1), 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + +... Index: llvm/test/CodeGen/X86/statepoint-invoke-ra-remove-back-copies.mir =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/statepoint-invoke-ra-remove-back-copies.mir @@ -0,0 +1,604 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# REQUIRES: asserts +# RUN: llc -x mir -run-pass=greedy -verify-machineinstrs < %s 2>&1 | FileCheck %s + +# CHECK-NOT: Cannot move stop beyond start +--- | + ; ModuleID = 'remove-back-copies' + source_filename = "remove-back-copies.ll" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" + + define void @hoge(i8 addrspace(1)* %arg) gc "statepoint-example" personality i32* ()* @widget { + bb: + %tmp = call token (i64, i32, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 2, i32 5, void (i8 addrspace(1)*, i8 addrspace(1)*)* nonnull @quux, i32 2, i32 0, i8 addrspace(1)* %arg, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 6, i32 0, i32 4, i32 1, i32 0, i8 addrspace(1)* %arg, i32 7, i8* null, i32 0, i8 addrspace(1)* %arg, i32 7, i8* null, i32 0, i8 addrspace(1)* %arg, i32 2, i32 1, i32 5, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %arg) ] + %tmp1 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* undef unordered, align 8 + %tmp2 = ptrtoint i8 addrspace(1)* %tmp1 to i64 + %tmp3 = xor i64 %tmp2, -1 + %tmp4 = inttoptr i64 %tmp3 to i8 addrspace(1)* + %tmp5 = select i1 false, i8 addrspace(1)* null, i8 addrspace(1)* %tmp4 + br i1 undef, label %bb6, label %bb40 + + bb6: ; preds = %bb + br label %bb7 + + bb7: ; preds = %bb27, %bb6 + %tmp9 = phi i8 addrspace(1)* [ undef, %bb6 ], [ %tmp28, %bb27 ] + %tmp10 = phi i8 addrspace(1)* [ undef, %bb6 ], [ %tmp29, %bb27 ] + %tmp11 = phi i8 addrspace(1)* [ undef, %bb6 ], [ %tmp30, %bb27 ] + %tmp12 = phi i32 [ 0, %bb6 ], [ %tmp16, %bb27 ] + %tmp13 = load atomic i32, i32 addrspace(1)* undef unordered, align 8 + %tmp14 = sub i32 %tmp13, 0 + %tmp15 = select i1 false, i32 %tmp14, i32 undef + %tmp16 = add i32 %tmp15, %tmp12 + %tmp17 = icmp sgt i32 %tmp12, %tmp16 + %tmp18 = or i1 undef, %tmp17 + %tmp19 = or i1 undef, %tmp18 + br i1 %tmp19, label %bb41, label %bb20 + + bb20: ; preds = %bb7 + br i1 undef, label %bb27, label %bb23 + + bb23: ; preds = %bb20 + %tmp24 = invoke token (i64, i32, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 1, i32 16, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)* nonnull @barney, i32 5, i32 0, i32 undef, i8 addrspace(1)* nonnull undef, i8 addrspace(1)* null, i32 0, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp11, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp11, i32 10, i32 2, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp11, i32 0, i8 addrspace(1)* %tmp11, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp11, i32 2, i32 8, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 12, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 18, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* %tmp10, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp9, i32 3, i32 %tmp16, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp9, i32 8, i32 9, i32 34, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp10, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef), "gc-live"(i8 addrspace(1)* %tmp11, i8 addrspace(1)* %tmp9, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp10, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp5) ] + to label %bb25 unwind label %bb35 + + bb25: ; preds = %bb23 + %tmp26 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp24, i32 5, i32 5) ; (%tmp5, %tmp5) + br label %bb27 + + bb27: ; preds = %bb25, %bb20 + %tmp28 = phi i8 addrspace(1)* [ %tmp9, %bb20 ], [ undef, %bb25 ] + %tmp29 = phi i8 addrspace(1)* [ %tmp10, %bb20 ], [ undef, %bb25 ] + %tmp30 = phi i8 addrspace(1)* [ %tmp11, %bb20 ], [ null, %bb25 ] + %tmp34 = icmp sgt i32 0, %tmp16 + br i1 %tmp34, label %bb7, label %bb44 + + bb35: ; preds = %bb23 + %tmp36 = landingpad token + cleanup + br i1 undef, label %bb39, label %bb37 + + bb37: ; preds = %bb35 + %tmp38 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 3, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 10, i32 2, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 2, i32 8, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 12, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 18, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, i32 %tmp16, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 0, i32 9, i32 51, i32 0, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb39: ; preds = %bb35 + unreachable + + bb40: ; preds = %bb + call void @wombat() + br label %bb41 + + bb41: ; preds = %bb7, %bb40 + %tmp42 = phi i32 [ 0, %bb40 ], [ %tmp12, %bb7 ] + %tmp43 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 -39, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 10, i32 2, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 2, i32 8, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 12, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 18, i32 63, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 3, i32 %tmp42, i32 3, i32 0, i32 3, i32 undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef, i32 2, i32 33, i32 6, i32 0, i32 5, i32 0, i32 0, i8 addrspace(1)* undef, i32 3, i32 %tmp42, i32 3, i32 undef, i32 0, i8 addrspace(1)* undef, i32 3, i32 undef, i32 1, i32 34, i32 14, i32 0, i32 3, i32 0, i32 3, i32 %tmp42, i32 3, i32 undef, i32 3, i32 0), "gc-live"() ] + unreachable + + bb44: ; preds = %bb27 + call void @hoge.1() + br i1 undef, label %bb50, label %bb45 + + bb45: ; preds = %bb44 + br i1 undef, label %bb56, label %bb46 + + bb46: ; preds = %bb45 + %tmp47 = invoke token (i64, i32, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 1, i32 16, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)* nonnull @barney, i32 5, i32 0, i32 undef, i8 addrspace(1)* nonnull undef, i8 addrspace(1)* undef, i32 0, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 10, i32 2, i32 19, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp30, i32 0, i8 addrspace(1)* %tmp30, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 8, i32 9, i32 34, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef), "gc-live"(i8 addrspace(1)* %tmp30, i8 addrspace(1)* undef, i8 addrspace(1)* undef) ] + to label %bb48 unwind label %bb52 + + bb48: ; preds = %bb46 + %tmp49 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp47, i32 0, i32 0) ; (%tmp30, %tmp30) + br label %bb56 + + bb50: ; preds = %bb44 + %tmp51 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 10, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 10, i32 2, i32 19, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp30, i32 0, i8 addrspace(1)* %tmp30, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp30, i32 1, i32 9, i32 6, i32 1, i32 3, i32 0, i32 0, i8 addrspace(1)* null, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb52: ; preds = %bb46 + %tmp53 = landingpad token + cleanup + %tmp54 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp53, i32 0, i32 0) ; (%tmp30, %tmp30) + %tmp55 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 3, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp54, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp54, i32 10, i32 2, i32 19, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp54, i32 0, i8 addrspace(1)* %tmp54, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp54, i32 0, i32 9, i32 51, i32 0, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] + unreachable + + bb56: ; preds = %bb48, %bb45 + %tmp57 = phi i8 addrspace(1)* [ %tmp30, %bb45 ], [ %tmp49, %bb48 ] + %tmp58 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @ham, i32 1, i32 2, i32 10, i32 0, i32 0) [ "deopt"(i32 0, i32 10, i32 0, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp57, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp57, i32 9, i32 2, i32 26, i32 1, i32 3, i32 1, i32 0, i8 addrspace(1)* null, i32 0, i8 addrspace(1)* %tmp57, i32 0, i8 addrspace(1)* %tmp57, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp57), "gc-live"() ] + unreachable + } + + declare i32* @widget() + + declare void @quux(i8 addrspace(1)*, i8 addrspace(1)*) + + declare void @hoge.1() + + declare void @barney(i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32) + + ; Function Attrs: nounwind readnone + declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32 immarg, i32 immarg) #0 + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 immarg, i32 immarg, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32 immarg, i32 immarg, ...) + + declare void @ham(i32) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 immarg, i32 immarg, void (i32)*, i32 immarg, i32 immarg, ...) + + declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 immarg, i32 immarg, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32 immarg, i32 immarg, ...) + + declare void @wombat() + + attributes #0 = { nounwind readnone } + +... +--- +name: hoge +alignment: 16 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +failedISel: false +tracksRegLiveness: true +hasWinCFI: false +registers: + - { id: 0, class: gr64, preferred-register: '' } + - { id: 1, class: gr64, preferred-register: '' } + - { id: 2, class: gr64, preferred-register: '' } + - { id: 3, class: gr64_with_sub_8bit, preferred-register: '' } + - { id: 4, class: gr32, preferred-register: '' } + - { id: 5, class: gr32, preferred-register: '' } + - { id: 6, class: gr64, preferred-register: '' } + - { id: 7, class: gr64, preferred-register: '' } + - { id: 8, class: gr64, preferred-register: '' } + - { id: 9, class: gr32, preferred-register: '' } + - { id: 10, class: gr64, preferred-register: '' } + - { id: 11, class: gr64, preferred-register: '' } + - { id: 12, class: gr64, preferred-register: '' } + - { id: 13, class: gr64, preferred-register: '' } + - { id: 14, class: gr64, preferred-register: '' } + - { id: 15, class: gr64, preferred-register: '' } + - { id: 16, class: gr64, preferred-register: '' } + - { id: 17, class: gr64, preferred-register: '' } + - { id: 18, class: gr32, preferred-register: '' } + - { id: 19, class: gr8, preferred-register: '' } + - { id: 20, class: gr32, preferred-register: '' } + - { id: 21, class: gr64, preferred-register: '' } + - { id: 22, class: gr32, preferred-register: '' } + - { id: 23, class: gr32, preferred-register: '' } + - { id: 24, class: gr64, preferred-register: '' } + - { id: 25, class: gr32, preferred-register: '' } + - { id: 26, class: gr8, preferred-register: '' } + - { id: 27, class: gr32, preferred-register: '' } + - { id: 28, class: gr8, preferred-register: '' } + - { id: 29, class: gr32, preferred-register: '' } + - { id: 30, class: gr32, preferred-register: '' } + - { id: 31, class: gr8, preferred-register: '' } + - { id: 32, class: gr64, preferred-register: '' } + - { id: 33, class: gr32, preferred-register: '' } + - { id: 34, class: gr64_with_sub_8bit, preferred-register: '' } + - { id: 35, class: gr32, preferred-register: '' } + - { id: 36, class: gr64, preferred-register: '' } + - { id: 37, class: gr32, preferred-register: '' } + - { id: 38, class: gr64, preferred-register: '' } + - { id: 39, class: gr64, preferred-register: '' } + - { id: 40, class: gr64, preferred-register: '' } + - { id: 41, class: gr64, preferred-register: '' } + - { id: 42, class: gr64, preferred-register: '' } + - { id: 43, class: gr64, preferred-register: '' } + - { id: 44, class: gr32, preferred-register: '' } + - { id: 45, class: gr8, preferred-register: '' } + - { id: 46, class: gr32, preferred-register: '' } + - { id: 47, class: gr64, preferred-register: '' } + - { id: 48, class: gr64_with_sub_8bit, preferred-register: '' } + - { id: 49, class: gr32, preferred-register: '' } + - { id: 50, class: gr32, preferred-register: '' } + - { id: 51, class: gr8, preferred-register: '' } + - { id: 52, class: gr32, preferred-register: '' } + - { id: 53, class: gr8, preferred-register: '' } + - { id: 54, class: gr64, preferred-register: '' } + - { id: 55, class: gr32, preferred-register: '' } + - { id: 56, class: gr32, preferred-register: '' } + - { id: 57, class: gr64, preferred-register: '' } + - { id: 58, class: gr64, preferred-register: '' } + - { id: 59, class: gr32, preferred-register: '' } + - { id: 60, class: gr64, preferred-register: '' } + - { id: 61, class: gr64, preferred-register: '' } + - { id: 62, class: gr64, preferred-register: '' } + - { id: 63, class: gr32, preferred-register: '' } + - { id: 64, class: gr64, preferred-register: '' } + - { id: 65, class: gr32, preferred-register: '' } + - { id: 66, class: gr64, preferred-register: '' } + - { id: 67, class: gr32, preferred-register: '' } + - { id: 68, class: gr64, preferred-register: '' } + - { id: 69, class: gr32, preferred-register: '' } + - { id: 70, class: gr64, preferred-register: '' } + - { id: 71, class: gr64, preferred-register: '' } + - { id: 72, class: gr64, preferred-register: '' } + - { id: 73, class: gr32, preferred-register: '' } + - { id: 74, class: gr64, preferred-register: '' } + - { id: 75, class: gr64, preferred-register: '' } + - { id: 76, class: gr64, preferred-register: '' } + - { id: 77, class: gr32, preferred-register: '' } + - { id: 78, class: gr64, preferred-register: '' } + - { id: 79, class: gr32, preferred-register: '' } +liveins: + - { reg: '$rdi', virtual-reg: '%12' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 4 + adjustsStack: false + hasCalls: true + stackProtector: '' + maxCallFrameSize: 4294967295 + cvBytesOfCalleeSavedRegisters: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false + hasTailCall: false + localFrameSize: 0 + savePoint: '' + restorePoint: '' +fixedStack: [] +stack: + - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +callSites: [] +debugValueSubstitutions: [] +constants: [] +machineFunctionInfo: {} +body: | + ; CHECK-LABEL: name: hoge + ; CHECK: bb.0.bb: + ; CHECK: successors: %bb.1(0x80000000), %bb.15(0x00000000) + ; CHECK: liveins: $rdi + ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rdi + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $rdi = COPY [[COPY]] + ; CHECK: dead [[COPY]]:gr64 = STATEPOINT 2, 5, 2, undef %15:gr64, $rdi, undef $rsi, 2, 0, 2, 0, 2, 27, 2, 0, 2, 10, 2, 0, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, [[COPY]], 2, 7, 2, 0, 2, 0, [[COPY]], 2, 7, 2, 0, 2, 0, [[COPY]], 2, 2, 2, 1, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, [[COPY]](tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: TEST8rr [[MOV32r0_]].sub_8bit, [[MOV32r0_]].sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.15, 5, implicit $eflags + ; CHECK: JMP_1 %bb.1 + ; CHECK: bb.1.bb6: + ; CHECK: successors: %bb.2(0x80000000) + ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm undef %17:gr64, 1, $noreg, 0, $noreg :: (load unordered 8 from `i8 addrspace(1)* addrspace(1)* undef`, addrspace 1) + ; CHECK: [[NOT64r:%[0-9]+]]:gr64 = NOT64r [[NOT64r]] + ; CHECK: MOV64mr %stack.1, 1, $noreg, 0, $noreg, [[NOT64r]] :: (store 8 into %stack.1) + ; CHECK: undef %48.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags + ; CHECK: [[DEF:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF2:%[0-9]+]]:gr64_with_sub_8bit = IMPLICIT_DEF + ; CHECK: [[MOV32r0_1:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: bb.2.bb7: + ; CHECK: successors: %bb.3(0x00000000), %bb.4(0x80000000) + ; CHECK: TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.4, 4, implicit $eflags + ; CHECK: bb.3: + ; CHECK: successors: %bb.16(0x80000000) + ; CHECK: JMP_1 %bb.16 + ; CHECK: bb.4.bb7: + ; CHECK: successors: %bb.5(0x00000000), %bb.6(0x80000000) + ; CHECK: TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.6, 4, implicit $eflags + ; CHECK: bb.5: + ; CHECK: successors: %bb.16(0x80000000) + ; CHECK: JMP_1 %bb.16 + ; CHECK: bb.6.bb7: + ; CHECK: successors: %bb.16(0x00000000), %bb.7(0x80000000) + ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm undef %24:gr64, 1, $noreg, 0, $noreg :: (load unordered 4 from `i32 addrspace(1)* undef`, align 8, addrspace 1) + ; CHECK: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr [[ADD32rr]], [[MOV32r0_1]], implicit-def dead $eflags + ; CHECK: CMP32rr [[MOV32r0_1]], [[ADD32rr]], implicit-def $eflags + ; CHECK: JCC_1 %bb.16, 15, implicit $eflags + ; CHECK: JMP_1 %bb.7 + ; CHECK: bb.7.bb20: + ; CHECK: successors: %bb.8(0x40000000), %bb.9(0x40000000) + ; CHECK: TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.9, 4, implicit $eflags + ; CHECK: bb.8: + ; CHECK: successors: %bb.11(0x80000000) + ; CHECK: JMP_1 %bb.11 + ; CHECK: bb.9.bb23: + ; CHECK: successors: %bb.10(0x7ffff800), %bb.12(0x00000800) + ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, [[ADD32rr]] :: (store 4 into %stack.0) + ; CHECK: EH_LABEL + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm %stack.1, 1, $noreg, 0, $noreg :: (load 8 from %stack.1) + ; CHECK: dead $edx = MOV32r0 implicit-def dead $eflags, implicit-def $rdx + ; CHECK: $ecx = MOV32r0 implicit-def dead $eflags + ; CHECK: [[COPY1:%[0-9]+]]:gr64 = COPY [[DEF2]] + ; CHECK: dead [[MOV64rm]]:gr64, dead [[COPY1]]:gr64, dead [[DEF1]]:gr64, dead [[DEF]]:gr64 = STATEPOINT 1, 16, 5, undef %41:gr64, undef $edi, undef $rsi, $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 89, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[COPY1]], 2, 7, 2, 0, 2, 0, [[COPY1]], 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[COPY1]], 2, 0, [[COPY1]], 2, 7, 2, 0, 2, 0, [[COPY1]], 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, [[DEF1]], 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 8, 2, 9, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, [[DEF1]], 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, [[MOV64rm]](tied-def 0), [[COPY1]](tied-def 1), [[DEF1]](tied-def 2), 2, 4278124286, [[DEF]](tied-def 3), 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0) + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: EH_LABEL + ; CHECK: JMP_1 %bb.10 + ; CHECK: bb.10.bb25: + ; CHECK: successors: %bb.11(0x80000000) + ; CHECK: [[DEF3:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: [[DEF3:%[0-9]+]]:gr64 = IMPLICIT_DEF + ; CHECK: undef [[DEF2]].sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags + ; CHECK: bb.11.bb27: + ; CHECK: successors: %bb.2(0x80000000), %bb.17(0x00000000) + ; CHECK: TEST32rr [[ADD32rr]], [[ADD32rr]], implicit-def $eflags + ; CHECK: [[COPY2:%[0-9]+]]:gr32 = COPY [[ADD32rr]] + ; CHECK: JCC_1 %bb.2, 8, implicit $eflags + ; CHECK: JMP_1 %bb.17 + ; CHECK: bb.12.bb35 (landing-pad): + ; CHECK: successors: %bb.14(0x40000000), %bb.13(0x40000000) + ; CHECK: liveins: $rax, $rdx + ; CHECK: EH_LABEL + ; CHECK: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: TEST8rr [[MOV32r0_]].sub_8bit, [[MOV32r0_]].sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.14, 5, implicit $eflags + ; CHECK: JMP_1 %bb.13 + ; CHECK: bb.13.bb37: + ; CHECK: successors: + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri 3 + ; CHECK: STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 87, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, [[ADD32rr]], 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 0, 2, 9, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 4278124286, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: bb.14.bb39: + ; CHECK: successors: + ; CHECK: bb.15.bb40: + ; CHECK: successors: %bb.16(0x80000000) + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: CALL64pcrel32 target-flags(x86-plt) @wombat, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: bb.16.bb41: + ; CHECK: successors: + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri -39 + ; CHECK: STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 103, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, [[COPY2]], 2, 3, 2, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 33, 2, 6, 2, 0, 2, 5, 2, 0, 2, 0, 2, 4278124286, 2, 3, [[COPY2]], 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 1, 2, 34, 2, 14, 2, 0, 2, 3, 2, 0, 2, 3, [[COPY2]], 2, 3, 2, 4278124286, 2, 3, 2, 0, 2, 1, 2, 4278124286, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: bb.17.bb44: + ; CHECK: successors: %bb.22(0x40000000), %bb.18(0x40000000) + ; CHECK: [[COPY3:%[0-9]+]]:gr64 = COPY [[DEF2]] + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: CALL64pcrel32 target-flags(x86-plt) @hoge.1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: [[MOV32r0_1:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: TEST8rr [[MOV32r0_1]].sub_8bit, [[MOV32r0_1]].sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.22, 5, implicit $eflags + ; CHECK: JMP_1 %bb.18 + ; CHECK: bb.18.bb45: + ; CHECK: successors: %bb.19(0x40000000), %bb.20(0x40000000) + ; CHECK: [[MOV32r0_2:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags + ; CHECK: TEST8rr [[MOV32r0_2]].sub_8bit, [[MOV32r0_2]].sub_8bit, implicit-def $eflags + ; CHECK: JCC_1 %bb.20, 4, implicit $eflags + ; CHECK: bb.19: + ; CHECK: successors: %bb.24(0x80000000) + ; CHECK: JMP_1 %bb.24 + ; CHECK: bb.20.bb46: + ; CHECK: successors: %bb.21(0x40000000), %bb.23(0x40000000) + ; CHECK: EH_LABEL + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $ecx = MOV32r0 implicit-def dead $eflags + ; CHECK: [[STATEPOINT:%[0-9]+]]:gr64 = STATEPOINT 1, 16, 5, undef %60:gr64, undef $edi, undef $rsi, undef $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 45, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT]], 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 8, 2, 9, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, [[STATEPOINT]](tied-def 0), 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: EH_LABEL + ; CHECK: JMP_1 %bb.21 + ; CHECK: bb.21.bb48: + ; CHECK: successors: %bb.24(0x80000000) + ; CHECK: JMP_1 %bb.24 + ; CHECK: bb.22.bb50: + ; CHECK: successors: + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri 10 + ; CHECK: dead [[STATEPOINT]]:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 45, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT]], 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 1, 2, 9, 2, 6, 2, 1, 2, 3, 2, 0, 2, 0, 2, 0, 2, 0, 2, 4278124286, 2, 0, 2, 0, 2, 7, 2, 0, 2, 3, [[STATEPOINT]](tied-def 0), 2, 0, 2, 4278124286, 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: bb.23.bb52 (landing-pad): + ; CHECK: successors: + ; CHECK: liveins: $rax, $rdx + ; CHECK: EH_LABEL + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri 3 + ; CHECK: dead [[STATEPOINT]]:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 43, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT]], 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 0, 2, 9, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, [[STATEPOINT]](tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: bb.24.bb56: + ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + ; CHECK: $edi = MOV32ri 10 + ; CHECK: dead [[STATEPOINT]]:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 33, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 9, 2, 2, 2, 26, 2, 1, 2, 3, 2, 1, 2, 0, 2, 0, 2, 0, [[STATEPOINT]], 2, 0, [[STATEPOINT]], 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 2, [[STATEPOINT]](tied-def 0), 2, 0, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + bb.0.bb: + successors: %bb.1(0x80000000), %bb.12(0x00000000) + liveins: $rdi + + %14:gr64 = COPY $rdi + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $rdi = COPY %14 + dead %14:gr64 = STATEPOINT 2, 5, 2, undef %15:gr64, $rdi, undef $rsi, 2, 0, 2, 0, 2, 27, 2, 0, 2, 10, 2, 0, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, %14, 2, 7, 2, 0, 2, 0, %14, 2, 7, 2, 0, 2, 0, %14, 2, 2, 2, 1, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, %14(tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %77:gr32 = MOV32r0 implicit-def dead $eflags + TEST8rr %77.sub_8bit, %77.sub_8bit, implicit-def $eflags + JCC_1 %bb.12, 5, implicit $eflags + JMP_1 %bb.1 + + bb.1.bb6: + successors: %bb.2(0x80000000) + + %0:gr64 = MOV64rm undef %17:gr64, 1, $noreg, 0, $noreg :: (load unordered 8 from `i8 addrspace(1)* addrspace(1)* undef`, addrspace 1) + %0:gr64 = NOT64r %0 + undef %48.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags + %1:gr64 = IMPLICIT_DEF + %2:gr64 = IMPLICIT_DEF + %3:gr64_with_sub_8bit = IMPLICIT_DEF + %77:gr32 = MOV32r0 implicit-def dead $eflags + + bb.2.bb7: + successors: %bb.22(0x00000000), %bb.3(0x80000000) + + TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + JCC_1 %bb.3, 4, implicit $eflags + + bb.22: + successors: %bb.13(0x80000000) + + JMP_1 %bb.13 + + bb.3.bb7: + successors: %bb.23(0x00000000), %bb.4(0x80000000) + + TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + JCC_1 %bb.4, 4, implicit $eflags + + bb.23: + successors: %bb.13(0x80000000) + + JMP_1 %bb.13 + + bb.4.bb7: + successors: %bb.13(0x00000000), %bb.5(0x80000000) + + %5:gr32 = MOV32rm undef %24:gr64, 1, $noreg, 0, $noreg :: (load unordered 4 from `i32 addrspace(1)* undef`, align 8, addrspace 1) + %5:gr32 = ADD32rr %5, %77, implicit-def dead $eflags + CMP32rr %77, %5, implicit-def $eflags + JCC_1 %bb.13, 15, implicit $eflags + JMP_1 %bb.5 + + bb.5.bb20: + successors: %bb.21(0x40000000), %bb.6(0x40000000) + + TEST8rr %48.sub_8bit, %48.sub_8bit, implicit-def $eflags + JCC_1 %bb.6, 4, implicit $eflags + + bb.21: + successors: %bb.8(0x80000000) + + JMP_1 %bb.8 + + bb.6.bb23: + successors: %bb.7(0x7ffff800), %bb.9(0x00000800) + + MOV32mr %stack.0, 1, $noreg, 0, $noreg, %5 :: (store 4 into %stack.0) + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %32:gr64 = COPY %0 + dead $edx = MOV32r0 implicit-def dead $eflags, implicit-def $rdx + $ecx = MOV32r0 implicit-def dead $eflags + dead %32:gr64, dead %3:gr64_with_sub_8bit, dead %2:gr64, dead %1:gr64 = STATEPOINT 1, 16, 5, undef %41:gr64, undef $edi, undef $rsi, $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 89, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %3, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, %2, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %1, 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %1, 2, 8, 2, 9, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, %2, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, %32(tied-def 0), %3(tied-def 1), %2(tied-def 2), 2, 4278124286, %1(tied-def 3), 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store 4 on %stack.0) + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.7 + + bb.7.bb25: + successors: %bb.8(0x80000000) + + %1:gr64 = IMPLICIT_DEF + %2:gr64 = IMPLICIT_DEF + undef %3.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags + + bb.8.bb27: + successors: %bb.2(0x80000000), %bb.14(0x00000000) + + TEST32rr %5, %5, implicit-def $eflags + %77:gr32 = COPY %5 + JCC_1 %bb.2, 8, implicit $eflags + JMP_1 %bb.14 + + bb.9.bb35 (landing-pad): + successors: %bb.11(0x40000000), %bb.10(0x40000000) + liveins: $rax, $rdx + + EH_LABEL + %44:gr32 = MOV32r0 implicit-def dead $eflags + TEST8rr %44.sub_8bit, %44.sub_8bit, implicit-def $eflags + JCC_1 %bb.11, 5, implicit $eflags + JMP_1 %bb.10 + + bb.10.bb37: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $edi = MOV32ri 3 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 87, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, %5, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 0, 2, 9, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 4278124286, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.11.bb39: + successors: + + + bb.12.bb40: + successors: %bb.13(0x80000000) + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + CALL64pcrel32 target-flags(x86-plt) @wombat, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.13.bb41: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $edi = MOV32ri -39 + STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 103, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 10, 2, 2, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 8, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 12, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 18, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 3, %77, 2, 3, 2, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, 2, 33, 2, 6, 2, 0, 2, 5, 2, 0, 2, 0, 2, 4278124286, 2, 3, %77, 2, 3, 2, 4278124286, 2, 0, 2, 4278124286, 2, 3, 2, 4278124286, 2, 1, 2, 34, 2, 14, 2, 0, 2, 3, 2, 0, 2, 3, %77, 2, 3, 2, 4278124286, 2, 3, 2, 0, 2, 1, 2, 4278124286, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.14.bb44: + successors: %bb.18(0x40000000), %bb.15(0x40000000) + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + CALL64pcrel32 target-flags(x86-plt) @hoge.1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + %50:gr32 = MOV32r0 implicit-def dead $eflags + TEST8rr %50.sub_8bit, %50.sub_8bit, implicit-def $eflags + JCC_1 %bb.18, 5, implicit $eflags + JMP_1 %bb.15 + + bb.15.bb45: + successors: %bb.24(0x40000000), %bb.16(0x40000000) + + %52:gr32 = MOV32r0 implicit-def dead $eflags + TEST8rr %52.sub_8bit, %52.sub_8bit, implicit-def $eflags + JCC_1 %bb.16, 4, implicit $eflags + + bb.24: + successors: %bb.20(0x80000000) + + JMP_1 %bb.20 + + bb.16.bb46: + successors: %bb.17(0x40000000), %bb.19(0x40000000) + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $ecx = MOV32r0 implicit-def dead $eflags + %3:gr64_with_sub_8bit = STATEPOINT 1, 16, 5, undef %60:gr64, undef $edi, undef $rsi, undef $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 45, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, %3, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 8, 2, 9, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 2, %3(tied-def 0), 2, 4278124286, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + EH_LABEL + JMP_1 %bb.17 + + bb.17.bb48: + successors: %bb.20(0x80000000) + + JMP_1 %bb.20 + + bb.18.bb50: + successors: + + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $edi = MOV32ri 10 + dead %3:gr64_with_sub_8bit = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 45, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, %3, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 1, 2, 9, 2, 6, 2, 1, 2, 3, 2, 0, 2, 0, 2, 0, 2, 0, 2, 4278124286, 2, 0, 2, 0, 2, 7, 2, 0, 2, 3, %3(tied-def 0), 2, 0, 2, 4278124286, 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.19.bb52 (landing-pad): + successors: + liveins: $rax, $rdx + + EH_LABEL + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $edi = MOV32ri 3 + dead %3:gr64_with_sub_8bit = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 43, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 10, 2, 2, 2, 19, 2, 0, 2, 3, 2, 1, 2, 0, %3, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 0, 2, 9, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, %3(tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + + bb.20.bb56: + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + $edi = MOV32ri 10 + dead %3:gr64_with_sub_8bit = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @ham, $edi, 2, 0, 2, 2, 2, 33, 2, 0, 2, 10, 2, 0, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 9, 2, 2, 2, 26, 2, 1, 2, 3, 2, 1, 2, 0, 2, 0, 2, 0, %3, 2, 0, %3, 2, 7, 2, 0, 2, 0, %3, 2, 2, %3(tied-def 0), 2, 0, 2, 0, 2, 2, 0, 0, 1, 1, csr_64, implicit-def $rsp, implicit-def $ssp + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp + +... Index: llvm/test/CodeGen/X86/statepoint-invoke-ra1.ll =================================================================== --- llvm/test/CodeGen/X86/statepoint-invoke-ra1.ll +++ llvm/test/CodeGen/X86/statepoint-invoke-ra1.ll @@ -1,10 +1,8 @@ ; REQUIRES: asserts -; RUN: not --crash llc -o /dev/null %s -max-registers-for-gc-values=15 -use-registers-for-gc-values-in-landing-pad=true -verify-regalloc 2>&1 | FileCheck %s +; RUN: llc -o - %s -max-registers-for-gc-values=15 -use-registers-for-gc-values-in-landing-pad=true -verify-regalloc 2>&1 | FileCheck %s -; The test checks the verification catch the case when RA splits live interval in the -; way the def is located after invoke statepoint while use is in landing pad. - -; CHECK: *** Bad machine code: Register not marked live out of predecessor *** +; CHECK-NOT: *** Bad machine code +; CHECK: wombat target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" target triple = "x86_64-unknown-linux-gnu" Index: llvm/test/CodeGen/X86/statepoint-invoke-ra2.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/statepoint-invoke-ra2.ll @@ -0,0 +1,136 @@ +; REQUIRES: asserts +; RUN: llc -o - %s -max-registers-for-gc-values=15 -use-registers-for-gc-values-in-landing-pad=true -use-registers-for-deopt-values=true -verify-regalloc 2>&1 | FileCheck %s + +; CHECK-NOT: Bad Parent VNI + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" +target triple = "x86_64-unknown-linux-gnu" + +@global = external global i8 addrspace(1)*, align 8 +@global.1 = external global i8 addrspace(1)*, align 8 + +define void @bar(i8 addrspace(1)* %arg) #0 gc "statepoint-example" personality i32* ()* @zot { +bb: + %tmp = inttoptr i64 undef to i8 addrspace(1)* + br label %bb1 + +bb1: ; preds = %bb64, %bb + %tmp2 = phi i8 addrspace(1)* [ %tmp, %bb ], [ undef, %bb64 ] + %tmp3 = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2, i32 5, void ()* nonnull @wibble, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 1, i32 0, i32 0, i32 5, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %tmp2) ] + %tmp4 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp3, i32 0, i32 0) ; (%tmp2, %tmp2) + %tmp5 = call token (i64, i32, void (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 2882400000, i32 0, void (i8 addrspace(1)*)* nonnull @barney, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 9, i32 1, i32 9, i32 0, i32 5, i32 1, i32 7, i8* null, i32 8, i32 2, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 8, i32 2), "gc-live"(i8 addrspace(1)* undef, i8 addrspace(1)* %tmp4) ] + %tmp6 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp5, i32 1, i32 1) ; (%tmp4, %tmp4) + %tmp7 = call token (i64, i32, i8 addrspace(1)* ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i8f(i64 2, i32 5, i8 addrspace(1)* ()* nonnull @blam, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 10, i32 1, i32 9, i32 0, i32 5, i32 1, i32 7, i8* null, i32 8, i32 2, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 8, i32 2), "gc-live"(i8 addrspace(1)* %tmp6, i8 addrspace(1)* undef) ] + %tmp8 = call align 8 "java-type-kid"="69" i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token %tmp7) + %tmp9 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp7, i32 0, i32 0) ; (%tmp6, %tmp6) + br i1 undef, label %bb64, label %bb10 + +bb10: ; preds = %bb1 + %tmp11 = inttoptr i64 undef to i8 addrspace(1)* + %tmp12 = call i8 addrspace(1)* @wobble.3(i8 addrspace(1)* undef, i8 addrspace(1)* addrspace(1)* undef) + %tmp13 = select i1 false, i8 addrspace(1)* null, i8 addrspace(1)* %tmp12 + %tmp14 = extractvalue { i32, i1 } undef, 1 + br i1 %tmp14, label %bb17, label %bb15 + +bb15: ; preds = %bb10 + %tmp16 = call token (i64, i32, void (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 2882400000, i32 0, void (i8 addrspace(1)*)* nonnull @barney, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 1, i32 71, i32 0, i32 5, i32 0, i32 0, i8 addrspace(1)* %tmp13, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 2, i32 5, i32 1, i32 0, i32 2, i32 0, i32 0, i8 addrspace(1)* %tmp8, i32 7, i8* null, i32 1, i32 6, i32 0, i32 0, i32 1, i32 1, i32 0, i8 addrspace(1)* %tmp8, i32 8, i32 10), "gc-live"(i8 addrspace(1)* %tmp9, i8 addrspace(1)* %tmp13, i8 addrspace(1)* %tmp11, i8 addrspace(1)* undef, i8 addrspace(1)* %tmp8) ] + unreachable + +bb17: ; preds = %bb10 + %tmp18 = load atomic i32, i32 addrspace(1)* undef unordered, align 4 + %tmp19 = and i32 %tmp18, 33554431 + %tmp20 = invoke token (i64, i32, void (i32, i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8f(i64 1, i32 16, void (i32, i8 addrspace(1)*)* nonnull @spam, i32 2, i32 0, i32 %tmp19, i8 addrspace(1)* nonnull undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 1, i32 71, i32 0, i32 5, i32 0, i32 0, i8 addrspace(1)* %tmp13, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 8, i32 5, i32 12, i32 0, i32 2, i32 0, i32 0, i8 addrspace(1)* %tmp8, i32 7, i8* null), "gc-live"(i8 addrspace(1)* %tmp9, i8 addrspace(1)* %tmp13, i8 addrspace(1)* %tmp13, i8 addrspace(1)* %tmp11, i8 addrspace(1)* %tmp8, i8 addrspace(1)* undef) ] + to label %bb21 unwind label %bb59 + +bb21: ; preds = %bb17 + %tmp22 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp20, i32 0, i32 0) ; (%tmp9, %tmp9) + %tmp23 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp20, i32 1, i32 1) ; (%tmp13, %tmp13) + %tmp24 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp20, i32 3, i32 3) ; (%tmp11, %tmp11) + %tmp25 = load atomic i8 addrspace(1)*, i8 addrspace(1)** @global unordered, align 8 + %tmp26 = ptrtoint i8 addrspace(1)* %tmp25 to i64 + %tmp27 = xor i64 %tmp26, -1 + %tmp28 = inttoptr i64 %tmp27 to i8 addrspace(1)* + %tmp29 = call token (i64, i32, void (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 2, i32 5, void (i8 addrspace(1)*)* nonnull @baz, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 10, i32 1, i32 83, i32 0, i32 5, i32 1, i32 0, i8 addrspace(1)* %tmp23, i32 7, i8* null, i32 8, i32 2, i32 7, i8* null, i32 7, i8* null, i32 8, i32 2), "gc-live"(i8 addrspace(1)* %tmp22, i8 addrspace(1)* %tmp23, i8 addrspace(1)* %tmp23, i8 addrspace(1)* %tmp24, i8 addrspace(1)* %tmp28) ] + %tmp30 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 1, i32 2) ; (%tmp23, %tmp23) + %tmp31 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 4, i32 4) ; (%tmp28, %tmp28) + %tmp45 = load atomic i8 addrspace(1)*, i8 addrspace(1)** @global.1 unordered, align 8 + %tmp49 = load i32, i32 addrspace(256)* inttoptr (i64 660 to i32 addrspace(256)*), align 4 + %tmp32 = icmp eq i8 addrspace(1)* %tmp30, null + br i1 %tmp32, label %bb64, label %bb33 + +bb33: ; preds = %bb33, %bb21 + %tmp34 = phi i8 addrspace(1)* [ %tmp57, %bb33 ], [ undef, %bb21 ] + %tmp35 = phi i64 [ %tmp37, %bb33 ], [ 0, %bb21 ] + %tmp36 = phi i8 addrspace(1)* [ undef, %bb33 ], [ %tmp30, %bb21 ] + %tmp37 = add nuw nsw i64 %tmp35, 1 + %tmp38 = load atomic i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* undef unordered, align 8 + %tmp39 = ptrtoint i8 addrspace(1)* %tmp38 to i64 + %tmp40 = xor i64 %tmp39, -1 + %tmp41 = inttoptr i64 %tmp40 to i8 addrspace(1)* + %tmp42 = select i1 false, i8 addrspace(1)* null, i8 addrspace(1)* %tmp41 + %tmp43 = icmp eq i8 addrspace(1)* %tmp42, %tmp36 + %tmp44 = select i1 %tmp43, i8 addrspace(1)* null, i8 addrspace(1)* %tmp42 + call void asm sideeffect "lock btsq $0,($1)", "r,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64 0, i64* undef) + %tmp46 = ptrtoint i8 addrspace(1)* %tmp45 to i64 + %tmp47 = xor i64 %tmp46, -1 + %tmp48 = inttoptr i64 %tmp47 to i8 addrspace(1)* + %tmp50 = or i32 %tmp49, 268435456 + %tmp51 = cmpxchg i32 addrspace(1)* undef, i32 undef, i32 %tmp50 acquire monotonic + call void @wobble(i8 addrspace(1)* nonnull %tmp48) + %tmp52 = load atomic i8 addrspace(1)*, i8 addrspace(1)** @global unordered, align 8 + %tmp53 = ptrtoint i8 addrspace(1)* %tmp52 to i64 + %tmp54 = xor i64 %tmp53, -1 + %tmp55 = inttoptr i64 %tmp54 to i8 addrspace(1)* + %tmp56 = call token (i64, i32, void (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 2, i32 5, void (i8 addrspace(1)*)* nonnull @baz, i32 1, i32 0, i8 addrspace(1)* %tmp55, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 10, i32 1, i32 83, i32 0, i32 5, i32 1, i32 0, i8 addrspace(1)* %tmp44, i32 7, i8* null, i32 8, i32 2, i32 7, i8* null, i32 7, i8* null, i32 8, i32 2), "gc-live"(i8 addrspace(1)* undef, i8 addrspace(1)* %tmp44, i8 addrspace(1)* %tmp44, i8 addrspace(1)* %tmp34, i8 addrspace(1)* undef) ] + %tmp57 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp56, i32 3, i32 3) ; (%tmp34, %tmp34) + %tmp58 = icmp ult i64 %tmp35, 65536 + br label %bb33 + +bb59: ; preds = %bb17 + %tmp60 = landingpad token + cleanup + %tmp61 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp60, i32 1, i32 2) ; (%tmp13, %tmp13) + %tmp62 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp60, i32 4, i32 4) ; (%tmp8, %tmp8) + %tmp63 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* bitcast (void (i64)* @barney.2 to void (i32)*), i32 1, i32 2, i32 -13, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 1, i32 71, i32 0, i32 5, i32 0, i32 0, i8 addrspace(1)* %tmp61, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 1, i32 5, i32 21, i32 0, i32 2, i32 0, i32 0, i8 addrspace(1)* %tmp62, i32 0, i8 addrspace(1)* undef), "gc-live"() ] + unreachable + +bb64: ; preds = %bb21, %bb1 + %tmp65 = or i32 undef, 268435456 + %tmp66 = cmpxchg i32 addrspace(1)* undef, i32 undef, i32 %tmp65 acquire monotonic + %tmp67 = call token (i64, i32, void (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 2, i32 5, void (i8 addrspace(1)*)* nonnull @baz, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 0, i32 0, i32 1, i32 0, i32 7, i8* null, i32 10, i32 1, i32 133, i32 0, i32 5, i32 1, i32 7, i8* null, i32 8, i32 2, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 8, i32 2), "gc-live"(i8 addrspace(1)* undef, i8 addrspace(1)* undef) ] + br label %bb1 +} + +declare i32* @zot() + +declare void @wibble() gc "statepoint-example" + +declare i8 addrspace(1)* @blam() gc "statepoint-example" + +declare void @baz(i8 addrspace(1)*) gc "statepoint-example" + +declare void @spam(i32, i8 addrspace(1)*) + +declare void @wobble(i8 addrspace(1)*) + +declare void @barney(i8 addrspace(1)*) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 immarg, i32 immarg, void ()*, i32 immarg, i32 immarg, ...) + +; Function Attrs: nounwind readonly +declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32 immarg, i32 immarg) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8f(i64 immarg, i32 immarg, void (i8 addrspace(1)*)*, i32 immarg, i32 immarg, ...) + +declare token @llvm.experimental.gc.statepoint.p0f_p1i8f(i64 immarg, i32 immarg, i8 addrspace(1)* ()*, i32 immarg, i32 immarg, ...) + +; Function Attrs: nounwind readonly +declare i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8f(i64 immarg, i32 immarg, void (i32, i8 addrspace(1)*)*, i32 immarg, i32 immarg, ...) + +declare void @barney.2(i64) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 immarg, i32 immarg, void (i32)*, i32 immarg, i32 immarg, ...) + +declare i8 addrspace(1)* @wobble.3(i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)*)