179 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple aarch64 -run-pass=machine-sink -sink-insts-to-avoid-spills \3# RUN: -machine-sink-cycle-limit=1 -verify-machineinstrs %s -o - 2>&1 | \4# RUN: FileCheck %s --check-prefix=SINK15#6# RUN: llc -mtriple aarch64 -run-pass=machine-sink -sink-insts-to-avoid-spills \7# RUN: -machine-sink-cycle-limit=2 -verify-machineinstrs %s -o - 2>&1 | \8# RUN: FileCheck %s --check-prefix=SINK29 10--- |11 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"12 target triple = "aarch64"13 14 @A = external dso_local global [100 x i32], align 415 %struct.A = type { i32, i32, i32, i32, i32, i32 }16 17 define i32 @do_sink_use_is_not_a_copy(i32 %n) {18 entry:19 %cmp63 = icmp sgt i32 %n, 020 br i1 %cmp63, label %for.body.preheader, label %for.cond.cleanup21 22 for.body.preheader: ; preds = %entry23 %0 = load i32, ptr @A, align 424 br label %for.body25 26 for.cond.cleanup: ; preds = %for.body, %entry27 %sum.0.lcssa = phi i32 [ %n, %entry ], [ %div, %for.body ]28 ret i32 %sum.0.lcssa29 30 for.body: ; preds = %for.body, %for.body.preheader31 %lsr.iv = phi i32 [ %n, %for.body.preheader ], [ %lsr.iv.next, %for.body ]32 %sum.065 = phi i32 [ %div, %for.body ], [ %n, %for.body.preheader ]33 %div = sdiv i32 %sum.065, %034 %lsr.iv.next = add i32 %lsr.iv, -135 %exitcond.not = icmp eq i32 %lsr.iv.next, 036 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body37 }38 39...40---41name: do_sink_use_is_not_a_copy42alignment: 443exposesReturnsTwice: false44legalized: false45regBankSelected: false46selected: false47failedISel: false48tracksRegLiveness: true49hasWinCFI: false50registers:51 - { id: 0, class: gpr32, preferred-register: '' }52 - { id: 1, class: gpr32all, preferred-register: '' }53 - { id: 2, class: gpr32sp, preferred-register: '' }54 - { id: 3, class: gpr32, preferred-register: '' }55 - { id: 4, class: gpr32all, preferred-register: '' }56 - { id: 5, class: gpr32all, preferred-register: '' }57 - { id: 6, class: gpr32common, preferred-register: '' }58 - { id: 7, class: gpr32, preferred-register: '' }59 - { id: 8, class: gpr64common, preferred-register: '' }60 - { id: 9, class: gpr32, preferred-register: '' }61 - { id: 10, class: gpr32, preferred-register: '' }62 - { id: 11, class: gpr32, preferred-register: '' }63liveins:64 - { reg: '$w0', virtual-reg: '%6' }65frameInfo:66 isFrameAddressTaken: false67 isReturnAddressTaken: false68 hasStackMap: false69 hasPatchPoint: false70 stackSize: 071 offsetAdjustment: 072 maxAlignment: 173 adjustsStack: false74 hasCalls: false75 stackProtector: ''76 maxCallFrameSize: 077 cvBytesOfCalleeSavedRegisters: 078 hasOpaqueSPAdjustment: false79 hasVAStart: false80 hasMustTailInVarArgFunc: false81 localFrameSize: 082 savePoint: []83 restorePoint: []84fixedStack: []85stack: []86callSites: []87debugValueSubstitutions: []88constants: []89machineFunctionInfo: {}90body: |91 ; SINK1-LABEL: name: do_sink_use_is_not_a_copy92 ; SINK1: bb.0.entry:93 ; SINK1: successors: %bb.1(0x50000000), %bb.2(0x30000000)94 ; SINK1: liveins: $w095 ; SINK1: [[COPY:%[0-9]+]]:gpr32common = COPY $w096 ; SINK1: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 1, 0, implicit-def $nzcv97 ; SINK1: Bcc 11, %bb.2, implicit $nzcv98 ; SINK1: B %bb.199 ; SINK1: bb.1.for.body.preheader:100 ; SINK1: successors: %bb.3(0x80000000)101 ; SINK1: [[ADRP:%[0-9]+]]:gpr64common = ADRP target-flags(aarch64-page) @A102 ; SINK1: [[LDRWui:%[0-9]+]]:gpr32 = LDRWui killed [[ADRP]], target-flags(aarch64-pageoff, aarch64-nc) @A :: (dereferenceable load (s32) from @A)103 ; SINK1: B %bb.3104 ; SINK1: bb.2.for.cond.cleanup:105 ; SINK1: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, %4, %bb.3106 ; SINK1: $w0 = COPY [[PHI]]107 ; SINK1: RET_ReallyLR implicit $w0108 ; SINK1: bb.3.for.body:109 ; SINK1: successors: %bb.2(0x04000000), %bb.3(0x7c000000)110 ; SINK1: [[PHI1:%[0-9]+]]:gpr32sp = PHI [[COPY]], %bb.1, %5, %bb.3111 ; SINK1: [[PHI2:%[0-9]+]]:gpr32 = PHI [[COPY]], %bb.1, %4, %bb.3112 ; SINK1: [[SDIVWr:%[0-9]+]]:gpr32 = SDIVWr [[PHI2]], [[LDRWui]]113 ; SINK1: [[COPY1:%[0-9]+]]:gpr32all = COPY [[SDIVWr]]114 ; SINK1: [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI1]], 1, 0, implicit-def $nzcv115 ; SINK1: [[COPY2:%[0-9]+]]:gpr32all = COPY [[SUBSWri1]]116 ; SINK1: Bcc 0, %bb.2, implicit $nzcv117 ; SINK1: B %bb.3118 ; SINK2-LABEL: name: do_sink_use_is_not_a_copy119 ; SINK2: bb.0.entry:120 ; SINK2: successors: %bb.1(0x50000000), %bb.2(0x30000000)121 ; SINK2: liveins: $w0122 ; SINK2: [[COPY:%[0-9]+]]:gpr32common = COPY $w0123 ; SINK2: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 1, 0, implicit-def $nzcv124 ; SINK2: Bcc 11, %bb.2, implicit $nzcv125 ; SINK2: B %bb.1126 ; SINK2: bb.1.for.body.preheader:127 ; SINK2: successors: %bb.3(0x80000000)128 ; SINK2: [[ADRP:%[0-9]+]]:gpr64common = ADRP target-flags(aarch64-page) @A129 ; SINK2: [[LDRWui:%[0-9]+]]:gpr32 = LDRWui killed [[ADRP]], target-flags(aarch64-pageoff, aarch64-nc) @A :: (dereferenceable load (s32) from @A)130 ; SINK2: B %bb.3131 ; SINK2: bb.2.for.cond.cleanup:132 ; SINK2: [[PHI:%[0-9]+]]:gpr32all = PHI [[COPY]], %bb.0, %4, %bb.3133 ; SINK2: $w0 = COPY [[PHI]]134 ; SINK2: RET_ReallyLR implicit $w0135 ; SINK2: bb.3.for.body:136 ; SINK2: successors: %bb.2(0x04000000), %bb.3(0x7c000000)137 ; SINK2: [[PHI1:%[0-9]+]]:gpr32sp = PHI [[COPY]], %bb.1, %5, %bb.3138 ; SINK2: [[PHI2:%[0-9]+]]:gpr32 = PHI [[COPY]], %bb.1, %4, %bb.3139 ; SINK2: [[SDIVWr:%[0-9]+]]:gpr32 = SDIVWr [[PHI2]], [[LDRWui]]140 ; SINK2: [[COPY1:%[0-9]+]]:gpr32all = COPY [[SDIVWr]]141 ; SINK2: [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI1]], 1, 0, implicit-def $nzcv142 ; SINK2: [[COPY2:%[0-9]+]]:gpr32all = COPY [[SUBSWri1]]143 ; SINK2: Bcc 0, %bb.2, implicit $nzcv144 ; SINK2: B %bb.3145 bb.0.entry:146 successors: %bb.1(0x50000000), %bb.2(0x30000000)147 liveins: $w0148 149 %6:gpr32common = COPY $w0150 %7:gpr32 = SUBSWri %6, 1, 0, implicit-def $nzcv151 Bcc 11, %bb.2, implicit $nzcv152 B %bb.1153 154 bb.1.for.body.preheader:155 successors: %bb.3(0x80000000)156 157 %8:gpr64common = ADRP target-flags(aarch64-page) @A158 %9:gpr32 = LDRWui killed %8, target-flags(aarch64-pageoff, aarch64-nc) @A :: (dereferenceable load (s32) from @A)159 B %bb.3160 161 bb.2.for.cond.cleanup:162 %1:gpr32all = PHI %6, %bb.0, %4, %bb.3163 $w0 = COPY %1164 RET_ReallyLR implicit $w0165 166 bb.3.for.body:167 successors: %bb.2(0x04000000), %bb.3(0x7c000000)168 169 %2:gpr32sp = PHI %6, %bb.1, %5, %bb.3170 %3:gpr32 = PHI %6, %bb.1, %4, %bb.3171 %10:gpr32 = SDIVWr %3, %9172 %4:gpr32all = COPY %10173 %11:gpr32 = SUBSWri %2, 1, 0, implicit-def $nzcv174 %5:gpr32all = COPY %11175 Bcc 0, %bb.2, implicit $nzcv176 B %bb.3177 178...179