[llvm] d5a4d6a - [BitcodeReader] propagateAttributeTypes(): fix opaque pointer handling

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 28 11:07:12 PST 2021


Author: Roman Lebedev
Date: 2021-12-28T22:06:51+03:00
New Revision: d5a4d6a4974a34092f161b0d23c3376e0f9e33ae

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

LOG: [BitcodeReader] propagateAttributeTypes(): fix opaque pointer handling

Can't get the pointee type of an opaque pointer,
but in that case said attributes must already be typed,
so just don't try to rewrite them if they already are.

Added: 
    

Modified: 
    llvm/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/test/Bitcode/attributes.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index f5a878f8788a7..1684f04d5ea82 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -3857,7 +3857,8 @@ void BitcodeReader::propagateAttributeTypes(CallBase *CB,
   for (unsigned i = 0; i != CB->arg_size(); ++i) {
     for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
                                      Attribute::InAlloca}) {
-      if (!CB->paramHasAttr(i, Kind))
+      if (!CB->paramHasAttr(i, Kind) ||
+          CB->getParamAttr(i, Kind).getValueAsType())
         continue;
 
       CB->removeParamAttr(i, Kind);

diff  --git a/llvm/test/Bitcode/attributes.ll b/llvm/test/Bitcode/attributes.ll
index 5a24b097beb44..ec4f903e710e2 100644
--- a/llvm/test/Bitcode/attributes.ll
+++ b/llvm/test/Bitcode/attributes.ll
@@ -1,4 +1,5 @@
-; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+; RUN: llvm-as < %s | llvm-dis | FileCheck %s --check-prefixes=CHECK,CHECK-TYPED
+; RUN: llvm-as -opaque-pointers < %s | llvm-dis -opaque-pointers | FileCheck %s --check-prefixes=CHECK,CHECK-OPAQUE
 ; RUN: verify-uselistorder < %s
 ; PR12696
 
@@ -27,7 +28,8 @@ define void @f4(i8 inreg %0)
 }
 
 define void @f5(i8* sret(i8) %0)
-; CHECK: define void @f5(i8* sret(i8) %0)
+; CHECK-TYPED: define void @f5(i8* sret(i8) %0)
+; CHECK-OPAQUE: define void @f5(ptr sret(i8) %0)
 {
         ret void;
 }
@@ -39,19 +41,22 @@ define void @f6() nounwind
 }
 
 define void @f7(i8* noalias %0)
-; CHECK: define void @f7(i8* noalias %0)
+; CHECK-TYPED: define void @f7(i8* noalias %0)
+; CHECK-OPAQUE: define void @f7(ptr noalias %0)
 {
         ret void;
 }
 
 define void @f8(i8* byval(i8) %0)
-; CHECK: define void @f8(i8* byval(i8) %0)
+; CHECK-TYPED: define void @f8(i8* byval(i8) %0)
+; CHECK-OPAQUE: define void @f8(ptr byval(i8) %0)
 {
         ret void;
 }
 
 define void @f9(i8* nest %0)
-; CHECK: define void @f9(i8* nest %0)
+; CHECK-TYPED: define void @f9(i8* nest %0)
+; CHECK-OPAQUE: define void @f9(ptr nest %0)
 {
         ret void;
 }
@@ -99,13 +104,15 @@ define void @f16() sspreq
 }
 
 define void @f17(i8* align 4 %0)
-; CHECK: define void @f17(i8* align 4 %0)
+; CHECK-TYPED: define void @f17(i8* align 4 %0)
+; CHECK-OPAQUE: define void @f17(ptr align 4 %0)
 {
         ret void;
 }
 
 define void @f18(i8* nocapture %0)
-; CHECK: define void @f18(i8* nocapture %0)
+; CHECK-TYPED: define void @f18(i8* nocapture %0)
+; CHECK-OPAQUE: define void @f18(ptr nocapture %0)
 {
         ret void;
 }
@@ -215,12 +222,14 @@ define void @f35() optnone noinline
 }
 
 define void @f36(i8* inalloca(i8) %0) {
-; CHECK: define void @f36(i8* inalloca(i8) %0) {
+; CHECK-TYPED: define void @f36(i8* inalloca(i8) %0) {
+; CHECK-OPAQUE: define void @f36(ptr inalloca(i8) %0) {
         ret void
 }
 
 define nonnull i8* @f37(i8* nonnull %a) {
-; CHECK: define nonnull i8* @f37(i8* nonnull %a) {
+; CHECK-TYPED: define nonnull i8* @f37(i8* nonnull %a) {
+; CHECK-OPAQUE: define nonnull ptr @f37(ptr nonnull %a) {
         ret i8* %a
 }
 
@@ -231,21 +240,25 @@ define void @f38() unnamed_addr jumptable {
 }
 
 define dereferenceable(2) i8* @f39(i8* dereferenceable(1) %a) {
-; CHECK: define dereferenceable(2) i8* @f39(i8* dereferenceable(1) %a) {
+; CHECK-TYPED: define dereferenceable(2) i8* @f39(i8* dereferenceable(1) %a) {
+; CHECK-OPAQUE: define dereferenceable(2) ptr @f39(ptr dereferenceable(1) %a) {
         ret i8* %a
 }
 
 define dereferenceable(18446744073709551606) i8* @f40(i8* dereferenceable(18446744073709551615) %a) {
-; CHECK: define dereferenceable(18446744073709551606) i8* @f40(i8* dereferenceable(18446744073709551615) %a) {
+; CHECK-TYPED: define dereferenceable(18446744073709551606) i8* @f40(i8* dereferenceable(18446744073709551615) %a) {
+; CHECK-OPAQUE: define dereferenceable(18446744073709551606) ptr @f40(ptr dereferenceable(18446744073709551615) %a) {
         ret i8* %a
 }
 
 define void @f41(i8* align 32 %0, double* align 64 %1) {
-; CHECK: define void @f41(i8* align 32 %0, double* align 64 %1) {
+; CHECK-TYPED: define void @f41(i8* align 32 %0, double* align 64 %1) {
+; CHECK-OPAQUE: define void @f41(ptr align 32 %0, ptr align 64 %1) {
         ret void
 }
 
-; CHECK: define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo)
+; CHECK-TYPED: define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo)
+; CHECK-OPAQUE: define dereferenceable_or_null(8) ptr @f42(ptr dereferenceable_or_null(8) %foo)
 define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo) {
  entry:
   ret i8* %foo
@@ -287,19 +300,22 @@ define void @f49() inaccessiblemem_or_argmemonly {
   ret void
 }
 
-; CHECK: define void @f50(i8* swiftself %0)
+; CHECK-TYPED: define void @f50(i8* swiftself %0)
+; CHECK-OPAQUE: define void @f50(ptr swiftself %0)
 define void @f50(i8* swiftself %0)
 {
   ret void;
 }
 
-; CHECK: define i32 @f51(i8** swifterror %0)
+; CHECK-TYPED: define i32 @f51(i8** swifterror %0)
+; CHECK-OPAQUE: define i32 @f51(ptr swifterror %0)
 define i32 @f51(i8** swifterror %0)
 {
   ret i32 0
 }
 
-; CHECK: define i32 @f52(i32 %0, i8** swifterror %1)
+; CHECK-TYPED: define i32 @f52(i32 %0, i8** swifterror %1)
+; CHECK-OPAQUE: define i32 @f52(i32 %0, ptr swifterror %1)
 define i32 @f52(i32 %0, i8** swifterror %1)
 {
   ret i32 0
@@ -318,12 +334,14 @@ entry:
   ret float 1.0
 }
 
-; CHECK: define i8* @f54(i32 %0) #30
+; CHECK-TYPED: define i8* @f54(i32 %0) #30
+; CHECK-OPAQUE: define ptr @f54(i32 %0) #30
 define i8* @f54(i32 %0) allocsize(0) {
   ret i8* null
 }
 
-; CHECK: define i8* @f55(i32 %0, i32 %1) #31
+; CHECK-TYPED: define i8* @f55(i32 %0, i32 %1) #31
+; CHECK-OPAQUE: define ptr @f55(i32 %0, i32 %1) #31
 define i8* @f55(i32 %0, i32 %1) allocsize(0, 1) {
   ret i8* null
 }
@@ -374,7 +392,8 @@ define void @f63() sanitize_memtag
   ret void
 }
 
-; CHECK: define void @f64(i32* preallocated(i32) %a)
+; CHECK-TYPED: define void @f64(i32* preallocated(i32) %a)
+; CHECK-OPAQUE: define void @f64(ptr preallocated(i32) %a)
 define void @f64(i32* preallocated(i32) %a)
 {
   ret void
@@ -392,7 +411,8 @@ define noundef i32 @f66(i32 noundef %a)
   ret i32 %a
 }
 
-; CHECK: define void @f67(i32* byref(i32) %a)
+; CHECK-TYPED: define void @f67(i32* byref(i32) %a)
+; CHECK-OPAQUE: define void @f67(ptr byref(i32) %a)
 define void @f67(i32* byref(i32) %a)
 {
   ret void
@@ -440,7 +460,8 @@ define void @f74() vscale_range(1,0)
   ret void
 }
 
-; CHECK: define void @f76(i8* swiftasync %0)
+; CHECK-TYPED: define void @f76(i8* swiftasync %0)
+; CHECK-OPAQUE: define void @f76(ptr swiftasync %0)
 define void @f76(i8* swiftasync %0)
 {
   ret void;
@@ -460,7 +481,8 @@ define void @f78() noprofile
 
 declare void @llvm.some.intrinsic(i32*)
 define void @f79() {
-; CHECK: call void @llvm.some.intrinsic(i32* elementtype(i32) null)
+; CHECK-TYPED: call void @llvm.some.intrinsic(i32* elementtype(i32) null)
+; CHECK-OPAQUE: call void @llvm.some.intrinsic(ptr elementtype(i32) null)
   call void @llvm.some.intrinsic(i32* elementtype(i32) null)
   ret void
 }
@@ -471,6 +493,23 @@ define void @f80() disable_sanitizer_instrumentation
         ret void;
 }
 
+define void @f81(i8** sret(i8*) %0)
+; CHECK-TYPED: define void @f81(i8** sret(i8*) %0)
+; CHECK-OPAQUE: define void @f81(ptr sret(ptr) %0)
+{
+        ret void;
+}
+
+define void @f82(i32* %0)
+; CHECK-TYPED: define void @f82(i32* %0)
+; CHECK-OPAQUE: define void @f82(ptr %0)
+{
+; CHECK-TYPED: call void @llvm.some.intrinsic(i32* sret(i32) %0)
+; CHECK-OPAQUE: call void @llvm.some.intrinsic(ptr sret(i32) %0)
+        call void @llvm.some.intrinsic(i32* sret(i32) %0)
+        ret void;
+}
+
 ; CHECK: attributes #0 = { noreturn }
 ; CHECK: attributes #1 = { nounwind }
 ; CHECK: attributes #2 = { readnone }


        


More information about the llvm-commits mailing list