From c9cab6442b8158d0080f776cae0cdb2b8a426144 Mon Sep 17 00:00:00 2001 From: David Green Date: Mon, 22 Jul 2019 12:51:38 +0000 Subject: [PATCH] [ARM] Fix for MVE VPT block pass We need to ensure that the number of T's is correct when adding multiple instructions into the same VPT block. Differential revision: https://reviews.llvm.org/D65049 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366684 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/Thumb2ITBlockPass.cpp | 21 ++++++++++++++++++--- test/CodeGen/Thumb2/mve-vpt-block2.mir | 2 +- test/CodeGen/Thumb2/mve-vpt-block3.mir | 2 +- test/CodeGen/Thumb2/mve-vpt-block4.mir | 2 +- test/CodeGen/Thumb2/mve-vpt-block5.mir | 4 ++-- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/Target/ARM/Thumb2ITBlockPass.cpp b/lib/Target/ARM/Thumb2ITBlockPass.cpp index 3143eb9840e..2087fd59906 100644 --- a/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -388,8 +388,6 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) { MachineInstrBuilder MIBuilder = BuildMI(Block, MBIter, dl, TII->get(ARM::MVE_VPST)); - // The mask value for the VPST instruction is T = 0b1000 = 8 - MIBuilder.addImm(VPTMaskValue::T); MachineBasicBlock::iterator VPSTInsertPos = MIBuilder.getInstr(); int VPTInstCnt = 1; @@ -400,12 +398,29 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) { NextPred = getVPTInstrPredicate(*MBIter, PredReg); } while (NextPred != ARMVCC::None && NextPred == Pred && ++VPTInstCnt < 4); + switch (VPTInstCnt) { + case 1: + MIBuilder.addImm(VPTMaskValue::T); + break; + case 2: + MIBuilder.addImm(VPTMaskValue::TT); + break; + case 3: + MIBuilder.addImm(VPTMaskValue::TTT); + break; + case 4: + MIBuilder.addImm(VPTMaskValue::TTTT); + break; + default: + llvm_unreachable("Unexpected number of instruction in a VPT block"); + }; + MachineInstr *LastMI = &*MBIter; finalizeBundle(Block, VPSTInsertPos.getInstrIterator(), ++LastMI->getIterator()); Modified = true; - LLVM_DEBUG(dbgs() << "VPT block created for: "; MI->dump();); + LLVM_DEBUG(dbgs() << "VPT block created for: "; MI->dump()); ++MBIter; } diff --git a/test/CodeGen/Thumb2/mve-vpt-block2.mir b/test/CodeGen/Thumb2/mve-vpt-block2.mir index 4c43afe5b1d..7146ecd927f 100644 --- a/test/CodeGen/Thumb2/mve-vpt-block2.mir +++ b/test/CodeGen/Thumb2/mve-vpt-block2.mir @@ -64,7 +64,7 @@ body: | bb.0.entry: liveins: $q0, $q1, $q2, $q3, $r0 - ; CHECK: MVE_VPST 8, implicit-def $p0 + ; CHECK: MVE_VPST 4, implicit-def $p0 ; CHECK-NEXT: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 ; CHECK-NEXT: renamable $q1 = nnan ninf nsz MVE_VMINNMf32 diff --git a/test/CodeGen/Thumb2/mve-vpt-block3.mir b/test/CodeGen/Thumb2/mve-vpt-block3.mir index a10e5ea2493..2b8a4dda663 100644 --- a/test/CodeGen/Thumb2/mve-vpt-block3.mir +++ b/test/CodeGen/Thumb2/mve-vpt-block3.mir @@ -65,7 +65,7 @@ body: | bb.0.entry: liveins: $q0, $q1, $q2, $q3, $r0 - ; CHECK: MVE_VPST 8, implicit-def $p0 + ; CHECK: MVE_VPST 1, implicit-def $p0 ; CHECK-NEXT: renamable $q2 = nnan ninf nsz MVE_VMINNMf32 ; CHECK-NEXT: renamable $q2 = nnan ninf nsz MVE_VMINNMf32 ; CHECK-NEXT: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 diff --git a/test/CodeGen/Thumb2/mve-vpt-block4.mir b/test/CodeGen/Thumb2/mve-vpt-block4.mir index 2170ed27746..389fb341fd9 100644 --- a/test/CodeGen/Thumb2/mve-vpt-block4.mir +++ b/test/CodeGen/Thumb2/mve-vpt-block4.mir @@ -66,7 +66,7 @@ body: | bb.0.entry: liveins: $q0, $q1, $q2, $q3, $r0 - ; CHECK: MVE_VPST 8, implicit-def $p0 + ; CHECK: MVE_VPST 1, implicit-def $p0 ; CHECK-NEXT: renamable $q2 = nnan ninf nsz MVE_VMINNMf32 ; CHECK-NEXT: renamable $q2 = nnan ninf nsz MVE_VMINNMf32 ; CHECK-NEXT: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 diff --git a/test/CodeGen/Thumb2/mve-vpt-block5.mir b/test/CodeGen/Thumb2/mve-vpt-block5.mir index 8ef35b7a823..c0c90903640 100644 --- a/test/CodeGen/Thumb2/mve-vpt-block5.mir +++ b/test/CodeGen/Thumb2/mve-vpt-block5.mir @@ -64,13 +64,13 @@ body: | liveins: $q0, $q1, $q2, $r0 ; CHECK: BUNDLE {{.*}} { - ; CHECK-NEXT: MVE_VPST 8, implicit-def $p0 + ; CHECK-NEXT: MVE_VPST 4, implicit-def $p0 ; CHECK-NEXT: renamable $q3 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, renamable $q2, 1, renamable $vpr, killed renamable $q3 ; CHECK-NEXT: renamable $q1 = nnan ninf nsz MVE_VMINNMf32 internal killed renamable $q3, internal renamable $q3, 1, renamable $vpr, undef renamable $q1 ; CHECK-NEXT: $q3 = MVE_VORR $q0, $q0, 0, $noreg, internal undef $q3 ; CHECK-NEXT: } ; CHECK-NEXT: BUNDLE {{.*}} { - ; CHECK-NEXT: MVE_VPST 8, implicit-def $p0 + ; CHECK-NEXT: MVE_VPST 4, implicit-def $p0 ; CHECK-NEXT: renamable $q3 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, renamable $q2, 1, renamable $vpr, killed renamable $q3 ; CHECK-NEXT: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 internal killed renamable $q3, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0 ; CHECK-NEXT: tBX_RET 14, $noreg, implicit internal $q0 -- 2.11.4.GIT