aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/Inline/always-inline-bfi.ll
blob: 0971bbeec842bf4adcaea4a9d7ca108f24dc73be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes="function(require<block-freq>,loop(loop-unroll-full)),always-inline" < %s | FileCheck %s

; Make sure this does not crash.

define void @f_116_0(ptr %p) alwaysinline {
; CHECK-LABEL: define void @f_116_0(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[DOTPRE:%.*]] = load i16, ptr [[P]], align 1
; CHECK-NEXT:    br label %[[FOR_COND:.*]]
; CHECK:       [[FOR_COND]]:
; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i16 [[DOTPRE]], 1
; CHECK-NEXT:    br i1 [[CMP3]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]]
; CHECK:       [[FOR_COND_CLEANUP]]:
; CHECK-NEXT:    ret void
; CHECK:       [[FOR_BODY]]:
; CHECK-NEXT:    br label %[[FOR_COND]]
;
entry:
  %.pre = load i16, ptr %p, align 1
  br label %for.cond

for.cond:                                         ; preds = %for.body, %entry
  %cmp3 = icmp ult i16 %.pre, 1
  br i1 %cmp3, label %for.body, label %for.cond.cleanup

for.cond.cleanup:                                 ; preds = %for.cond
  ret void

for.body:                                         ; preds = %for.cond
  br label %for.cond
}

define void @f_321_0(ptr %p) alwaysinline {
; CHECK-LABEL: define void @f_321_0(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    br label %[[FOR_COND:.*]]
; CHECK:       [[FOR_COND]]:
; CHECK-NEXT:    br i1 false, label %[[CRIT_EDGE:.*]], label %[[FOR_COND_CLEANUP:.*]]
; CHECK:       [[CRIT_EDGE]]:
; CHECK-NEXT:    unreachable
; CHECK:       [[FOR_COND_CLEANUP]]:
; CHECK-NEXT:    [[DOTPRE_I:%.*]] = load i16, ptr [[P]], align 1
; CHECK-NEXT:    br label %[[FOR_COND_I:.*]]
; CHECK:       [[FOR_COND_I]]:
; CHECK-NEXT:    [[CMP3_I:%.*]] = icmp ult i16 [[DOTPRE_I]], 1
; CHECK-NEXT:    br i1 [[CMP3_I]], label %[[FOR_BODY_I:.*]], label %[[F_116_0_EXIT:.*]]
; CHECK:       [[FOR_BODY_I]]:
; CHECK-NEXT:    br label %[[FOR_COND_I]]
; CHECK:       [[F_116_0_EXIT]]:
; CHECK-NEXT:    ret void
;
entry:
  br label %for.cond

for.cond:                                         ; preds = %crit_edge, %entry
  br i1 false, label %crit_edge, label %for.cond.cleanup

crit_edge:                                        ; preds = %for.cond
  br label %for.cond

for.cond.cleanup:                                 ; preds = %for.cond
  call void @f_116_0(ptr %p)
  ret void
}

define i16 @main(ptr %p) {
; CHECK-LABEL: define i16 @main(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    br label %[[FOR_COND:.*]]
; CHECK:       [[FOR_COND]]:
; CHECK-NEXT:    br label %[[FOR_COND]]
; CHECK:       [[IF_ELSE:.*:]]
; CHECK-NEXT:    [[DOTPRE_I_I:%.*]] = load i16, ptr [[P]], align 1
; CHECK-NEXT:    br label %[[FOR_COND_I_I:.*]]
; CHECK:       [[FOR_COND_I_I]]:
; CHECK-NEXT:    [[CMP3_I_I:%.*]] = icmp ult i16 [[DOTPRE_I_I]], 1
; CHECK-NEXT:    br i1 [[CMP3_I_I]], label %[[FOR_BODY_I_I:.*]], label %[[F_321_0_EXIT:.*]]
; CHECK:       [[FOR_BODY_I_I]]:
; CHECK-NEXT:    br label %[[FOR_COND_I_I]]
; CHECK:       [[F_321_0_EXIT]]:
; CHECK-NEXT:    br label %[[FOR_COND115:.*]]
; CHECK:       [[FOR_COND115]]:
; CHECK-NEXT:    br label %[[FOR_COND115]]
;
entry:
  br label %for.cond

for.cond:                                         ; preds = %for.cond, %entry
  br label %for.cond

if.else:                                          ; No predecessors!
  call void @f_321_0(ptr %p)
  br label %for.cond115

for.cond115:                                      ; preds = %for.cond115, %if.else
  br label %for.cond115
}