Skip to content

Commit

Permalink
Reland "[mips] Fix the target specific instruction verifier"
Browse files Browse the repository at this point in the history
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.

This version has the correct commit message.

Reviewers: atanasyan

Differential Revision: https://reviews.llvm.org/D41183

llvm-svn: 320991
  • Loading branch information
Simon Dardis committed Dec 18, 2017
1 parent de74bdb commit fd8c65e
Show file tree
Hide file tree
Showing 27 changed files with 111 additions and 50 deletions.
37 changes: 22 additions & 15 deletions llvm/lib/Target/Mips/MipsInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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:
Expand Down
12 changes: 6 additions & 6 deletions llvm/test/CodeGen/Mips/fcopysign-f32-f64.ll
Original file line number Diff line number Diff line change
@@ -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

Expand Down
15 changes: 10 additions & 5 deletions llvm/test/CodeGen/Mips/fcopysign.ll
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dext-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dext-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dextm-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dextm-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dextm-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dextu-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/Mips/instverify/dextu-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
49 changes: 49 additions & 0 deletions llvm/test/CodeGen/Mips/instverify/dextu-size-valid.mir
Original file line number Diff line number Diff line change
@@ -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
...
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dextu-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dins-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dins-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dins-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsm-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsm-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsm-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsu-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsu-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/dinsu-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ext-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ext-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ext-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ins-pos-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ins-pos.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/Mips/instverify/ins-size.mir
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit fd8c65e

Please sign in to comment.