[PATCH] D13004: Create a new attribute set when the definition is parsed after a declaration of a function
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 21 11:03:10 PDT 2015
> On 2015-Sep-21, at 01:42, Akira Hatanaka via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>
> ahatanak created this revision.
> ahatanak added a subscriber: cfe-commits.
>
> An assert is triggered when the test case program is compiled with -Oz:
>
> Assertion failed: (!F->hasFnAttribute(llvm::Attribute::OptimizeForSize) && "OptimizeNone and OptimizeForSize on same function!"), function SetLLVMFunctionAttributesForDefinition, file /Users/ahatanaka/projects/llvm/git/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp, line 831.
>
> This patch fixes the assert by clearing the attribute set attached to IR function foo1 and creating it again when the function's definition is parsed.
>
> http://reviews.llvm.org/D13004
>
> Files:
> lib/CodeGen/CodeGenModule.cpp
> test/CodeGen/attr-func-def.c
>
> Index: test/CodeGen/attr-func-def.c
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/attr-func-def.c
> @@ -0,0 +1,18 @@
> +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.10.0 -emit-llvm -Oz -o - %s | FileCheck %s
> +
> +// CHECK: define i32 @foo2(i32 %a) [[ATTRS2:#[0-9]+]] {
> +// CHECK: define i32 @foo1(i32 %a) [[ATTRS1:#[0-9]+]] {
> +
> +int foo1(int);
> +
> +int foo2(int a) {
> + return foo1(a + 2);
> +}
> +
> +__attribute__((optnone))
> +int foo1(int a) {
> + return a + 1;
> +}
> +
> +// CHECK: attributes [[ATTRS2]] = { {{.*}}optsize{{.*}} }
> +// CHECK: attributes [[ATTRS1]] = { {{.*}}optnone{{.*}} }
> Index: lib/CodeGen/CodeGenModule.cpp
> ===================================================================
> --- lib/CodeGen/CodeGenModule.cpp
> +++ lib/CodeGen/CodeGenModule.cpp
> @@ -2643,6 +2643,11 @@
>
> maybeSetTrivialComdat(*D, *Fn);
>
> + // Create the attribute set of the function definition because it might differ
> + // from that of the function declaration. SetLLVMFunctionAttributes cannot be
> + // called after GenerateCode is called as it might remove the parameter
> + // attributes attached by GenerateCode.
> + SetLLVMFunctionAttributes(D, FI, Fn);
I'm a bit worried this could have a compile-time impact, since it will
regenerate all the attributes. Why don't you just remove optsize if it's
attached to the function?
(All this attribute-setting is pretty horrible; one of us should fix it
soon.)
> CodeGenFunction(*this).GenerateCode(D, Fn, FI);
>
> setFunctionDefinitionAttributes(D, Fn);
>
>
> <D13004.35214.patch>_______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list