diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2371,10 +2371,15 @@ } else { MIB.addFPImm(cast(Arg.value())); } - } else if (auto MD = dyn_cast(Arg.value())) { - auto *MDN = dyn_cast(MD->getMetadata()); - if (!MDN) // This was probably an MDString. - return false; + } else if (auto *MDVal = dyn_cast(Arg.value())) { + auto *MD = MDVal->getMetadata(); + auto *MDN = dyn_cast(MD); + if (!MDN) { + if (auto *ConstMD = dyn_cast(MD)) + MDN = MDNode::get(MF->getFunction().getContext(), ConstMD); + else // This was probably an MDString. + return false; + } MIB.addMetadata(MDN); } else { ArrayRef VRegs = getOrCreateVRegs(*Arg.value()); diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll @@ -7,12 +7,17 @@ ; CHECK: bb.1 (%ir-block.0): ; CHECK: liveins: $sgpr30_sgpr31 ; CHECK: [[COPY:%[0-9]+]]:sgpr_64 = COPY $sgpr30_sgpr31 - ; CHECK: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), !0 - ; CHECK: $vgpr0 = COPY [[INT]](s32) + ; CHECK: [[INT0:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), !0 + ; We cannot have any specific metadata check here as ConstantAsMetadata is printed as + ; CHECK: [[INT1:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), <0x{{[0-9a-f]+}}> + ; CHECK: [[SUM:%[0-9]+]]:_(s32) = G_ADD [[INT0]], [[INT1]] + ; CHECK: $vgpr0 = COPY [[SUM]](s32) ; CHECK: [[COPY1:%[0-9]+]]:ccr_sgpr_64 = COPY [[COPY]] ; CHECK: S_SETPC_B64_return [[COPY1]], implicit $vgpr0 - %val = call i32 @llvm.amdgcn.reloc.constant(metadata !0) - ret i32 %val + %val0 = call i32 @llvm.amdgcn.reloc.constant(metadata !0) + %val1 = call i32 @llvm.amdgcn.reloc.constant(metadata i32 4) + %res = add i32 %val0, %val1 + ret i32 %res } declare i32 @llvm.amdgcn.reloc.constant(metadata) #0