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
}
|