1; RUN: opt < %s -inline -S | FileCheck %s 2 3; Check that functions with "returns_twice" calls are only inlined, 4; if they are themselves marked as such. 5 6declare i32 @a() returns_twice 7 8define i32 @inner1() { 9entry: 10 %call = call i32 @a() returns_twice 11 %add = add nsw i32 1, %call 12 ret i32 %add 13} 14 15define i32 @outer1() { 16entry: 17; CHECK-LABEL: define i32 @outer1( 18; CHECK: call i32 @inner1() 19 %call = call i32 @inner1() 20 %add = add nsw i32 1, %call 21 ret i32 %add 22} 23 24define i32 @inner2() returns_twice { 25entry: 26 %call = call i32 @a() returns_twice 27 %add = add nsw i32 1, %call 28 ret i32 %add 29} 30 31define i32 @outer2() { 32entry: 33; CHECK-LABEL: define i32 @outer2( 34; CHECK: call i32 @a() 35 %call = call i32 @inner2() returns_twice 36 %add = add nsw i32 1, %call 37 ret i32 %add 38} 39 40define i32 @inner3() { 41entry: 42 %invoke = invoke i32 @a() returns_twice 43 to label %cont unwind label %lpad 44 45cont: 46 %add = add nsw i32 1, %invoke 47 ret i32 %add 48 49lpad: 50 %lp = landingpad i32 personality i8* null cleanup 51 resume i32 %lp 52} 53 54define i32 @outer3() { 55entry: 56; CHECK-LABEL: define i32 @outer3( 57; CHECK: call i32 @inner3() 58 %call = call i32 @inner3() 59 %add = add nsw i32 1, %call 60 ret i32 %add 61} 62 63define i32 @inner4() returns_twice { 64entry: 65 %invoke = invoke i32 @a() returns_twice 66 to label %cont unwind label %lpad 67 68cont: 69 %add = add nsw i32 1, %invoke 70 ret i32 %add 71 72lpad: 73 %lp = landingpad i32 personality i8* null cleanup 74 resume i32 %lp 75} 76 77define i32 @outer4() { 78entry: 79; CHECK-LABEL: define i32 @outer4( 80; CHECK: invoke i32 @a() 81 %call = call i32 @inner4() returns_twice 82 %add = add nsw i32 1, %call 83 ret i32 %add 84} 85