brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · a06ec1a Raw
115 lines · plain
1; RUN: opt -passes=inline -inline-threshold=0 -inline-all-viable-calls -S < %s | FileCheck %s2 3; Check that viable calls that are beyond the cost threshold are still inlined.4define i32 @callee_simple(i32 %x) {5  %1 = add i32 %x, 16  %2 = mul i32 %1, 27  %3 = sub i32 %2, 18  %4 = add i32 %3, 39  %5 = mul i32 %4, 210  %6 = sub i32 %5, 211  %7 = add i32 %6, 112  ret i32 %713}14 15; Check that user decisions are respected.16define i32 @callee_alwaysinline(i32 %x) alwaysinline {17  %sub = sub i32 %x, 318  ret i32 %sub19}20 21define i32 @callee_noinline(i32 %x) noinline {22  %div = sdiv i32 %x, 223  ret i32 %div24}25 26define i32 @callee_optnone(i32 %x) optnone noinline {27  %rem = srem i32 %x, 228  ret i32 %rem29}30 31define i32 @caller(i32 %a) {32; CHECK-LABEL: define i32 @caller(33; CHECK-SAME: i32 [[A:%.*]]) {34; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[A]], 135; CHECK-NEXT:    [[TMP8:%.*]] = mul i32 [[TMP7]], 236; CHECK-NEXT:    [[TMP3:%.*]] = sub i32 [[TMP8]], 137; CHECK-NEXT:    [[TMP4:%.*]] = add i32 [[TMP3]], 338; CHECK-NEXT:    [[TMP5:%.*]] = mul i32 [[TMP4]], 239; CHECK-NEXT:    [[TMP6:%.*]] = sub i32 [[TMP5]], 240; CHECK-NEXT:    [[ADD_I:%.*]] = add i32 [[TMP6]], 141; CHECK-NEXT:    [[SUB_I:%.*]] = sub i32 [[ADD_I]], 342; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @callee_noinline(i32 [[SUB_I]])43; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @callee_optnone(i32 [[TMP1]])44; CHECK-NEXT:    [[SUM:%.*]] = add i32 [[TMP2]], [[TMP1]]45; CHECK-NEXT:    ret i32 [[SUM]]46;47  %1 = call i32 @callee_simple(i32 %a)48  %2 = call i32 @callee_alwaysinline(i32 %1)49  %3 = call i32 @callee_noinline(i32 %2)50  %4 = call i32 @callee_optnone(i32 %3)51  %sum = add i32 %4, %352  ret i32 %sum53}54 55; Check that non-viable calls are not inlined56 57; Test recursive function is not inlined58define i32 @recursive(i32 %n) {59entry:60  %cmp = icmp eq i32 %n, 061  br i1 %cmp, label %base, label %recurse62 63base:64  ret i32 065 66recurse:67  %dec = sub i32 %n, 168  %rec = call i32 @recursive(i32 %dec)69  %add = add i32 %rec, 170  ret i32 %add71}72 73define i32 @call_recursive(i32 %x) {74; CHECK-LABEL: define i32 @call_recursive(75; CHECK-SAME: i32 [[X:%.*]]) {76; CHECK-NEXT:    [[R:%.*]] = call i32 @recursive(i32 [[X]])77; CHECK-NEXT:    ret i32 [[R]]78;79  %r = call i32 @recursive(i32 %x)80  ret i32 %r81}82 83; Test indirectbr prevents inlining84define void @has_indirectbr(ptr %ptr, i32 %cond) {85entry:86  switch i32 %cond, label %default [87  i32 0, label %target088  i32 1, label %target189  ]90 91target0:92  br label %end93 94target1:95  br label %end96 97default:98  br label %end99 100end:101  indirectbr ptr %ptr, [label %target0, label %target1]102  ret void103}104 105define void @call_indirectbr(ptr %p, i32 %c) {106; CHECK-LABEL: define void @call_indirectbr(107; CHECK-SAME: ptr [[P:%.*]], i32 [[C:%.*]]) {108; CHECK-NEXT:    call void @has_indirectbr(ptr [[P]], i32 [[C]])109; CHECK-NEXT:    ret void110;111  call void @has_indirectbr(ptr %p, i32 %c)112  ret void113}114 115