llvm/llvm/test/CodeGen/PowerPC/noredzone.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix < %s | FileCheck -check-prefix=AIX64 %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix < %s | FileCheck -check-prefix=AIX32 %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck -check-prefix=LE64 %s

define signext i32 @leaf1_noredzone(i32 signext %a, i32 signext %b) #0 {
; AIX64-LABEL: leaf1_noredzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    stdu 1, -64(1)
; AIX64-NEXT:    stw 3, 60(1)
; AIX64-NEXT:    add 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 4, 56(1)
; AIX64-NEXT:    addi 1, 1, 64
; AIX64-NEXT:    blr
;
; AIX32-LABEL: leaf1_noredzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    stwu 1, -32(1)
; AIX32-NEXT:    stw 3, 28(1)
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 4, 24(1)
; AIX32-NEXT:    addi 1, 1, 32
; AIX32-NEXT:    blr
;
; LE64-LABEL: leaf1_noredzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    stdu 1, -48(1)
; LE64-NEXT:    stw 3, 44(1)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, 40(1)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    addi 1, 1, 48
; LE64-NEXT:    blr
entry:
  %a.addr = alloca i32, align 4
  %b.addr = alloca i32, align 4
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  ret i32 %add
}

define void @nonleaf1_noredzone(i32 signext %a, i32 signext %b) #0 {
; AIX64-LABEL: nonleaf1_noredzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    mflr 0
; AIX64-NEXT:    stdu 1, -128(1)
; AIX64-NEXT:    std 0, 144(1)
; AIX64-NEXT:    stw 3, 124(1)
; AIX64-NEXT:    add 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 4, 120(1)
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    lwz 3, 124(1)
; AIX64-NEXT:    lwz 4, 120(1)
; AIX64-NEXT:    sub 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    addi 1, 1, 128
; AIX64-NEXT:    ld 0, 16(1)
; AIX64-NEXT:    mtlr 0
; AIX64-NEXT:    blr
;
; AIX32-LABEL: nonleaf1_noredzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    mflr 0
; AIX32-NEXT:    stwu 1, -64(1)
; AIX32-NEXT:    stw 0, 72(1)
; AIX32-NEXT:    stw 3, 60(1)
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 4, 56(1)
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 3, 60(1)
; AIX32-NEXT:    lwz 4, 56(1)
; AIX32-NEXT:    sub 3, 3, 4
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    addi 1, 1, 64
; AIX32-NEXT:    lwz 0, 8(1)
; AIX32-NEXT:    mtlr 0
; AIX32-NEXT:    blr
;
; LE64-LABEL: nonleaf1_noredzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    mflr 0
; LE64-NEXT:    stdu 1, -48(1)
; LE64-NEXT:    std 0, 64(1)
; LE64-NEXT:    stw 3, 44(1)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    stw 4, 40(1)
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    lwz 3, 44(1)
; LE64-NEXT:    lwz 4, 40(1)
; LE64-NEXT:    sub 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    addi 1, 1, 48
; LE64-NEXT:    ld 0, 16(1)
; LE64-NEXT:    mtlr 0
; LE64-NEXT:    blr
entry:
  %a.addr = alloca i32, align 4
  %b.addr = alloca i32, align 4
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  call void @leaf2(i32 signext %add)
  %2 = load i32, ptr %a.addr, align 4
  %3 = load i32, ptr %b.addr, align 4
  %sub = sub nsw i32 %2, %3
  call void @leaf2(i32 signext %sub)
  ret void
}

declare void @leaf2(i32 signext)

define signext i32 @leaf3_noredzone(i32 signext %a, i32 signext %b) #0 {
; AIX64-LABEL: leaf3_noredzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    stdu 1, -48(1)
; AIX64-NEXT:    ld 6, 0(1)
; AIX64-NEXT:    mr 5, 3
; AIX64-NEXT:    add 3, 5, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 5, 48(6)
; AIX64-NEXT:    stw 4, 52(6)
; AIX64-NEXT:    addi 1, 1, 48
; AIX64-NEXT:    blr
;
; AIX32-LABEL: leaf3_noredzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    stwu 1, -32(1)
; AIX32-NEXT:    lwz 6, 0(1)
; AIX32-NEXT:    mr 5, 3
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 5, 24(6)
; AIX32-NEXT:    stw 4, 28(6)
; AIX32-NEXT:    addi 1, 1, 32
; AIX32-NEXT:    blr
;
; LE64-LABEL: leaf3_noredzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    stdu 1, -32(1)
; LE64-NEXT:    ld 5, 0(1)
; LE64-NEXT:    stw 3, 48(5)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, 52(5)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    addi 1, 1, 32
; LE64-NEXT:    blr
entry:
  %f.addr = call ptr @llvm.frameaddress(i32 1)
  %a.addr = getelementptr ptr, ptr %f.addr, i32 6
  %b.addr = getelementptr i32, ptr %a.addr, i32 1
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  ret i32 %add
}

define void @nonleaf2_noredzone(i32 signext %a, i32 signext %b) #0 {
; AIX64-LABEL: nonleaf2_noredzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    mflr 0
; AIX64-NEXT:    stdu 1, -128(1)
; AIX64-NEXT:    std 0, 144(1)
; AIX64-NEXT:    std 31, 120(1) # 8-byte Folded Spill
; AIX64-NEXT:    add 5, 3, 4
; AIX64-NEXT:    ld 31, 0(1)
; AIX64-NEXT:    extsw 5, 5
; AIX64-NEXT:    stw 3, 48(31)
; AIX64-NEXT:    mr 3, 5
; AIX64-NEXT:    stw 4, 52(31)
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    lwz 3, 48(31)
; AIX64-NEXT:    lwz 4, 52(31)
; AIX64-NEXT:    sub 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    ld 31, 120(1) # 8-byte Folded Reload
; AIX64-NEXT:    addi 1, 1, 128
; AIX64-NEXT:    ld 0, 16(1)
; AIX64-NEXT:    mtlr 0
; AIX64-NEXT:    blr
;
; AIX32-LABEL: nonleaf2_noredzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    mflr 0
; AIX32-NEXT:    stwu 1, -64(1)
; AIX32-NEXT:    stw 0, 72(1)
; AIX32-NEXT:    add 5, 3, 4
; AIX32-NEXT:    stw 31, 60(1) # 4-byte Folded Spill
; AIX32-NEXT:    lwz 31, 0(1)
; AIX32-NEXT:    stw 3, 24(31)
; AIX32-NEXT:    mr 3, 5
; AIX32-NEXT:    stw 4, 28(31)
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 3, 24(31)
; AIX32-NEXT:    lwz 4, 28(31)
; AIX32-NEXT:    sub 3, 3, 4
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 31, 60(1) # 4-byte Folded Reload
; AIX32-NEXT:    addi 1, 1, 64
; AIX32-NEXT:    lwz 0, 8(1)
; AIX32-NEXT:    mtlr 0
; AIX32-NEXT:    blr
;
; LE64-LABEL: nonleaf2_noredzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    mflr 0
; LE64-NEXT:    std 30, -16(1) # 8-byte Folded Spill
; LE64-NEXT:    stdu 1, -48(1)
; LE64-NEXT:    std 0, 64(1)
; LE64-NEXT:    ld 30, 0(1)
; LE64-NEXT:    stw 3, 48(30)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, 52(30)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    lwz 3, 48(30)
; LE64-NEXT:    lwz 4, 52(30)
; LE64-NEXT:    sub 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    addi 1, 1, 48
; LE64-NEXT:    ld 0, 16(1)
; LE64-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
; LE64-NEXT:    mtlr 0
; LE64-NEXT:    blr
entry:
  %f.addr = call ptr @llvm.frameaddress(i32 1)
  %a.addr = getelementptr ptr, ptr %f.addr, i32 6
  %b.addr = getelementptr i32, ptr %a.addr, i32 1
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  call void @leaf2(i32 signext %add)
  %2 = load i32, ptr %a.addr, align 4
  %3 = load i32, ptr %b.addr, align 4
  %sub = sub nsw i32 %2, %3
  call void @leaf2(i32 signext %sub)
  ret void
}

define signext i32 @leaf1_redzone(i32 signext %a, i32 signext %b) #1 {
; AIX64-LABEL: leaf1_redzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    stw 3, -4(1)
; AIX64-NEXT:    add 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 4, -8(1)
; AIX64-NEXT:    blr
;
; AIX32-LABEL: leaf1_redzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    stw 3, -4(1)
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 4, -8(1)
; AIX32-NEXT:    blr
;
; LE64-LABEL: leaf1_redzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    stw 3, -4(1)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, -8(1)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    blr
entry:
  %a.addr = alloca i32, align 4
  %b.addr = alloca i32, align 4
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  ret i32 %add
}

define void @nonleaf1_redzone(i32 signext %a, i32 signext %b) #1 {
; AIX64-LABEL: nonleaf1_redzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    mflr 0
; AIX64-NEXT:    stdu 1, -128(1)
; AIX64-NEXT:    std 0, 144(1)
; AIX64-NEXT:    stw 3, 124(1)
; AIX64-NEXT:    add 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 4, 120(1)
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    lwz 3, 124(1)
; AIX64-NEXT:    lwz 4, 120(1)
; AIX64-NEXT:    sub 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    addi 1, 1, 128
; AIX64-NEXT:    ld 0, 16(1)
; AIX64-NEXT:    mtlr 0
; AIX64-NEXT:    blr
;
; AIX32-LABEL: nonleaf1_redzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    mflr 0
; AIX32-NEXT:    stwu 1, -64(1)
; AIX32-NEXT:    stw 0, 72(1)
; AIX32-NEXT:    stw 3, 60(1)
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 4, 56(1)
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 3, 60(1)
; AIX32-NEXT:    lwz 4, 56(1)
; AIX32-NEXT:    sub 3, 3, 4
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    addi 1, 1, 64
; AIX32-NEXT:    lwz 0, 8(1)
; AIX32-NEXT:    mtlr 0
; AIX32-NEXT:    blr
;
; LE64-LABEL: nonleaf1_redzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    mflr 0
; LE64-NEXT:    stdu 1, -48(1)
; LE64-NEXT:    std 0, 64(1)
; LE64-NEXT:    stw 3, 44(1)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    stw 4, 40(1)
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    lwz 3, 44(1)
; LE64-NEXT:    lwz 4, 40(1)
; LE64-NEXT:    sub 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    addi 1, 1, 48
; LE64-NEXT:    ld 0, 16(1)
; LE64-NEXT:    mtlr 0
; LE64-NEXT:    blr
entry:
  %a.addr = alloca i32, align 4
  %b.addr = alloca i32, align 4
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  call void @leaf2(i32 signext %add)
  %2 = load i32, ptr %a.addr, align 4
  %3 = load i32, ptr %b.addr, align 4
  %sub = sub nsw i32 %2, %3
  call void @leaf2(i32 signext %sub)
  ret void
}

define signext i32 @leaf3_redzone(i32 signext %a, i32 signext %b) #1 {
; AIX64-LABEL: leaf3_redzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    stdu 1, -48(1)
; AIX64-NEXT:    ld 6, 0(1)
; AIX64-NEXT:    mr 5, 3
; AIX64-NEXT:    add 3, 5, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    stw 5, 48(6)
; AIX64-NEXT:    stw 4, 52(6)
; AIX64-NEXT:    addi 1, 1, 48
; AIX64-NEXT:    blr
;
; AIX32-LABEL: leaf3_redzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    stwu 1, -32(1)
; AIX32-NEXT:    lwz 6, 0(1)
; AIX32-NEXT:    mr 5, 3
; AIX32-NEXT:    add 3, 3, 4
; AIX32-NEXT:    stw 5, 24(6)
; AIX32-NEXT:    stw 4, 28(6)
; AIX32-NEXT:    addi 1, 1, 32
; AIX32-NEXT:    blr
;
; LE64-LABEL: leaf3_redzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    stdu 1, -32(1)
; LE64-NEXT:    ld 5, 0(1)
; LE64-NEXT:    stw 3, 48(5)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, 52(5)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    addi 1, 1, 32
; LE64-NEXT:    blr
entry:
  %f.addr = call ptr @llvm.frameaddress(i32 1)
  %a.addr = getelementptr ptr, ptr %f.addr, i32 6
  %b.addr = getelementptr i32, ptr %a.addr, i32 1
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  ret i32 %add
}

define void @nonleaf2_redzone(i32 signext %a, i32 signext %b) #1 {
; AIX64-LABEL: nonleaf2_redzone:
; AIX64:       # %bb.0: # %entry
; AIX64-NEXT:    mflr 0
; AIX64-NEXT:    stdu 1, -128(1)
; AIX64-NEXT:    std 0, 144(1)
; AIX64-NEXT:    std 31, 120(1) # 8-byte Folded Spill
; AIX64-NEXT:    add 5, 3, 4
; AIX64-NEXT:    ld 31, 0(1)
; AIX64-NEXT:    extsw 5, 5
; AIX64-NEXT:    stw 3, 48(31)
; AIX64-NEXT:    mr 3, 5
; AIX64-NEXT:    stw 4, 52(31)
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    lwz 3, 48(31)
; AIX64-NEXT:    lwz 4, 52(31)
; AIX64-NEXT:    sub 3, 3, 4
; AIX64-NEXT:    extsw 3, 3
; AIX64-NEXT:    bl .leaf2[PR]
; AIX64-NEXT:    nop
; AIX64-NEXT:    ld 31, 120(1) # 8-byte Folded Reload
; AIX64-NEXT:    addi 1, 1, 128
; AIX64-NEXT:    ld 0, 16(1)
; AIX64-NEXT:    mtlr 0
; AIX64-NEXT:    blr
;
; AIX32-LABEL: nonleaf2_redzone:
; AIX32:       # %bb.0: # %entry
; AIX32-NEXT:    mflr 0
; AIX32-NEXT:    stwu 1, -64(1)
; AIX32-NEXT:    stw 0, 72(1)
; AIX32-NEXT:    add 5, 3, 4
; AIX32-NEXT:    stw 31, 60(1) # 4-byte Folded Spill
; AIX32-NEXT:    lwz 31, 0(1)
; AIX32-NEXT:    stw 3, 24(31)
; AIX32-NEXT:    mr 3, 5
; AIX32-NEXT:    stw 4, 28(31)
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 3, 24(31)
; AIX32-NEXT:    lwz 4, 28(31)
; AIX32-NEXT:    sub 3, 3, 4
; AIX32-NEXT:    bl .leaf2[PR]
; AIX32-NEXT:    nop
; AIX32-NEXT:    lwz 31, 60(1) # 4-byte Folded Reload
; AIX32-NEXT:    addi 1, 1, 64
; AIX32-NEXT:    lwz 0, 8(1)
; AIX32-NEXT:    mtlr 0
; AIX32-NEXT:    blr
;
; LE64-LABEL: nonleaf2_redzone:
; LE64:       # %bb.0: # %entry
; LE64-NEXT:    mflr 0
; LE64-NEXT:    std 30, -16(1) # 8-byte Folded Spill
; LE64-NEXT:    stdu 1, -48(1)
; LE64-NEXT:    std 0, 64(1)
; LE64-NEXT:    ld 30, 0(1)
; LE64-NEXT:    stw 3, 48(30)
; LE64-NEXT:    add 3, 3, 4
; LE64-NEXT:    stw 4, 52(30)
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    lwz 3, 48(30)
; LE64-NEXT:    lwz 4, 52(30)
; LE64-NEXT:    sub 3, 3, 4
; LE64-NEXT:    extsw 3, 3
; LE64-NEXT:    bl leaf2
; LE64-NEXT:    nop
; LE64-NEXT:    addi 1, 1, 48
; LE64-NEXT:    ld 0, 16(1)
; LE64-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
; LE64-NEXT:    mtlr 0
; LE64-NEXT:    blr
entry:
  %f.addr = call ptr @llvm.frameaddress(i32 1)
  %a.addr = getelementptr ptr, ptr %f.addr, i32 6
  %b.addr = getelementptr i32, ptr %a.addr, i32 1
  store i32 %a, ptr %a.addr, align 4
  store i32 %b, ptr %b.addr, align 4
  %0 = load i32, ptr %a.addr, align 4
  %1 = load i32, ptr %b.addr, align 4
  %add = add nsw i32 %0, %1
  call void @leaf2(i32 signext %add)
  %2 = load i32, ptr %a.addr, align 4
  %3 = load i32, ptr %b.addr, align 4
  %sub = sub nsw i32 %2, %3
  call void @leaf2(i32 signext %sub)
  ret void
}

attributes #0 = { noredzone nounwind noinline }
attributes #1 = { nounwind noinline }