On Mon, Sep 21, 2015 at 11:03 AM, Duncan P. N. Exon Smith < dexonsm...@apple.com> wrote:
> > > 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.) > > Removing the conflicting attributes should fix the crash too. I'll come up with a patch and commit it shortly. > > 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