1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

[mips] Fix the target specific instruction verifier

Fix an off by one error in the bounds checking for 'dinsu' and update
the ranges in the test comments so that they are accurate.

Reviewers: atanasyan

https://reviews.llvm.org/D41183

llvm-svn: 320974
This commit is contained in:
Simon Dardis 2017-12-18 12:24:17 +00:00
parent 5db6217e15
commit 91a35077f1
27 changed files with 111 additions and 50 deletions

View File

@ -538,15 +538,19 @@ bool MipsInstrInfo::findCommutedOpIndices(MachineInstr &MI, unsigned &SrcOpIdx1,
}
// ins, ext, dext*, dins have the following constraints:
// 0 <= pos < X
// 0 < size <= X
// 0 < pos+size <= x
// X <= pos < Y
// X < size <= Y
// X < pos+size <= Y
//
// dinsm and dinsm have the following contraints:
// 0 <= pos < X
// 0 <= size <= X
// 0 < pos+size <= x
// dinsm and dinsu have the following constraints:
// X <= pos < Y
// X <= size <= Y
// X < pos+size <= Y
//
// The callee of verifyInsExtInstruction however gives the bounds of
// dins[um] like the other (d)ins (d)ext(um) instructions, so that this
// function doesn't have to vary it's behaviour based on the instruction
// being checked.
static bool verifyInsExtInstruction(const MachineInstr &MI, StringRef &ErrInfo,
const int64_t PosLow, const int64_t PosHigh,
const int64_t SizeLow,
@ -595,15 +599,18 @@ bool MipsInstrInfo::verifyInstruction(const MachineInstr &MI,
case Mips::DINS:
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 32);
case Mips::DINSM:
// The ISA spec has a subtle difference here in that it says:
// 2 <= size <= 64 for 'dinsm', so we change the bounds so that it
// is in line with the rest of instructions.
// The ISA spec has a subtle difference difference between dinsm and dextm
// in that it says:
// 2 <= size <= 64 for 'dinsm' but 'dextm' has 32 < size <= 64.
// To make the bounds checks similar, the range 1 < size <= 64 is checked
// for 'dinsm'.
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 1, 64, 32, 64);
case Mips::DINSU:
// The ISA spec has a subtle difference here in that it says:
// 2 <= size <= 64 for 'dinsm', so we change the bounds so that it
// is in line with the rest of instructions.
return verifyInsExtInstruction(MI, ErrInfo, 32, 64, 1, 32, 32, 64);
// The ISA spec has a subtle difference between dinsu and dextu in that
// the size range of dinsu is specified as 1 <= size <= 32 whereas size
// for dextu is 0 < size <= 32. The range checked for dinsu here is
// 0 < size <= 32, which is equivalent and similar to dextu.
return verifyInsExtInstruction(MI, ErrInfo, 32, 64, 0, 32, 32, 64);
case Mips::DEXT:
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 63);
case Mips::DEXTM:

View File

@ -1,9 +1,9 @@
; RUN: llc < %s -march=mips64el -mcpu=mips4 -target-abi=n64 | \
; RUN: FileCheck %s -check-prefixes=ALL,64
; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 | \
; RUN: FileCheck %s -check-prefixes=ALL,64
; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | \
; RUN: FileCheck %s -check-prefixes=ALL,64R2
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips4 \
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64 \
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64r2 \
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R2
declare double @copysign(double, double) nounwind readnone

View File

@ -1,8 +1,13 @@
; RUN: llc < %s -march=mipsel -mcpu=mips32 | FileCheck %s -check-prefix=32
; RUN: llc < %s -march=mipsel -mcpu=mips32r2 | FileCheck %s -check-prefix=32R2
; RUN: llc < %s -march=mips64el -mcpu=mips4 -target-abi=n64 | FileCheck %s -check-prefix=64
; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 | FileCheck %s -check-prefix=64
; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | FileCheck %s -check-prefix=64R2
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32 \
; RUN: | FileCheck %s -check-prefix=32
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32r2 \
; RUN: | FileCheck %s -check-prefix=32R2
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips4 -target-abi=n64 \
; RUN: | FileCheck %s -check-prefix=64
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64 -target-abi=n64 \
; RUN: | FileCheck %s -check-prefix=64
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64r2 -target-abi=n64 \
; RUN: | FileCheck %s -check-prefix=64R2
define double @func0(double %d0, double %d1) nounwind readnone {
entry:

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: dext
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: dext
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 32..64
# Check that the machine verifier checks the pos + size is in the range 33..64
---
name: dextm
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: dextm
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 32..64
# Check that the machine verifier checks the size operand is in the range 33..64
---
name: dextm
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 32..64
# Check that the machine verifier checks the pos + size is in the range 33..64
---
name: dextu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 32..63
# Check that the machine verifier checks the position operand is in the range 32..63
---
name: dextu
alignment: 3
@ -42,7 +42,7 @@ body: |
liveins: %a0_64
%0 = COPY %a0_64
%1 = DEXTU %0, 65, 5
%1 = DEXTU %0, 64, 5
%v0_64 = COPY %1
RetRA implicit %v0_64

View File

@ -0,0 +1,49 @@
# RUN: llc -march=mips64 -mcpu=mips64r2 -start-after=expand-isel-pseudos -stop-after=expand-isel-pseudos \
# RUN: -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
# CHECK-NOT: Size operand is out of range!
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: dextu
alignment: 3
exposesReturnsTwice: false
legalized: false
regBankSelected: false
selected: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr64, preferred-register: '' }
- { id: 1, class: gpr64, preferred-register: '' }
liveins:
- { reg: '%a0_64', virtual-reg: '%0' }
frameInfo:
isFrameAddressTaken: false
isReturnAddressTaken: false
hasStackMap: false
hasPatchPoint: false
stackSize: 0
offsetAdjustment: 0
maxAlignment: 1
adjustsStack: false
hasCalls: false
stackProtector: ''
maxCallFrameSize: 4294967295
hasOpaqueSPAdjustment: false
hasVAStart: false
hasMustTailInVarArgFunc: false
savePoint: ''
restorePoint: ''
fixedStack:
stack:
constants:
body: |
bb.0.entry:
liveins: %a0_64
%0 = COPY %a0_64
%1 = DEXTU %0, 63, 1
%v0_64 = COPY %1
RetRA implicit %v0_64
...

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: dextu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 0..32
# Check that the machine verifier checks the pos + size is in the range 1..32
---
name: dins
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: dins
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: dins
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 32..64
# Check that the machine verifier checks the pos + size is in the range 33..64
---
name: dinsu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: dinsm
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 2..64
# Check that the machine verifier checks the size operand is in the range 2..64
---
name: dinsm
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 32..64
# Check that the machine verifier checks the pos + size is in the range 33..64
---
name: dinsu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 32..63
# Check that the machine verifier checks the position operand is in the range 32..63
---
name: dinsu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: dinsu
alignment: 3

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 0..32
# Check that the machine verifier checks the pos + size is in the range 1..32
---
name: f
alignment: 2

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: f
alignment: 2

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: f
alignment: 2

View File

@ -3,7 +3,7 @@
# CHECK: Position + Size is out of range!
# Check that the machine verifier checks the pos + size is in range 0..32
# Check that the machine verifier checks the pos + size is in the range 1..32
---
name: f
alignment: 2

View File

@ -3,7 +3,7 @@
# CHECK: Position operand is out of range!
# Check that the machine verifier checks the position operand is in range 0..31
# Check that the machine verifier checks the position operand is in the range 0..31
---
name: f
alignment: 2

View File

@ -3,7 +3,7 @@
# CHECK: Size operand is out of range!
# Check that the machine verifier checks the size operand is in range 0..32
# Check that the machine verifier checks the size operand is in the range 1..32
---
name: f
alignment: 2