aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/AArch64/late-taildup-computed-goto.ll
blob: c4a027c6d80706336de93213bdd887885ba20191 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -tail-dup-pred-size=2 -tail-dup-succ-size=2 -o - %s | FileCheck %s

target triple = "arm64-apple-macosx13.0.0"

@opcode.targets = local_unnamed_addr constant [6 x ptr] [ptr blockaddress(@test_interp, %op1.bb), ptr blockaddress(@test_interp, %op6.bb), ptr blockaddress(@test_interp, %loop.header), ptr blockaddress(@test_interp, %op2.bb), ptr blockaddress(@test_interp, %op4.bb), ptr blockaddress(@test_interp, %op5.bb)]

define void @test_interp(ptr %frame, ptr %dst) {
; CHECK-LABEL: test_interp:
; CHECK:       ; %bb.0: ; %entry
; CHECK-NEXT:    stp x24, x23, [sp, #-64]! ; 16-byte Folded Spill
; CHECK-NEXT:    stp x22, x21, [sp, #16] ; 16-byte Folded Spill
; CHECK-NEXT:    stp x20, x19, [sp, #32] ; 16-byte Folded Spill
; CHECK-NEXT:    stp x29, x30, [sp, #48] ; 16-byte Folded Spill
; CHECK-NEXT:    .cfi_def_cfa_offset 64
; CHECK-NEXT:    .cfi_offset w30, -8
; CHECK-NEXT:    .cfi_offset w29, -16
; CHECK-NEXT:    .cfi_offset w19, -24
; CHECK-NEXT:    .cfi_offset w20, -32
; CHECK-NEXT:    .cfi_offset w21, -40
; CHECK-NEXT:    .cfi_offset w22, -48
; CHECK-NEXT:    .cfi_offset w23, -56
; CHECK-NEXT:    .cfi_offset w24, -64
; CHECK-NEXT:  Lloh0:
; CHECK-NEXT:    adrp x21, _opcode.targets@PAGE
; CHECK-NEXT:  Lloh1:
; CHECK-NEXT:    add x21, x21, _opcode.targets@PAGEOFF
; CHECK-NEXT:    mov x22, xzr
; CHECK-NEXT:    add x8, x21, xzr, lsl #3
; CHECK-NEXT:    mov x19, x1
; CHECK-NEXT:    mov x20, x0
; CHECK-NEXT:    add x23, x22, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp0: ; Block address taken
; CHECK-NEXT:  LBB0_1: ; %loop.header
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    add x8, x21, x23, lsl #3
; CHECK-NEXT:    mov x20, xzr
; CHECK-NEXT:    mov x22, xzr
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp1: ; Block address taken
; CHECK-NEXT:  LBB0_2: ; %op1.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    str xzr, [x19]
; CHECK-NEXT:    mov w8, #1 ; =0x1
; CHECK-NEXT:    ldr x0, [x20, #-8]!
; CHECK-NEXT:    ldr x9, [x0, #8]
; CHECK-NEXT:    str x8, [x0]
; CHECK-NEXT:    ldr x8, [x9, #48]
; CHECK-NEXT:    blr x8
; CHECK-NEXT:    add x8, x21, x23, lsl #3
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp2: ; Block address taken
; CHECK-NEXT:  LBB0_3: ; %op2.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    add x8, x21, x23, lsl #3
; CHECK-NEXT:    mov x20, xzr
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    str x22, [x19]
; CHECK-NEXT:    mov x22, xzr
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp3: ; Block address taken
; CHECK-NEXT:  LBB0_4: ; %op4.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    str x22, [x19]
; CHECK-NEXT:    add x10, x21, x23, lsl #3
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    ldur x8, [x22, #12]
; CHECK-NEXT:    ldur x9, [x20, #-8]
; CHECK-NEXT:    add x22, x22, #20
; CHECK-NEXT:    stp x8, x9, [x20, #-8]
; CHECK-NEXT:    add x20, x20, #8
; CHECK-NEXT:    br x10
; CHECK-NEXT:  Ltmp4: ; Block address taken
; CHECK-NEXT:  LBB0_5: ; %op5.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    str x22, [x19]
; CHECK-NEXT:    add x10, x21, x23, lsl #3
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    ldur x8, [x22, #12]
; CHECK-NEXT:    ldur x9, [x20, #-8]
; CHECK-NEXT:    add x22, x22, #20
; CHECK-NEXT:    stp x8, x9, [x20, #-8]
; CHECK-NEXT:    add x20, x20, #8
; CHECK-NEXT:    br x10
; CHECK-NEXT:  Ltmp5: ; Block address taken
; CHECK-NEXT:  LBB0_6: ; %op6.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    ldr x0, [x20, #-8]!
; CHECK-NEXT:    mov w8, #1 ; =0x1
; CHECK-NEXT:    ldr x9, [x0, #8]
; CHECK-NEXT:    str x8, [x0]
; CHECK-NEXT:    ldr x8, [x9, #48]
; CHECK-NEXT:    blr x8
; CHECK-NEXT:    add x8, x21, x23, lsl #3
; CHECK-NEXT:    add x23, x23, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:    .loh AdrpAdd Lloh0, Lloh1
entry:
  br label %loop.header

loop.header:
  %iv = phi i64 [ 0, %entry ], [ %iv.next, %op1.bb ], [ %iv.next, %op2.bb ], [ %iv.next, %op4.bb ], [ %iv.next, %op5.bb ], [ %iv.next, %op6.bb ], [ %iv.next, %loop.header ]
  %stack.pointer = phi ptr [ %frame, %entry ], [ %stack.8, %op1.bb ], [ null, %op2.bb ], [ %stack.next, %op4.bb ], [ %stack.next.2, %op5.bb ], [ %stack.4, %op6.bb ], [ null, %loop.header ]
  %next.instr = phi ptr [ null, %entry ], [ %next.instr, %op1.bb ], [ null, %op2.bb ], [ %next.instr.20, %op4.bb ], [ %next.instr.21, %op5.bb ], [ %next.instr, %op6.bb ], [ null, %loop.header ]
  %iv.next = add i64 %iv, 1
  %next_op = getelementptr [6 x ptr], ptr @opcode.targets, i64 0, i64 %iv
  indirectbr ptr %next_op, [label %op1.bb, label %op6.bb, label %loop.header, label %op2.bb, label %op4.bb, label %op5.bb]

op1.bb:
  store ptr null, ptr %dst, align 8
  %stack.8 = getelementptr i8, ptr %stack.pointer, i64 -8
  %l.0 = load ptr, ptr %stack.8, align 8
  store i64 1, ptr %l.0, align 8
  %gep.0 = getelementptr i8, ptr %l.0, i64 8
  %l.1 = load ptr, ptr %gep.0, align 8
  %gep.1 = getelementptr i8, ptr %l.1, i64 48
  %l.2 = load ptr, ptr %gep.1, align 8
  tail call void %l.2(ptr nonnull %l.0)
  br label %loop.header

op2.bb:
  store ptr %next.instr, ptr %dst, align 8
  br label %loop.header

op4.bb:
  store ptr %next.instr, ptr %dst, align 8
  %next.instr.20 = getelementptr i8, ptr %next.instr, i64 20
  %stack.2 = getelementptr i8, ptr %stack.pointer, i64 -8
  %l.3 = load ptr, ptr %stack.2, align 8
  %next.instr.12 = getelementptr i8, ptr %next.instr, i64 12
  %next.instr.12.val = load ptr, ptr %next.instr.12, align 2
  store ptr %next.instr.12.val, ptr %stack.2, align 8
  store ptr %l.3, ptr %stack.pointer, align 8
  %stack.next = getelementptr i8, ptr %stack.pointer, i64 8
  br label %loop.header

op5.bb:
  store ptr %next.instr, ptr %dst, align 8
  %next.instr.21 = getelementptr i8, ptr %next.instr, i64 20
  %stack.3 = getelementptr i8, ptr %stack.pointer, i64 -8
  %l.4 = load ptr, ptr %stack.3, align 8
  %next.instr.2 = getelementptr i8, ptr %next.instr, i64 12
  %next.instr.2.val = load ptr, ptr %next.instr.2, align 2
  store ptr %next.instr.2.val, ptr %stack.3, align 8
  store ptr %l.4, ptr %stack.pointer, align 8
  %stack.next.2 = getelementptr i8, ptr %stack.pointer, i64 8
  br label %loop.header

op6.bb:
  %stack.4 = getelementptr i8, ptr %stack.pointer, i64 -8
  %l.5 = load ptr, ptr %stack.4, align 8
  store i64 1, ptr %l.5, align 8
  %gep.5 = getelementptr i8, ptr %l.5, i64 8
  %l.6 = load ptr, ptr %gep.5, align 8
  %gep.6 = getelementptr i8, ptr %l.6, i64 48
  %l.7 = load ptr, ptr %gep.6, align 8
  tail call void %l.7(ptr nonnull %l.5)
  br label %loop.header
}