[GlobalISel] Support ConstantAsMetadata in IRTranslator
authorAleksandr Bezzubikov <aleksandr.bezzubikov@intel.com>
Tue, 21 Sep 2021 14:41:53 +0000 (10:41 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 21 Sep 2021 15:24:56 +0000 (11:24 -0400)
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.

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-metadata.ll

index bb74cb2..508dec6 100644 (file)
@@ -2384,10 +2384,15 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
       } else {
         MIB.addFPImm(cast<ConstantFP>(Arg.value()));
       }
-    } else if (auto MD = dyn_cast<MetadataAsValue>(Arg.value())) {
-      auto *MDN = dyn_cast<MDNode>(MD->getMetadata());
-      if (!MDN) // This was probably an MDString.
-        return false;
+    } else if (auto *MDVal = dyn_cast<MetadataAsValue>(Arg.value())) {
+      auto *MD = MDVal->getMetadata();
+      auto *MDN = dyn_cast<MDNode>(MD);
+      if (!MDN) {
+        if (auto *ConstMD = dyn_cast<ConstantAsMetadata>(MD))
+          MDN = MDNode::get(MF->getFunction().getContext(), ConstMD);
+        else // This was probably an MDString.
+          return false;
+      }
       MIB.addMetadata(MDN);
     } else {
       ArrayRef<Register> VRegs = getOrCreateVRegs(*Arg.value());
index 6a3b3b8..99a2875 100644 (file)
@@ -7,12 +7,17 @@ define i32 @reloc_constant() {
   ; 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 <raw_ptr_val>
+  ; 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