summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachineVerifier.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-29 23:29:00 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-29 23:29:00 +0000
commitd45b03bb81459180a387c9522edd4bbbe391cf7e (patch)
treed0aa33f50c62fb9ce1e2a3b9fcb9e8e5639d4b94 /llvm/lib/CodeGen/MachineVerifier.cpp
parent7f50dfa6fce5a7cc4c74534ea37f6b153ba1d394 (diff)
downloadbcm5719-llvm-d45b03bb81459180a387c9522edd4bbbe391cf7e.tar.gz
bcm5719-llvm-d45b03bb81459180a387c9522edd4bbbe391cf7e.zip
GlobalISel: Verify pointer casts
Not sure if the old AArch64 tests should be just deleted or not. llvm-svn: 352562
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineVerifier.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 54d2bb4a032..fb15c178307 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -1056,6 +1056,50 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
report("bitcast sizes must match", MI);
break;
}
+ case TargetOpcode::G_INTTOPTR:
+ case TargetOpcode::G_PTRTOINT:
+ case TargetOpcode::G_ADDRSPACE_CAST: {
+ LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
+ LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
+ if (!DstTy.isValid() || !SrcTy.isValid())
+ break;
+
+ if (DstTy.isVector() != SrcTy.isVector())
+ report("pointer casts must be all-vector or all-scalar", MI);
+ else {
+ if (DstTy.isVector() ) {
+ if (DstTy.getNumElements() != SrcTy.getNumElements()) {
+ report("pointer casts must preserve number of elements", MI);
+ break;
+ }
+ }
+ }
+
+ DstTy = DstTy.getScalarType();
+ SrcTy = SrcTy.getScalarType();
+
+ if (MI->getOpcode() == TargetOpcode::G_INTTOPTR) {
+ if (!DstTy.isPointer())
+ report("inttoptr result type must be a pointer", MI);
+ if (SrcTy.isPointer())
+ report("inttoptr source type must not be a pointer", MI);
+ } else if (MI->getOpcode() == TargetOpcode::G_PTRTOINT) {
+ if (!SrcTy.isPointer())
+ report("ptrtoint source type must be a pointer", MI);
+ if (DstTy.isPointer())
+ report("ptrtoint result type must not be a pointer", MI);
+ } else {
+ assert(MI->getOpcode() == TargetOpcode::G_ADDRSPACE_CAST);
+ if (!SrcTy.isPointer() || !DstTy.isPointer())
+ report("addrspacecast types must be pointers", MI);
+ else {
+ if (SrcTy.getAddressSpace() == DstTy.getAddressSpace())
+ report("addrspacecast must convert different address spaces", MI);
+ }
+ }
+
+ break;
+ }
case TargetOpcode::G_SEXT:
case TargetOpcode::G_ZEXT:
case TargetOpcode::G_ANYEXT:
OpenPOWER on IntegriCloud