File: late-taildup-computed-goto.ll

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (143 lines) | stat: -rw-r--r-- 6,043 bytes parent folder | download | duplicates (3)
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
; 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 x24, xzr
; CHECK-NEXT:    add x8, x21, xzr, lsl #3
; CHECK-NEXT:    mov x19, x1
; CHECK-NEXT:    mov x20, x0
; CHECK-NEXT:    mov x23, xzr
; CHECK-NEXT:    mov w22, #1 ; =0x1
; CHECK-NEXT:    add x24, x24, #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, x24, lsl #3
; CHECK-NEXT:    mov x20, xzr
; CHECK-NEXT:    mov x23, xzr
; CHECK-NEXT:    add x24, x24, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp1: ; Block address taken
; CHECK-NEXT:  LBB0_2: ; %op1.bb
; CHECK-NEXT:    str xzr, [x19]
; CHECK-NEXT:  Ltmp2: ; Block address taken
; CHECK-NEXT:  LBB0_3: ; %op6.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    ldr x0, [x20, #-8]!
; CHECK-NEXT:    ldr x8, [x0, #8]
; CHECK-NEXT:    str x22, [x0]
; CHECK-NEXT:    ldr x8, [x8, #48]
; CHECK-NEXT:    blr x8
; CHECK-NEXT:    add x8, x21, x24, lsl #3
; CHECK-NEXT:    add x24, x24, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp3: ; Block address taken
; CHECK-NEXT:  LBB0_4: ; %op2.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    add x8, x21, x24, lsl #3
; CHECK-NEXT:    mov x20, xzr
; CHECK-NEXT:    str x23, [x19]
; CHECK-NEXT:    mov x23, xzr
; CHECK-NEXT:    add x24, x24, #1
; CHECK-NEXT:    br x8
; CHECK-NEXT:  Ltmp4: ; Block address taken
; CHECK-NEXT:  LBB0_5: ; %op4.bb
; CHECK-NEXT:  Ltmp5: ; Block address taken
; CHECK-NEXT:  LBB0_6: ; %op5.bb
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    str x23, [x19]
; CHECK-NEXT:    ldur x8, [x23, #12]
; CHECK-NEXT:    ldur x9, [x20, #-8]
; CHECK-NEXT:    add x23, x23, #20
; CHECK-NEXT:    stp x8, x9, [x20, #-8]
; CHECK-NEXT:    add x8, x21, x24, lsl #3
; CHECK-NEXT:    add x20, x20, #8
; CHECK-NEXT:    add x24, x24, #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
}