> On 2015-Sep-21, at 01:42, Akira Hatanaka via cfe-commits > <cfe-commits@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits