xref: /llvm-project/llvm/test/CodeGen/Thumb2/ifcvt-minsize.ll (revision a294d9eb2152ccd5c44b9e45ad291a199a944c56)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv8m.main-none-none-eabi %s -o - -verify-machineinstrs | FileCheck %s
3
4declare i32 @fn(i32) #0
5
6define i32 @f1(i32 %a) #0 {
7; CHECK-LABEL: f1:
8; CHECK:       @ %bb.0: @ %entry
9; CHECK-NEXT:    .save {r4, lr}
10; CHECK-NEXT:    push {r4, lr}
11; CHECK-NEXT:    mov r4, r0
12; CHECK-NEXT:    bl fn
13; CHECK-NEXT:    movs r0, #0
14; CHECK-NEXT:    cbz r4, .LBB0_2
15; CHECK-NEXT:  @ %bb.1: @ %return
16; CHECK-NEXT:    pop {r4, pc}
17; CHECK-NEXT:  .LBB0_2: @ %if.end
18; CHECK-NEXT:    bl fn
19; CHECK-NEXT:    adds r0, #1
20; CHECK-NEXT:    pop {r4, pc}
21entry:
22  %call = tail call i32 @fn(i32 %a) #2
23  %tobool = icmp eq i32 %a, 0
24  br i1 %tobool, label %if.end, label %return
25
26if.end:                                           ; preds = %entry
27  %call1 = tail call i32 @fn(i32 0) #2
28  %add = add nsw i32 %call1, 1
29  br label %return
30
31return:                                           ; preds = %entry, %if.end
32  %retval.0 = phi i32 [ %add, %if.end ], [ 0, %entry ]
33  ret i32 %retval.0
34}
35
36define i32 @f2(i32 %a) #0 {
37; CHECK-LABEL: f2:
38; CHECK:       @ %bb.0: @ %entry
39; CHECK-NEXT:    .save {r4, lr}
40; CHECK-NEXT:    push {r4, lr}
41; CHECK-NEXT:    mov r4, r0
42; CHECK-NEXT:    bl fn
43; CHECK-NEXT:    movs r0, #0
44; CHECK-NEXT:    cmp r4, #1
45; CHECK-NEXT:    bne .LBB1_2
46; CHECK-NEXT:  @ %bb.1: @ %if.end
47; CHECK-NEXT:    bl fn
48; CHECK-NEXT:    adds r0, #1
49; CHECK-NEXT:  .LBB1_2: @ %return
50; CHECK-NEXT:    pop {r4, pc}
51entry:
52  %call = tail call i32 @fn(i32 %a) #2
53  %tobool = icmp eq i32 %a, 1
54  br i1 %tobool, label %if.end, label %return
55
56if.end:                                           ; preds = %entry
57  %call1 = tail call i32 @fn(i32 0) #2
58  %add = add nsw i32 %call1, 1
59  br label %return
60
61return:                                           ; preds = %entry, %if.end
62  %retval.0 = phi i32 [ %add, %if.end ], [ 0, %entry ]
63  ret i32 %retval.0
64}
65
66define void @f3(i32 %x) #0 {
67; CHECK-LABEL: f3:
68; CHECK:       @ %bb.0: @ %entry
69; CHECK-NEXT:    cmp r0, #1
70; CHECK-NEXT:    bne .LBB2_2
71; CHECK-NEXT:  @ %bb.1: @ %t
72; CHECK-NEXT:    .save {r7, lr}
73; CHECK-NEXT:    push {r7, lr}
74; CHECK-NEXT:    movs r0, #0
75; CHECK-NEXT:    bl fn
76; CHECK-NEXT:    pop.w {r7, lr}
77; CHECK-NEXT:  .LBB2_2: @ %f
78; CHECK-NEXT:    bx lr
79entry:
80  %p = icmp eq i32 %x, 1
81  br i1 %p, label %t, label %f
82
83t:
84  call i32 @fn(i32 0)
85  br label %f
86
87f:
88  ret void
89}
90
91attributes #0 = { minsize nounwind optsize }
92
93