1; RUN: opt -S -passes='cgscc(inline,instcombine)' < %s | FileCheck %s 2; RUN: opt -S -intra-scc-cost-multiplier=3 -passes='cgscc(inline,instcombine)' < %s | FileCheck %s --check-prefix=THREE 3 4; We use call to a dummy function to avoid inlining test1 into test2 or vice 5; versa, such that we aren't left with a trivial cycle, as trivial cycles are 6; special-cased to never be inlined. 7; However, InstCombine will eliminate these calls after inlining, and thus 8; make the functions eligible for inlining in their callers. 9declare void @dummy() readnone nounwind willreturn 10 11define void @test1() { 12; CHECK-LABEL: define void @test1( 13; CHECK-NEXT: call void @test2() 14; CHECK-NEXT: call void @test2() 15; CHECK-NEXT: ret void 16; 17 call void @test2() 18 call void @test2() 19 call void @dummy() 20 call void @dummy() 21 call void @dummy() 22 call void @dummy() 23 call void @dummy() 24 call void @dummy() 25 call void @dummy() 26 call void @dummy() 27 call void @dummy() 28 call void @dummy() 29 call void @dummy() 30 ret void 31} 32 33define void @test2() { 34; CHECK-LABEL: define void @test2( 35; CHECK-NEXT: call void @test3() 36; CHECK-NEXT: call void @test3() 37; CHECK-NEXT: ret void 38; 39 call void @test3() noinline 40 call void @test3() noinline 41 call void @dummy() 42 call void @dummy() 43 call void @dummy() 44 call void @dummy() 45 call void @dummy() 46 call void @dummy() 47 call void @dummy() 48 call void @dummy() 49 call void @dummy() 50 call void @dummy() 51 call void @dummy() 52 ret void 53} 54 55define void @test3() { 56; CHECK-LABEL: define void @test3( 57; CHECK-NEXT: call void @test1() 58; CHECK-NEXT: call void @test1() 59; CHECK-NEXT: ret void 60; 61 call void @test1() 62 call void @test1() 63 call void @dummy() 64 call void @dummy() 65 call void @dummy() 66 call void @dummy() 67 call void @dummy() 68 call void @dummy() 69 call void @dummy() 70 call void @dummy() 71 call void @dummy() 72 call void @dummy() 73 call void @dummy() 74 ret void 75} 76 77; The inlined call sites should have the "function-inline-cost-multiplier" call site attribute. 78define void @f() { 79; CHECK-LABEL: define void @f( 80; CHECK-NEXT: call void @test3() #[[COSTMULT:[0-9]+]] 81; CHECK-NEXT: call void @test3() #[[COSTMULT]] 82; CHECK-NEXT: call void @test3() #[[COSTMULT]] 83; CHECK-NEXT: call void @test3() #[[COSTMULT]] 84; CHECK-NEXT: call void @test3() #[[COSTMULT]] 85; CHECK-NEXT: call void @test3() #[[COSTMULT]] 86; CHECK-NEXT: call void @test3() #[[COSTMULT]] 87; CHECK-NEXT: call void @test3() #[[COSTMULT]] 88; CHECK-NEXT: ret void 89; 90 call void @test1() 91 call void @test1() 92 ret void 93} 94 95; CHECK: [[COSTMULT]] = { noinline "function-inline-cost-multiplier"="4" } 96; THREE: "function-inline-cost-multiplier"="9" 97