diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp --- a/llvm/lib/CodeGen/TailDuplicator.cpp +++ b/llvm/lib/CodeGen/TailDuplicator.cpp @@ -625,7 +625,9 @@ if (PreRegAlloc && MI.isCall()) return false; - if (!MI.isPHI() && !MI.isMetaInstruction()) + if (MI.isBundle()) + InstrCount += MI.getBundleSize(); + else if (!MI.isPHI() && !MI.isMetaInstruction()) InstrCount += 1; if (InstrCount > MaxDuplicateCount) diff --git a/llvm/test/CodeGen/AMDGPU/tail-dup-bundle.mir b/llvm/test/CodeGen/AMDGPU/tail-dup-bundle.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/tail-dup-bundle.mir @@ -0,0 +1,38 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -march=amdgcn -run-pass=block-placement -tail-dup-placement-threshold=2 -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN %s + +# Check that tail duplication correctly counts instructions in a bundle. +# The bundle below shall not be duplicated. + +--- +name: tail_dup_bundle +body: | + ; GCN-LABEL: name: tail_dup_bundle + ; GCN: bb.0: + ; GCN: successors: %bb.2(0x80000000) + ; GCN: bb.2: + ; GCN: BUNDLE { + ; GCN: S_NOP 0 + ; GCN: S_NOP 0 + ; GCN: } + ; GCN: S_ENDPGM 0 + ; GCN: bb.1: + ; GCN: successors: %bb.2(0x80000000) + ; GCN: S_BRANCH %bb.2 + bb.0: + successors: %bb.2(0x80000000) + + S_BRANCH %bb.2 + + bb.1: + successors: %bb.2(0x80000000) + + bb.2: + + BUNDLE { + S_NOP 0 + S_NOP 0 + } + S_ENDPGM 0 + +...