diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-29 23:29:00 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-29 23:29:00 +0000 |
commit | d45b03bb81459180a387c9522edd4bbbe391cf7e (patch) | |
tree | d0aa33f50c62fb9ce1e2a3b9fcb9e8e5639d4b94 /llvm/lib/CodeGen/MachineVerifier.cpp | |
parent | 7f50dfa6fce5a7cc4c74534ea37f6b153ba1d394 (diff) | |
download | bcm5719-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.cpp | 44 |
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: |