Compiler projects using llvm
; RUN: llc --verify-machineinstrs %s -o - | FileCheck %s

target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv7m-unknown-unknown-eabi"

declare dso_local i32 @h0(i32, i32) local_unnamed_addr #1

define dso_local i32 @f(i32 %a, i32 %b, i32 %c, i32 %d) local_unnamed_addr #0 {
entry:
  %add = add nsw i32 %a, 1
  %sub = add nsw i32 %b, -1
  %call = tail call i32 @h0(i32 %add, i32 %sub) #0
  %add1 = add nsw i32 %c, %b
  %mul = shl nsw i32 %call, 1
  %add2 = add nsw i32 %mul, %add1
  %sub3 = sub nsw i32 %c, %d
  %mul4 = mul nsw i32 %add2, %sub3
  %sub5 = sub nsw i32 %call, %add1
  %div = sdiv i32 %mul4, %sub5
  %add6 = add nsw i32 %d, %c
  %mul7 = mul nsw i32 %div, %add6
  %add8 = add nsw i32 %mul7, 1
  ret i32 %add8
}
; CHECK-LABEL: f:
; CHECK:       bl   h0
; CHECK-NEXT:  bl   OUTLINED_FUNCTION_0
; CHECK-NEXT:  adds r0, #1
; CHECK-NEXT:  pop  {r4, r5, r6, pc}


define dso_local i32 @g(i32 %a, i32 %b, i32 %c, i32 %d) local_unnamed_addr #0 {
entry:
  %sub = add nsw i32 %a, -1
  %add = add nsw i32 %b, 1
  %call = tail call i32 @h0(i32 %sub, i32 %add) #0
  %add1 = add nsw i32 %c, %b
  %mul = shl nsw i32 %call, 1
  %add2 = add nsw i32 %mul, %add1
  %sub3 = sub nsw i32 %c, %d
  %mul4 = mul nsw i32 %add2, %sub3
  %sub5 = sub nsw i32 %call, %add1
  %div = sdiv i32 %mul4, %sub5
  %add6 = add nsw i32 %d, %c
  %mul7 = mul nsw i32 %div, %add6
  %add8 = add nsw i32 %mul7, 2
  ret i32 %add8
}
; CHECK-LABEL: g:
; CHECK:       bl   h0
; CHECK-NEXT:  bl   OUTLINED_FUNCTION_0
; CHECK-NEXT:  adds r0, #2
; CHECK-NEXT:  pop  {r4, r5, r6, pc}


attributes #0 = { minsize nounwind optsize }
attributes #1 = { minsize optsize }