1c50e6f59SWolfgang Pieb; Check the inliner doesn't inline a function with a stack size exceeding a given limit. 2e5369823SRoman Lebedev; RUN: opt < %s -passes=inline -S | FileCheck --check-prefixes=ALL,UNLIMITED %s 3e5369823SRoman Lebedev; RUN: opt < %s -passes=inline -S -inline-max-stacksize=256 | FileCheck --check-prefixes=ALL,LIMITED %s 4c50e6f59SWolfgang Pieb 5*151602c7SNikita Popovdeclare void @init(ptr) 6c50e6f59SWolfgang Pieb 7c50e6f59SWolfgang Piebdefine internal i32 @foo() { 8c50e6f59SWolfgang Pieb %1 = alloca [65 x i32], align 16 9*151602c7SNikita Popov call void @init(ptr %1) 10*151602c7SNikita Popov %2 = load i32, ptr %1, align 4 11*151602c7SNikita Popov ret i32 %2 12c50e6f59SWolfgang Pieb} 13c50e6f59SWolfgang Pieb 147ddfb4dfSWolfgang Piebdefine i32 @barNoAttr() { 15c50e6f59SWolfgang Pieb %1 = call i32 @foo() 16c50e6f59SWolfgang Pieb ret i32 %1 177ddfb4dfSWolfgang Pieb; ALL: define {{.*}}@barNoAttr 18c50e6f59SWolfgang Pieb; ALL-NOT: define 19c50e6f59SWolfgang Pieb; UNLIMITED-NOT: call {{.*}}@foo 20c50e6f59SWolfgang Pieb; LIMITED: call {{.*}}@foo 21c50e6f59SWolfgang Pieb} 22c50e6f59SWolfgang Pieb 23c50e6f59SWolfgang Pieb; Check that, under the imposed limit, baz() inlines bar(), but not foo(). 247ddfb4dfSWolfgang Piebdefine i32 @bazNoAttr() { 257ddfb4dfSWolfgang Pieb %1 = call i32 @barNoAttr() 26c50e6f59SWolfgang Pieb ret i32 %1 27c50e6f59SWolfgang Pieb; ALL: define {{.*}}@baz 287ddfb4dfSWolfgang Pieb; UNLIMITED-NOT: call {{.*}}@barNoAttr 29c50e6f59SWolfgang Pieb; UNLIMITED-NOT: call {{.*}}@foo 307ddfb4dfSWolfgang Pieb; LIMITED-NOT: call {{.*}}@barNoAttr 31c50e6f59SWolfgang Pieb; LIMITED: call {{.*}}@foo 32c50e6f59SWolfgang Pieb} 337ddfb4dfSWolfgang Pieb 347ddfb4dfSWolfgang Pieb; Check that the function attribute prevents inlining of foo(). 357ddfb4dfSWolfgang Piebdefine i32 @barAttr() #0 { 367ddfb4dfSWolfgang Pieb %1 = call i32 @foo() 377ddfb4dfSWolfgang Pieb ret i32 %1 387ddfb4dfSWolfgang Pieb; ALL: define {{.*}}@barAttr 397ddfb4dfSWolfgang Pieb; ALL-NOT: define 407ddfb4dfSWolfgang Pieb; ALL: call {{.*}}@foo 417ddfb4dfSWolfgang Pieb} 427ddfb4dfSWolfgang Pieb 437ddfb4dfSWolfgang Pieb; Check that the commandline option overrides the function attribute. 447ddfb4dfSWolfgang Piebdefine i32 @bazAttr() #1 { 457ddfb4dfSWolfgang Pieb %1 = call i32 @barAttr() 467ddfb4dfSWolfgang Pieb ret i32 %1 477ddfb4dfSWolfgang Pieb; ALL: define {{.*}}@bazAttr 487ddfb4dfSWolfgang Pieb; UNLIMITED-NOT: call {{.*}}@barAttr 497ddfb4dfSWolfgang Pieb; UNLIMITED-NOT: call {{.*}}@foo 507ddfb4dfSWolfgang Pieb; LIMITED: call {{.*}}@foo 517ddfb4dfSWolfgang Pieb} 527ddfb4dfSWolfgang Pieb 537ddfb4dfSWolfgang Piebattributes #0 = { "inline-max-stacksize"="256" } 547ddfb4dfSWolfgang Piebattributes #1 = { "inline-max-stacksize"="512" } 55