1; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s 2 3; Check an edge case of the outlining costs - 4; outlining occurs in this test and does not in `bti-outliner-cost-2.ll` 5; the only difference being the branch target enforcement is enabled in the 6; latter one. 7 8; volatile int a, b, c, d, e; 9; 10; int y(int p) { 11; int r = (a + b) / (c + d) * e; 12; return r + 1; 13; } 14; 15; int y(int p) { 16; int r = (a + b) / (c + d) * e; 17; return r + 2; 18; } 19 20@a = hidden global i32 0, align 4 21@b = hidden global i32 0, align 4 22@c = hidden global i32 0, align 4 23@d = hidden global i32 0, align 4 24@e = hidden global i32 0, align 4 25 26define hidden i32 @x(i32 %p) local_unnamed_addr #0 { 27entry: 28 %0 = load volatile i32, ptr @a, align 4 29 %1 = load volatile i32, ptr @b, align 4 30 %add = add nsw i32 %1, %0 31 %2 = load volatile i32, ptr @c, align 4 32 %3 = load volatile i32, ptr @d, align 4 33 %add1 = add nsw i32 %3, %2 34 %div = sdiv i32 %add, %add1 35 %4 = load volatile i32, ptr @e, align 4 36 %mul = mul nsw i32 %4, %div 37 %add2 = add nsw i32 %mul, 1 38 ret i32 %add2 39} 40; CHECK-LABEL: x: 41; CHECK: bl OUTLINED_FUNCTION_0 42 43define hidden i32 @y(i32 %p) local_unnamed_addr #0 { 44entry: 45 %0 = load volatile i32, ptr @a, align 4 46 %1 = load volatile i32, ptr @b, align 4 47 %add = add nsw i32 %1, %0 48 %2 = load volatile i32, ptr @c, align 4 49 %3 = load volatile i32, ptr @d, align 4 50 %add1 = add nsw i32 %3, %2 51 %div = sdiv i32 %add, %add1 52 %4 = load volatile i32, ptr @e, align 4 53 %mul = mul nsw i32 %4, %div 54 %add2 = add nsw i32 %mul, 2 55 ret i32 %add2 56} 57; CHECK-LABEL: y: 58; CHECK: bl OUTLINED_FUNCTION_0 59 60; CHECK-LABEL: OUTLINED_FUNCTION_0: 61; CHECK-NOT: bti 62 63attributes #0 = { minsize nofree norecurse nounwind optsize } 64 65!llvm.module.flags = !{!0} 66 67!0 = !{i32 8, !"branch-target-enforcement", i32 0} 68