[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