1*937ab6a7SMomchil Velikov; RUN: llc --verify-machineinstrs --force-dwarf-frame-section %s -o - | FileCheck %s 2*937ab6a7SMomchil Velikovtarget datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 3*937ab6a7SMomchil Velikovtarget triple = "thumbv7m-unknown-unknown-eabi" 4*937ab6a7SMomchil Velikov 5*937ab6a7SMomchil Velikov; Derived from 6*937ab6a7SMomchil Velikov; __attribute__((noinline)) int h(int a, int b) { return a + b; } 7*937ab6a7SMomchil Velikov; 8*937ab6a7SMomchil Velikov; int f(int a, int b, int c, int d) { 9*937ab6a7SMomchil Velikov; if (a < 0) 10*937ab6a7SMomchil Velikov; return -1; 11*937ab6a7SMomchil Velikov; a = h(a, b); 12*937ab6a7SMomchil Velikov; return 2 + a * (a + b) / (c + d); 13*937ab6a7SMomchil Velikov; } 14*937ab6a7SMomchil Velikov; 15*937ab6a7SMomchil Velikov; int g(int a, int b, int c, int d) { 16*937ab6a7SMomchil Velikov; if (a < 0) 17*937ab6a7SMomchil Velikov; return -1; 18*937ab6a7SMomchil Velikov; a = h(a, b); 19*937ab6a7SMomchil Velikov; return 1 + a * (a + b) / (c + d); 20*937ab6a7SMomchil Velikov; } 21*937ab6a7SMomchil Velikov; Check CFI instructions inside the outlined function. 22*937ab6a7SMomchil Velikov 23*937ab6a7SMomchil Velikovdefine dso_local i32 @h(i32 %a, i32 %b) local_unnamed_addr #0 { 24*937ab6a7SMomchil Velikoventry: 25*937ab6a7SMomchil Velikov %add = add nsw i32 %b, %a 26*937ab6a7SMomchil Velikov ret i32 %add 27*937ab6a7SMomchil Velikov} 28*937ab6a7SMomchil Velikov 29*937ab6a7SMomchil Velikovdefine dso_local i32 @f(i32 %a, i32 %b, i32 %c, i32 %d) local_unnamed_addr #1 { 30*937ab6a7SMomchil Velikoventry: 31*937ab6a7SMomchil Velikov %cmp = icmp slt i32 %a, 0 32*937ab6a7SMomchil Velikov br i1 %cmp, label %return, label %if.end 33*937ab6a7SMomchil Velikov 34*937ab6a7SMomchil Velikovif.end: ; preds = %entry 35*937ab6a7SMomchil Velikov %call = tail call i32 @h(i32 %a, i32 %b) #2 36*937ab6a7SMomchil Velikov %add = add nsw i32 %call, %b 37*937ab6a7SMomchil Velikov %mul = mul nsw i32 %add, %call 38*937ab6a7SMomchil Velikov %add1 = add nsw i32 %d, %c 39*937ab6a7SMomchil Velikov %div = sdiv i32 %mul, %add1 40*937ab6a7SMomchil Velikov %add2 = add nsw i32 %div, 2 41*937ab6a7SMomchil Velikov br label %return 42*937ab6a7SMomchil Velikov 43*937ab6a7SMomchil Velikovreturn: ; preds = %entry, %if.end 44*937ab6a7SMomchil Velikov %retval.0 = phi i32 [ %add2, %if.end ], [ -1, %entry ] 45*937ab6a7SMomchil Velikov ret i32 %retval.0 46*937ab6a7SMomchil Velikov} 47*937ab6a7SMomchil Velikov 48*937ab6a7SMomchil Velikovdefine dso_local i32 @g(i32 %a, i32 %b, i32 %c, i32 %d) local_unnamed_addr #1 { 49*937ab6a7SMomchil Velikoventry: 50*937ab6a7SMomchil Velikov %cmp = icmp slt i32 %a, 0 51*937ab6a7SMomchil Velikov br i1 %cmp, label %return, label %if.end 52*937ab6a7SMomchil Velikov 53*937ab6a7SMomchil Velikovif.end: ; preds = %entry 54*937ab6a7SMomchil Velikov %call = tail call i32 @h(i32 %a, i32 %b) #2 55*937ab6a7SMomchil Velikov %add = add nsw i32 %call, %b 56*937ab6a7SMomchil Velikov %mul = mul nsw i32 %add, %call 57*937ab6a7SMomchil Velikov %add1 = add nsw i32 %d, %c 58*937ab6a7SMomchil Velikov %div = sdiv i32 %mul, %add1 59*937ab6a7SMomchil Velikov %add2 = add nsw i32 %div, 1 60*937ab6a7SMomchil Velikov br label %return 61*937ab6a7SMomchil Velikov 62*937ab6a7SMomchil Velikovreturn: ; preds = %entry, %if.end 63*937ab6a7SMomchil Velikov %retval.0 = phi i32 [ %add2, %if.end ], [ -1, %entry ] 64*937ab6a7SMomchil Velikov ret i32 %retval.0 65*937ab6a7SMomchil Velikov} 66*937ab6a7SMomchil Velikov 67*937ab6a7SMomchil Velikov; CHECK-LABEL: OUTLINED_FUNCTION_0: 68*937ab6a7SMomchil Velikov; CHECK: str lr, [sp, #-8]! 69*937ab6a7SMomchil Velikov; CHECK-NEXT: .cfi_def_cfa_offset 8 70*937ab6a7SMomchil Velikov; CHECK-NEXT: .cfi_offset lr, -8 71*937ab6a7SMomchil Velikov; CHECK: ldr lr, [sp], #8 72*937ab6a7SMomchil Velikov; CHECK-NEXT: .cfi_def_cfa_offset 0 73*937ab6a7SMomchil Velikov; CHECK-NEXT: .cfi_restore lr 74*937ab6a7SMomchil Velikov; CHECK-NEXT: bx lr 75*937ab6a7SMomchil Velikov 76*937ab6a7SMomchil Velikovattributes #0 = { minsize noinline norecurse nounwind optsize readnone } 77*937ab6a7SMomchil Velikovattributes #1 = { minsize norecurse nounwind optsize readnone } 78*937ab6a7SMomchil Velikovattributes #2 = { minsize optsize } 79