[llvm] 7a258c6 - [Bitcode] Move x86_intrcc upgrade to bitcode reader

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 4 01:31:38 PST 2022


Author: Nikita Popov
Date: 2022-03-04T10:30:50+01:00
New Revision: 7a258c6a3778b78935422a9ed0b6822fae123f32

URL: https://github.com/llvm/llvm-project/commit/7a258c6a3778b78935422a9ed0b6822fae123f32
DIFF: https://github.com/llvm/llvm-project/commit/7a258c6a3778b78935422a9ed0b6822fae123f32.diff

LOG: [Bitcode] Move x86_intrcc upgrade to bitcode reader

This upgrade requires access the legacy pointer element type, so
it needs to happen inside the bitcode reader.

Added: 
    

Modified: 
    llvm/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/lib/IR/AutoUpgrade.cpp
    llvm/test/Bitcode/x86_intr-upgrade.test

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index debb530d42dce..cba56802db63f 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -3601,6 +3601,16 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
     }
   }
 
+  if (Func->getCallingConv() == CallingConv::X86_INTR &&
+      !Func->arg_empty() && !Func->hasParamAttribute(0, Attribute::ByVal)) {
+    unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
+    Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
+    if (!ByValTy)
+      return error("Missing param element type for x86_intrcc upgrade");
+    Attribute NewAttr = Attribute::getWithByValType(Context, ByValTy);
+    Func->addParamAttr(0, NewAttr);
+  }
+
   MaybeAlign Alignment;
   if (Error Err = parseAlignmentValue(Record[5], Alignment))
     return Err;

diff  --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 6803fdb5d600d..da01227a4c4a4 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -4496,13 +4496,6 @@ void llvm::UpgradeFunctionAttributes(Function &F) {
     SFPV.visit(F);
   }
 
-  if (F.getCallingConv() == CallingConv::X86_INTR &&
-      !F.arg_empty() && !F.hasParamAttribute(0, Attribute::ByVal)) {
-    Type *ByValTy = F.getArg(0)->getType()->getPointerElementType();
-    Attribute NewAttr = Attribute::getWithByValType(F.getContext(), ByValTy);
-    F.addParamAttr(0, NewAttr);
-  }
-
   // Remove all incompatibile attributes from function.
   F.removeRetAttrs(AttributeFuncs::typeIncompatible(F.getReturnType()));
   for (auto &Arg : F.args())

diff  --git a/llvm/test/Bitcode/x86_intr-upgrade.test b/llvm/test/Bitcode/x86_intr-upgrade.test
index 30940be7d4396..1e96ce862b31c 100644
--- a/llvm/test/Bitcode/x86_intr-upgrade.test
+++ b/llvm/test/Bitcode/x86_intr-upgrade.test
@@ -1,4 +1,5 @@
-RUN: llvm-dis %p/Inputs/x86_intrcc_upgrade.bc -o - | FileCheck %s
+RUN: llvm-dis %p/Inputs/x86_intrcc_upgrade.bc -opaque-pointers=0 -o - | FileCheck %s
+RUN: llvm-dis %p/Inputs/x86_intrcc_upgrade.bc -opaque-pointers=1 -o - | FileCheck %s --check-prefix=OPAQUE
 
 Make sure we upgrade x86_intrcc to a byval with explicit type
 
@@ -9,3 +10,11 @@ CHECK: define x86_intrcc void @non_byval_ptr_struct(%struct* byval(%struct) %0)
 CHECK: declare x86_intrcc void @no_args_decl()
 CHECK: declare x86_intrcc void @non_byval_ptr_arg0_decl(i32* byval(i32))
 CHECK: declare x86_intrcc void @non_byval_ptr_struct_decl(%struct* byval(%struct))
+
+OPAQUE: define x86_intrcc void @no_args() {
+OPAQUE: define x86_intrcc void @non_byval_ptr_arg0(ptr byval(i32) %0)
+OPAQUE: define x86_intrcc void @non_byval_ptr_struct(ptr byval(%struct) %0)
+
+OPAQUE: declare x86_intrcc void @no_args_decl()
+OPAQUE: declare x86_intrcc void @non_byval_ptr_arg0_decl(ptr byval(i32))
+OPAQUE: declare x86_intrcc void @non_byval_ptr_struct_decl(ptr byval(%struct))


        


More information about the llvm-commits mailing list