Index: lib/CodeGen/MachineInstrBundle.cpp =================================================================== --- lib/CodeGen/MachineInstrBundle.cpp +++ lib/CodeGen/MachineInstrBundle.cpp @@ -135,9 +135,9 @@ SmallSet KilledUseSet; SmallSet UndefUseSet; SmallVector Defs; - for (; FirstMI != LastMI; ++FirstMI) { - for (unsigned i = 0, e = FirstMI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = FirstMI->getOperand(i); + for (auto MII = FirstMI; MII != LastMI; ++MII) { + for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) { + MachineOperand &MO = MII->getOperand(i); if (!MO.isReg()) continue; if (MO.isDef()) { @@ -215,6 +215,15 @@ MIB.addReg(Reg, getKillRegState(isKill) | getUndefRegState(isUndef) | getImplRegState(true)); } + + // Set FrameSetup/FrameDestroy for the bundle. If any of the instructions got + // the property, then also set it on the bundle. + for (auto MII = FirstMI; MII != LastMI; ++MII) { + if (MII->getFlag(MachineInstr::FrameSetup)) + MIB.setMIFlag(MachineInstr::FrameSetup); + if (MII->getFlag(MachineInstr::FrameDestroy)) + MIB.setMIFlag(MachineInstr::FrameDestroy); + } } /// finalizeBundle - Same functionality as the previous finalizeBundle except Index: test/CodeGen/Hexagon/packetize-frame-setup-destroy.mir =================================================================== --- /dev/null +++ test/CodeGen/Hexagon/packetize-frame-setup-destroy.mir @@ -0,0 +1,62 @@ +# RUN: llc -march=hexagon -run-pass hexagon-packetizer %s -o - | FileCheck %s + +############################################################################## +# This test case is not really hexagon specific, but we use hexagon to get +# bundling. +# +# The goal is to verify that the BUNDLE instruction is getting the +# frame-setup/frame-destroy attribute if any of the bundled instructions got +# the attribute. +############################################################################## + +--- +name: setup +tracksRegLiveness: true +body: | + bb.0: + liveins: $r1, $r2 + successors: %bb.1 + $r3 = frame-setup L2_loadri_io $r1, 0 + J4_cmpgtu_f_jumpnv_t killed $r3, killed $r2, %bb.1, implicit-def $pc + + bb.1: +... + +# CHECK-LABEL: name: setup +# CHECK: frame-setup BUNDLE + +############################################################################## + +--- +name: destroy +tracksRegLiveness: true +body: | + bb.0: + liveins: $r1, $r2 + successors: %bb.1 + $r3 = frame-destroy L2_loadri_io $r1, 0 + J4_cmpgtu_f_jumpnv_t killed $r3, killed $r2, %bb.1, implicit-def $pc + + bb.1: +... + +# CHECK-LABEL: name: destroy +# CHECK: frame-destroy BUNDLE + +############################################################################## + +--- +name: mixed +tracksRegLiveness: true +body: | + bb.0: + liveins: $r1, $r2 + successors: %bb.1 + $r3 = frame-setup L2_loadri_io $r1, 0 + frame-destroy J4_cmpgtu_f_jumpnv_t killed $r3, killed $r2, %bb.1, implicit-def $pc + + bb.1: +... + +# CHECK-LABEL: name: mixed +# CHECK: frame-setup frame-destroy BUNDLE