Index: lib/CodeGen/MachineVerifier.cpp =================================================================== --- lib/CodeGen/MachineVerifier.cpp +++ lib/CodeGen/MachineVerifier.cpp @@ -1039,6 +1039,19 @@ MI); break; } + case TargetOpcode::G_BITCAST: { + LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); + LLT SrcTy = MRI->getType(MI->getOperand(1).getReg()); + if (!DstTy.isValid() || !SrcTy.isValid()) + break; + + if (SrcTy.isPointer() != DstTy.isPointer()) + report("bitcast cannot convert between pointers and other types", MI); + + if (SrcTy.getSizeInBits() != DstTy.getSizeInBits()) + report("bitcast sizes must match", MI); + break; + } case TargetOpcode::G_SEXT: case TargetOpcode::G_ZEXT: case TargetOpcode::G_ANYEXT: Index: test/Verifier/test_g_bitcast.mir =================================================================== --- /dev/null +++ test/Verifier/test_g_bitcast.mir @@ -0,0 +1,37 @@ +#RUN: not llc -mtriple=amdgcn-amd-amdhsa -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s +# REQUIRES: global-isel, amdgpu-registered-target + +--- +name: test_bitcast +legalized: true +regBankSelected: false +selected: false +tracksRegLiveness: true +liveins: +body: | + bb.0: + ; CHECK: Bad machine code: bitcast cannot convert between pointers and other types + %0:_(s64) = G_IMPLICIT_DEF + %1:_(p0) = G_BITCAST %0 + + ; CHECK: Bad machine code: bitcast cannot convert between pointers and other + %2:_(p0) = G_IMPLICIT_DEF + %3:_(s64) = G_BITCAST %2 + + ; CHECK: Bad machine code: bitcast sizes must match + %4:_(s32) = G_IMPLICIT_DEF + %5:_(s64) = G_BITCAST %4 + + ; CHECK: Bad machine code: bitcast sizes must match + %6:_(s32) = G_IMPLICIT_DEF + %7:_(<3 x s8>) = G_BITCAST %6 + + ; CHECK: Bad machine code: bitcast sizes must match + %8:_(p1) = G_IMPLICIT_DEF + %9:_(p3) = G_BITCAST %8 + + ; CHECK: Bad machine code: bitcast sizes must match + %10:_(p1) = G_IMPLICIT_DEF + %11:_(p3) = G_BITCAST %8 + +...