Skip to content

Commit 624e4d0

Browse files
zuban32arsenm
authored andcommitted
[GlobalISel] Support ConstantAsMetadata in IRTranslator
When using instructions which have a MetadataAsValue argument (e.g. some target-specific intrinsics) MD canonicalization strips internal MDNodes with a single ConstantAsMetadata child. That prevented IRTranslator from the proper translation of such a calls.
1 parent 8b5236d commit 624e4d0

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,10 +2384,15 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
23842384
} else {
23852385
MIB.addFPImm(cast<ConstantFP>(Arg.value()));
23862386
}
2387-
} else if (auto MD = dyn_cast<MetadataAsValue>(Arg.value())) {
2388-
auto *MDN = dyn_cast<MDNode>(MD->getMetadata());
2389-
if (!MDN) // This was probably an MDString.
2390-
return false;
2387+
} else if (auto *MDVal = dyn_cast<MetadataAsValue>(Arg.value())) {
2388+
auto *MD = MDVal->getMetadata();
2389+
auto *MDN = dyn_cast<MDNode>(MD);
2390+
if (!MDN) {
2391+
if (auto *ConstMD = dyn_cast<ConstantAsMetadata>(MD))
2392+
MDN = MDNode::get(MF->getFunction().getContext(), ConstMD);
2393+
else // This was probably an MDString.
2394+
return false;
2395+
}
23912396
MIB.addMetadata(MDN);
23922397
} else {
23932398
ArrayRef<Register> VRegs = getOrCreateVRegs(*Arg.value());

llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ define i32 @reloc_constant() {
77
; CHECK: bb.1 (%ir-block.0):
88
; CHECK: liveins: $sgpr30_sgpr31
99
; CHECK: [[COPY:%[0-9]+]]:sgpr_64 = COPY $sgpr30_sgpr31
10-
; CHECK: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), !0
11-
; CHECK: $vgpr0 = COPY [[INT]](s32)
10+
; CHECK: [[INT0:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), !0
11+
; We cannot have any specific metadata check here as ConstantAsMetadata is printed as <raw_ptr_val>
12+
; CHECK: [[INT1:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.reloc.constant), <0x{{[0-9a-f]+}}>
13+
; CHECK: [[SUM:%[0-9]+]]:_(s32) = G_ADD [[INT0]], [[INT1]]
14+
; CHECK: $vgpr0 = COPY [[SUM]](s32)
1215
; CHECK: [[COPY1:%[0-9]+]]:ccr_sgpr_64 = COPY [[COPY]]
1316
; CHECK: S_SETPC_B64_return [[COPY1]], implicit $vgpr0
14-
%val = call i32 @llvm.amdgcn.reloc.constant(metadata !0)
15-
ret i32 %val
17+
%val0 = call i32 @llvm.amdgcn.reloc.constant(metadata !0)
18+
%val1 = call i32 @llvm.amdgcn.reloc.constant(metadata i32 4)
19+
%res = add i32 %val0, %val1
20+
ret i32 %res
1621
}
1722

1823
declare i32 @llvm.amdgcn.reloc.constant(metadata) #0

0 commit comments

Comments
 (0)