[PATCH] D37775: Add a verifier test to check the access on both sides of COPY are the same
Aditya Nandakumar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 13 11:01:10 PDT 2017
aditya_nandakumar updated this revision to Diff 115075.
aditya_nandakumar added a comment.
Updated to check only if one of Src/Dst has generic virtual registers.
https://reviews.llvm.org/D37775
Files:
lib/CodeGen/MachineVerifier.cpp
test/Verifier/test_copy.mir
unittests/CodeGen/CMakeLists.txt
unittests/IR/CMakeLists.txt
Index: unittests/IR/CMakeLists.txt
===================================================================
--- unittests/IR/CMakeLists.txt
+++ unittests/IR/CMakeLists.txt
@@ -2,6 +2,7 @@
Analysis
AsmParser
Core
+ GlobalISel
Support
Passes
)
Index: unittests/CodeGen/CMakeLists.txt
===================================================================
--- unittests/CodeGen/CMakeLists.txt
+++ unittests/CodeGen/CMakeLists.txt
@@ -2,6 +2,7 @@
AsmPrinter
CodeGen
Core
+ GlobalISel
Support
)
Index: test/Verifier/test_copy.mir
===================================================================
--- /dev/null
+++ test/Verifier/test_copy.mir
@@ -0,0 +1,30 @@
+#RUN: not llc -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+# REQUIRES: global-isel, aarch64-registered-target
+--- |
+ ; ModuleID = 'test.ll'
+ source_filename = "test.ll"
+ target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+ target triple = "aarch64-unknown-unknown"
+
+ define i32 @test_copy(i32 %argc) {
+ ret i32 0
+ }
+
+...
+---
+name: test_copy
+legalized: true
+regBankSelected: false
+selected: false
+tracksRegLiveness: true
+registers:
+ - { id: 0, class: _, preferred-register: '' }
+liveins:
+body: |
+ bb.0:
+ liveins: %w0
+ ; This test is used to catch verifier errors with copys having mismatching sizes
+ ; CHECK: Bad machine code: Copy Instruction is illegal with mismatching sizes
+
+ %0(s8) = COPY %w0
+...
Index: lib/CodeGen/MachineVerifier.cpp
===================================================================
--- lib/CodeGen/MachineVerifier.cpp
+++ lib/CodeGen/MachineVerifier.cpp
@@ -28,6 +28,7 @@
#include "llvm/ADT/SetOperations.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/EHPersonalities.h"
+#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
#include "llvm/CodeGen/LiveStackAnalysis.h"
#include "llvm/CodeGen/LiveVariables.h"
@@ -943,6 +944,24 @@
MI);
break;
}
+ case TargetOpcode::COPY: {
+ const MachineOperand &DstOp = MI->getOperand(0);
+ const MachineOperand &SrcOp = MI->getOperand(1);
+ unsigned DstSize =
+ RegisterBankInfo::getSizeInBits(DstOp.getReg(), *MRI, *TRI);
+ unsigned SrcSize =
+ RegisterBankInfo::getSizeInBits(SrcOp.getReg(), *MRI, *TRI);
+ bool HasGenericType = MRI->getType(DstOp.getReg()).isValid() ||
+ MRI->getType(SrcOp.getReg()).isValid();
+ if (HasGenericType && (DstSize != SrcSize))
+ // Catch only obvious cases not involving subregs for now.
+ if (!DstOp.getSubReg() && !SrcOp.getSubReg()) {
+ report("Copy Instruction is illegal with mismatching sizes", MI);
+ errs() << "Def Size = " << DstSize << ", Src Size = " << SrcSize
+ << "\n";
+ }
+ break;
+ }
case TargetOpcode::STATEPOINT:
if (!MI->getOperand(StatepointOpers::IDPos).isImm() ||
!MI->getOperand(StatepointOpers::NBytesPos).isImm() ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37775.115075.patch
Type: text/x-patch
Size: 3099 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170913/e2adac30/attachment.bin>
More information about the llvm-commits
mailing list