|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: llc -tail-dup-pred-size=2 -tail-dup-succ-size=2 -o - %s | FileCheck %s |
| 3 | + |
| 4 | +target triple = "arm64-apple-macosx13.0.0" |
| 5 | + |
| 6 | +@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)] |
| 7 | + |
| 8 | +define void @test_interp(ptr %frame, ptr %dst) { |
| 9 | +; CHECK-LABEL: test_interp: |
| 10 | +; CHECK: ; %bb.0: ; %entry |
| 11 | +; CHECK-NEXT: stp x24, x23, [sp, #-64]! ; 16-byte Folded Spill |
| 12 | +; CHECK-NEXT: stp x22, x21, [sp, #16] ; 16-byte Folded Spill |
| 13 | +; CHECK-NEXT: stp x20, x19, [sp, #32] ; 16-byte Folded Spill |
| 14 | +; CHECK-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill |
| 15 | +; CHECK-NEXT: .cfi_def_cfa_offset 64 |
| 16 | +; CHECK-NEXT: .cfi_offset w30, -8 |
| 17 | +; CHECK-NEXT: .cfi_offset w29, -16 |
| 18 | +; CHECK-NEXT: .cfi_offset w19, -24 |
| 19 | +; CHECK-NEXT: .cfi_offset w20, -32 |
| 20 | +; CHECK-NEXT: .cfi_offset w21, -40 |
| 21 | +; CHECK-NEXT: .cfi_offset w22, -48 |
| 22 | +; CHECK-NEXT: .cfi_offset w23, -56 |
| 23 | +; CHECK-NEXT: .cfi_offset w24, -64 |
| 24 | +; CHECK-NEXT: Lloh0: |
| 25 | +; CHECK-NEXT: adrp x21, _opcode.targets@PAGE |
| 26 | +; CHECK-NEXT: Lloh1: |
| 27 | +; CHECK-NEXT: add x21, x21, _opcode.targets@PAGEOFF |
| 28 | +; CHECK-NEXT: mov x22, xzr |
| 29 | +; CHECK-NEXT: add x8, x21, xzr, lsl #3 |
| 30 | +; CHECK-NEXT: mov x19, x1 |
| 31 | +; CHECK-NEXT: mov x20, x0 |
| 32 | +; CHECK-NEXT: add x23, x22, #1 |
| 33 | +; CHECK-NEXT: br x8 |
| 34 | +; CHECK-NEXT: Ltmp0: ; Block address taken |
| 35 | +; CHECK-NEXT: LBB0_1: ; %loop.header |
| 36 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 37 | +; CHECK-NEXT: add x8, x21, x23, lsl #3 |
| 38 | +; CHECK-NEXT: mov x20, xzr |
| 39 | +; CHECK-NEXT: mov x22, xzr |
| 40 | +; CHECK-NEXT: add x23, x23, #1 |
| 41 | +; CHECK-NEXT: br x8 |
| 42 | +; CHECK-NEXT: Ltmp1: ; Block address taken |
| 43 | +; CHECK-NEXT: LBB0_2: ; %op1.bb |
| 44 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 45 | +; CHECK-NEXT: str xzr, [x19] |
| 46 | +; CHECK-NEXT: mov w8, #1 ; =0x1 |
| 47 | +; CHECK-NEXT: ldr x0, [x20, #-8]! |
| 48 | +; CHECK-NEXT: ldr x9, [x0, #8] |
| 49 | +; CHECK-NEXT: str x8, [x0] |
| 50 | +; CHECK-NEXT: ldr x8, [x9, #48] |
| 51 | +; CHECK-NEXT: blr x8 |
| 52 | +; CHECK-NEXT: add x8, x21, x23, lsl #3 |
| 53 | +; CHECK-NEXT: add x23, x23, #1 |
| 54 | +; CHECK-NEXT: br x8 |
| 55 | +; CHECK-NEXT: Ltmp2: ; Block address taken |
| 56 | +; CHECK-NEXT: LBB0_3: ; %op2.bb |
| 57 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 58 | +; CHECK-NEXT: add x8, x21, x23, lsl #3 |
| 59 | +; CHECK-NEXT: mov x20, xzr |
| 60 | +; CHECK-NEXT: add x23, x23, #1 |
| 61 | +; CHECK-NEXT: str x22, [x19] |
| 62 | +; CHECK-NEXT: mov x22, xzr |
| 63 | +; CHECK-NEXT: br x8 |
| 64 | +; CHECK-NEXT: Ltmp3: ; Block address taken |
| 65 | +; CHECK-NEXT: LBB0_4: ; %op4.bb |
| 66 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 67 | +; CHECK-NEXT: str x22, [x19] |
| 68 | +; CHECK-NEXT: add x10, x21, x23, lsl #3 |
| 69 | +; CHECK-NEXT: add x23, x23, #1 |
| 70 | +; CHECK-NEXT: ldur x8, [x22, #12] |
| 71 | +; CHECK-NEXT: ldur x9, [x20, #-8] |
| 72 | +; CHECK-NEXT: add x22, x22, #20 |
| 73 | +; CHECK-NEXT: stp x8, x9, [x20, #-8] |
| 74 | +; CHECK-NEXT: add x20, x20, #8 |
| 75 | +; CHECK-NEXT: br x10 |
| 76 | +; CHECK-NEXT: Ltmp4: ; Block address taken |
| 77 | +; CHECK-NEXT: LBB0_5: ; %op5.bb |
| 78 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 79 | +; CHECK-NEXT: str x22, [x19] |
| 80 | +; CHECK-NEXT: add x10, x21, x23, lsl #3 |
| 81 | +; CHECK-NEXT: add x23, x23, #1 |
| 82 | +; CHECK-NEXT: ldur x8, [x22, #12] |
| 83 | +; CHECK-NEXT: ldur x9, [x20, #-8] |
| 84 | +; CHECK-NEXT: add x22, x22, #20 |
| 85 | +; CHECK-NEXT: stp x8, x9, [x20, #-8] |
| 86 | +; CHECK-NEXT: add x20, x20, #8 |
| 87 | +; CHECK-NEXT: br x10 |
| 88 | +; CHECK-NEXT: Ltmp5: ; Block address taken |
| 89 | +; CHECK-NEXT: LBB0_6: ; %op6.bb |
| 90 | +; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| 91 | +; CHECK-NEXT: ldr x0, [x20, #-8]! |
| 92 | +; CHECK-NEXT: mov w8, #1 ; =0x1 |
| 93 | +; CHECK-NEXT: ldr x9, [x0, #8] |
| 94 | +; CHECK-NEXT: str x8, [x0] |
| 95 | +; CHECK-NEXT: ldr x8, [x9, #48] |
| 96 | +; CHECK-NEXT: blr x8 |
| 97 | +; CHECK-NEXT: add x8, x21, x23, lsl #3 |
| 98 | +; CHECK-NEXT: add x23, x23, #1 |
| 99 | +; CHECK-NEXT: br x8 |
| 100 | +; CHECK-NEXT: .loh AdrpAdd Lloh0, Lloh1 |
| 101 | +entry: |
| 102 | + br label %loop.header |
| 103 | + |
| 104 | +loop.header: |
| 105 | + %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 ] |
| 106 | + %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 ] |
| 107 | + %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 ] |
| 108 | + %iv.next = add i64 %iv, 1 |
| 109 | + %next_op = getelementptr [6 x ptr], ptr @opcode.targets, i64 0, i64 %iv |
| 110 | + indirectbr ptr %next_op, [label %op1.bb, label %op6.bb, label %loop.header, label %op2.bb, label %op4.bb, label %op5.bb] |
| 111 | + |
| 112 | +op1.bb: |
| 113 | + store ptr null, ptr %dst, align 8 |
| 114 | + %stack.8 = getelementptr i8, ptr %stack.pointer, i64 -8 |
| 115 | + %l.0 = load ptr, ptr %stack.8, align 8 |
| 116 | + store i64 1, ptr %l.0, align 8 |
| 117 | + %gep.0 = getelementptr i8, ptr %l.0, i64 8 |
| 118 | + %l.1 = load ptr, ptr %gep.0, align 8 |
| 119 | + %gep.1 = getelementptr i8, ptr %l.1, i64 48 |
| 120 | + %l.2 = load ptr, ptr %gep.1, align 8 |
| 121 | + tail call void %l.2(ptr nonnull %l.0) |
| 122 | + br label %loop.header |
| 123 | + |
| 124 | +op2.bb: |
| 125 | + store ptr %next.instr, ptr %dst, align 8 |
| 126 | + br label %loop.header |
| 127 | + |
| 128 | +op4.bb: |
| 129 | + store ptr %next.instr, ptr %dst, align 8 |
| 130 | + %next.instr.20 = getelementptr i8, ptr %next.instr, i64 20 |
| 131 | + %stack.2 = getelementptr i8, ptr %stack.pointer, i64 -8 |
| 132 | + %l.3 = load ptr, ptr %stack.2, align 8 |
| 133 | + %next.instr.12 = getelementptr i8, ptr %next.instr, i64 12 |
| 134 | + %next.instr.12.val = load ptr, ptr %next.instr.12, align 2 |
| 135 | + store ptr %next.instr.12.val, ptr %stack.2, align 8 |
| 136 | + store ptr %l.3, ptr %stack.pointer, align 8 |
| 137 | + %stack.next = getelementptr i8, ptr %stack.pointer, i64 8 |
| 138 | + br label %loop.header |
| 139 | + |
| 140 | +op5.bb: |
| 141 | + store ptr %next.instr, ptr %dst, align 8 |
| 142 | + %next.instr.21 = getelementptr i8, ptr %next.instr, i64 20 |
| 143 | + %stack.3 = getelementptr i8, ptr %stack.pointer, i64 -8 |
| 144 | + %l.4 = load ptr, ptr %stack.3, align 8 |
| 145 | + %next.instr.2 = getelementptr i8, ptr %next.instr, i64 12 |
| 146 | + %next.instr.2.val = load ptr, ptr %next.instr.2, align 2 |
| 147 | + store ptr %next.instr.2.val, ptr %stack.3, align 8 |
| 148 | + store ptr %l.4, ptr %stack.pointer, align 8 |
| 149 | + %stack.next.2 = getelementptr i8, ptr %stack.pointer, i64 8 |
| 150 | + br label %loop.header |
| 151 | + |
| 152 | +op6.bb: |
| 153 | + %stack.4 = getelementptr i8, ptr %stack.pointer, i64 -8 |
| 154 | + %l.5 = load ptr, ptr %stack.4, align 8 |
| 155 | + store i64 1, ptr %l.5, align 8 |
| 156 | + %gep.5 = getelementptr i8, ptr %l.5, i64 8 |
| 157 | + %l.6 = load ptr, ptr %gep.5, align 8 |
| 158 | + %gep.6 = getelementptr i8, ptr %l.6, i64 48 |
| 159 | + %l.7 = load ptr, ptr %gep.6, align 8 |
| 160 | + tail call void %l.7(ptr nonnull %l.5) |
| 161 | + br label %loop.header |
| 162 | +} |
0 commit comments