[PATCH] D19515: [PGO] Prohibit the recording the function address if it's internal and COMDAT.

Xinliang David Li via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 27 13:41:54 PDT 2016


Ok.

David

On Wed, Apr 27, 2016 at 1:18 PM, Rong Xu <xur at google.com> wrote:

> xur updated this revision to Diff 55302.
> xur added a comment.
>
> I did not find an easy way to do the check-not match with the sub string.
> ; CHECK-NOT: @__profd__stdin__foo foo
> obviously not working.
>
> the best approximation I can think of is to use CHECK-NOT with CHECK-SAME.
>
>
> http://reviews.llvm.org/D19515
>
> Files:
>   lib/Transforms/Instrumentation/InstrProfiling.cpp
>   test/Transforms/PGOProfile/comdat_internal.ll
>
> Index: test/Transforms/PGOProfile/comdat_internal.ll
> ===================================================================
> --- test/Transforms/PGOProfile/comdat_internal.ll
> +++ test/Transforms/PGOProfile/comdat_internal.ll
> @@ -0,0 +1,25 @@
> +; RUN: opt < %s -pgo-instr-gen -instrprof -S | FileCheck %s
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +$foo = comdat any
> +
> +; CHECK: $__llvm_profile_raw_version = comdat any
> +; CHECK: $__profv__stdin__foo = comdat any
> +
> + at bar = global i32 ()* @foo, align 8
> +
> +; CHECK: @__llvm_profile_raw_version = constant i64 {{[0-9]+}}, comdat
> +; CHECK: @__profn__stdin__foo = private constant [11 x i8] c"<stdin>:foo"
> +; CHECK: @__profc__stdin__foo = private global [1 x i64] zeroinitializer,
> section "__llvm_prf_cnts", comdat($__profv__stdin__foo), align 8
> +; CHECK: @__profd__stdin__foo = private global { i64, i64, i64*, i8*,
> i8*, i32, [1 x i16] } { i64 -5640069336071256030, i64 12884901887, i64*
> getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__stdin__foo, i32 0,
> i32 0), i8*
> +; CHECK-NOT: bitcast (i32 ()* @foo to i8*)
> +; CHECK-SAME: null
> +; CHECK-SAME: , i8* null, i32 1, [1 x i16] zeroinitializer }, section
> "__llvm_prf_data", comdat($__profv__stdin__foo), align 8
> +; CHECK: @__llvm_prf_nm = private constant [21 x i8]
> c"\0B\13x\DA\B3).I\C9\CC\B3\B3J\CB\CF\07\00\18a\04\1B", section
> "__llvm_prf_names"
> +; CHECK: @llvm.used = appending global [2 x i8*] [i8* bitcast ({ i64,
> i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd__stdin__foo to i8*), i8*
> getelementptr inbounds ([21 x i8], [21 x i8]* @__llvm_prf_nm, i32 0, i32
> 0)], section "llvm.metadata"
> +
> +define internal i32 @foo() comdat {
> +entry:
> +  ret i32 1
> +}
> Index: lib/Transforms/Instrumentation/InstrProfiling.cpp
> ===================================================================
> --- lib/Transforms/Instrumentation/InstrProfiling.cpp
> +++ lib/Transforms/Instrumentation/InstrProfiling.cpp
> @@ -237,6 +237,11 @@
>    if (!F->hasLinkOnceLinkage() && !F->hasLocalLinkage() &&
>        !F->hasAvailableExternallyLinkage())
>      return true;
> +  // Prohibit function address recording if the function is both internal
> and
> +  // COMDAT. This avoids the profile data variable referencing internal
> symbols
> +  // in COMDAT.
> +  if (F->hasLocalLinkage() && F->hasComdat())
> +    return false;
>    // Check uses of this function for other than direct calls or invokes
> to it.
>    return F->hasAddressTaken();
>  }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160427/21456cdb/attachment.html>


More information about the llvm-commits mailing list