|
| 1 | +# REQUIRES: asserts |
| 2 | +# |
| 3 | +# RUN: llc --march=hexagon %s -run-pass=pipeliner -debug-only=pipeliner \ |
| 4 | +# RUN: -window-sched=force -filetype=null -window-search-num=100 \ |
| 5 | +# RUN: -window-search-ratio=100 -window-diff-limit=0 -verify-machineinstrs \ |
| 6 | +# RUN: 2>&1 | FileCheck %s |
| 7 | + |
| 8 | +# The bug was reported at https://github.com/llvm/llvm-project/pull/99454. |
| 9 | +# It is caused by the corruption of live intervals in certain scenarios. |
| 10 | +# |
| 11 | +# We check the newly generated MBBs after successful scheduling here. |
| 12 | +# CHECK: Best window offset is {{[0-9]+}} and Best II is {{[0-9]+}}. |
| 13 | +# CHECK: prolog: |
| 14 | +# CHECK: bb.5: |
| 15 | +# CHECK: New block |
| 16 | +# CHECK: bb.6: |
| 17 | +# CHECK: epilog: |
| 18 | +# CHECK: bb.7: |
| 19 | +# CHECK: Best window offset is {{[0-9]+}} and Best II is {{[0-9]+}}. |
| 20 | +# CHECK: prolog: |
| 21 | +# CHECK: bb.8: |
| 22 | +# CHECK: New block |
| 23 | +# CHECK: bb.9: |
| 24 | +# CHECK: epilog: |
| 25 | +# CHECK: bb.10: |
| 26 | + |
| 27 | +--- | |
| 28 | + target triple = "hexagon" |
| 29 | + |
| 30 | + @_dp_ctrl_calc_tu_temp2_fp = global i64 0 |
| 31 | + @_dp_ctrl_calc_tu_temp1_fp = global i32 0 |
| 32 | + @dp_panel_update_tu_timings___trans_tmp_5 = global i64 0 |
| 33 | + @_dp_ctrl_calc_tu___trans_tmp_8 = global i64 0 |
| 34 | + |
| 35 | + declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) |
| 36 | + declare i8 @div64_u64_rem(i32, ptr) |
| 37 | + declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) |
| 38 | + |
| 39 | + define void @dp_ctrl_calc_tu_parameters() { |
| 40 | + if.end.i: |
| 41 | + %rem.i11.i = alloca i64, align 8 |
| 42 | + %rem.i.i = alloca i64, align 8 |
| 43 | + call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %rem.i11.i) |
| 44 | + %call.i.i = call i8 @div64_u64_rem(i32 0, ptr nonnull %rem.i11.i) |
| 45 | + %conv1.i.i = zext i8 %call.i.i to i64 |
| 46 | + %rem.promoted.i.i = load i64, ptr %rem.i11.i, align 8 |
| 47 | + br label %do.body.i.i |
| 48 | + |
| 49 | + do.body.i.i: |
| 50 | + %lsr.iv1 = phi i32 [ %lsr.iv.next2, %do.body.i.i ], [ -32, %if.end.i ] |
| 51 | + %sub9.i.i = phi i64 [ %rem.promoted.i.i, %if.end.i ], [ %sub8.i.i.7, %do.body.i.i ] |
| 52 | + %res_abs.0.i.i = phi i64 [ %conv1.i.i, %if.end.i ], [ %res_abs.1.i.i.7, %do.body.i.i ] |
| 53 | + %cmp.not.i.i = icmp ne i64 %sub9.i.i, 0 |
| 54 | + %sub.i.neg.i = sext i1 %cmp.not.i.i to i64 |
| 55 | + %sub8.i.i = add i64 %sub9.i.i, %sub.i.neg.i |
| 56 | + %0 = shl i64 %res_abs.0.i.i, 2 |
| 57 | + %1 = select i1 %cmp.not.i.i, i64 2, i64 0 |
| 58 | + %shl.i.i.5 = or disjoint i64 %0, %1 |
| 59 | + %cmp.not.i.i.5 = icmp ne i64 %sub8.i.i, 0 |
| 60 | + %sub.i.neg.i.5 = sext i1 %cmp.not.i.i.5 to i64 |
| 61 | + %sub8.i.i.5 = add i64 %sub8.i.i, %sub.i.neg.i.5 |
| 62 | + %or.i.i.5 = zext i1 %cmp.not.i.i.5 to i64 |
| 63 | + %res_abs.1.i.i.5 = or disjoint i64 %shl.i.i.5, %or.i.i.5 |
| 64 | + %cmp.not.i.i.6 = icmp ne i64 %sub8.i.i.5, 0 |
| 65 | + %sub.i.neg.i.6 = sext i1 %cmp.not.i.i.6 to i64 |
| 66 | + %sub8.i.i.6 = add i64 %sub8.i.i.5, %sub.i.neg.i.6 |
| 67 | + %2 = shl i64 %res_abs.1.i.i.5, 2 |
| 68 | + %3 = select i1 %cmp.not.i.i.6, i64 2, i64 0 |
| 69 | + %shl.i.i.7 = or disjoint i64 %2, %3 |
| 70 | + %cmp.not.i.i.7 = icmp ne i64 %sub8.i.i.6, 0 |
| 71 | + %sub.i.neg.i.7 = sext i1 %cmp.not.i.i.7 to i64 |
| 72 | + %sub8.i.i.7 = add i64 %sub8.i.i.6, %sub.i.neg.i.7 |
| 73 | + %or.i.i.7 = zext i1 %cmp.not.i.i.7 to i64 |
| 74 | + %res_abs.1.i.i.7 = or disjoint i64 %shl.i.i.7, %or.i.i.7 |
| 75 | + %lsr.iv.next2 = add nsw i32 %lsr.iv1, 8 |
| 76 | + %tobool.not.i.i.7 = icmp eq i32 %lsr.iv.next2, 0 |
| 77 | + br i1 %tobool.not.i.i.7, label %fec_check.i, label %do.body.i.i |
| 78 | + |
| 79 | + fec_check.i: |
| 80 | + call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %rem.i11.i) |
| 81 | + store i64 %res_abs.1.i.i.7, ptr @_dp_ctrl_calc_tu_temp2_fp, align 8 |
| 82 | + call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %rem.i11.i) |
| 83 | + %call.i12.i = call i8 @div64_u64_rem(i32 0, ptr nonnull %rem.i11.i) |
| 84 | + %conv1.i13.i = zext i8 %call.i12.i to i64 |
| 85 | + %rem.promoted.i14.i = load i64, ptr %rem.i11.i, align 8 |
| 86 | + br label %do.body.i15.i |
| 87 | + |
| 88 | + do.body.i15.i: |
| 89 | + %lsr.iv = phi i32 [ %lsr.iv.next, %do.body.i15.i ], [ -32, %fec_check.i ] |
| 90 | + %sub9.i16.i = phi i64 [ %rem.promoted.i14.i, %fec_check.i ], [ %sub8.i22.i.7, %do.body.i15.i ] |
| 91 | + %res_abs.0.i17.i = phi i64 [ %conv1.i13.i, %fec_check.i ], [ %res_abs.1.i24.i.7, %do.body.i15.i ] |
| 92 | + %cmp.not.i20.i = icmp ugt i64 %sub9.i16.i, 999 |
| 93 | + %sub.i21.neg.i = select i1 %cmp.not.i20.i, i64 -1000, i64 0 |
| 94 | + %sub8.i22.i = add i64 %sub.i21.neg.i, %sub9.i16.i |
| 95 | + %4 = shl i64 %res_abs.0.i17.i, 2 |
| 96 | + %5 = select i1 %cmp.not.i20.i, i64 2, i64 0 |
| 97 | + %shl.i19.i.7 = or disjoint i64 %4, %5 |
| 98 | + %cmp.not.i20.i.7 = icmp ugt i64 %sub8.i22.i, 999 |
| 99 | + %sub.i21.neg.i.7 = select i1 %cmp.not.i20.i.7, i64 -1000, i64 0 |
| 100 | + %sub8.i22.i.7 = add i64 %sub.i21.neg.i.7, %sub8.i22.i |
| 101 | + %or.i23.i.7 = zext i1 %cmp.not.i20.i.7 to i64 |
| 102 | + %res_abs.1.i24.i.7 = or disjoint i64 %shl.i19.i.7, %or.i23.i.7 |
| 103 | + %lsr.iv.next = add nsw i32 %lsr.iv, 8 |
| 104 | + %tobool.not.i26.i.7 = icmp eq i32 %lsr.iv.next, 0 |
| 105 | + br i1 %tobool.not.i26.i.7, label %_dp_ctrl_calc_tu.exit, label %do.body.i15.i |
| 106 | + |
| 107 | + _dp_ctrl_calc_tu.exit: |
| 108 | + call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %rem.i11.i) |
| 109 | + %conv.i = trunc i64 %res_abs.1.i24.i.7 to i32 |
| 110 | + store i32 %conv.i, ptr @_dp_ctrl_calc_tu_temp1_fp, align 4 |
| 111 | + %conv5.i = and i64 %res_abs.1.i24.i.7, 4294967295 |
| 112 | + store i64 %conv5.i, ptr @dp_panel_update_tu_timings___trans_tmp_5, align 8 |
| 113 | + store i64 %res_abs.1.i.i.7, ptr @_dp_ctrl_calc_tu___trans_tmp_8, align 8 |
| 114 | + ret void |
| 115 | + } |
| 116 | + |
| 117 | +... |
| 118 | +--- |
| 119 | +name: dp_ctrl_calc_tu_parameters |
| 120 | +tracksRegLiveness: true |
| 121 | +stack: |
| 122 | + - { id: 0, name: rem.i11.i, type: default, offset: 0, size: 8, alignment: 8} |
| 123 | +body: | |
| 124 | + bb.0: |
| 125 | + successors: %bb.1(0x80000000) |
| 126 | + |
| 127 | + %0:intregs = A2_tfrsi 0 |
| 128 | + %1:intregs = PS_fi %stack.0.rem.i11.i, 0 |
| 129 | + %2:intregs = A2_tfrsi 0 |
| 130 | + %3:doubleregs = A4_combineir 0, %2 |
| 131 | + %4:doubleregs = L2_loadrd_io %stack.0.rem.i11.i, 0 |
| 132 | + %5:doubleregs = A2_tfrpi 0 |
| 133 | + J2_loop0i %bb.1, 4, implicit-def $lc0, implicit-def $sa0, implicit-def $usr |
| 134 | + |
| 135 | + bb.1 (machine-block-address-taken): |
| 136 | + successors: %bb.2(0x04000000), %bb.1(0x7c000000) |
| 137 | + |
| 138 | + %6:doubleregs = PHI %4, %bb.0, %7, %bb.1 |
| 139 | + %8:doubleregs = PHI %3, %bb.0, %9, %bb.1 |
| 140 | + %10:predregs = C2_cmpeqp %6, %5 |
| 141 | + %11:intregs = C2_muxii %10, 0, -1 |
| 142 | + %12:doubleregs = A2_addsp %11, %6 |
| 143 | + %13:doubleregs = S2_asl_i_p %8, 2 |
| 144 | + %14:intregs = S2_setbit_i %13.isub_lo, 1 |
| 145 | + %15:intregs = C2_mux %10, %13.isub_lo, %14 |
| 146 | + %16:predregs = C2_cmpeqp %12, %5 |
| 147 | + %17:intregs = C2_muxii %16, 0, -1 |
| 148 | + %18:doubleregs = A2_addsp %17, %12 |
| 149 | + %19:intregs = S2_setbit_i %15, 0 |
| 150 | + %20:intregs = C2_mux %16, %15, %19 |
| 151 | + %21:predregs = C2_cmpeqp %18, %5 |
| 152 | + %22:intregs = C2_muxii %21, 0, -1 |
| 153 | + %23:doubleregs = A2_addsp %22, %18 |
| 154 | + %24:intregs = S2_asl_i_r %20, 2 |
| 155 | + %25:intregs = S2_extractu %8.isub_lo, 2, 28 |
| 156 | + %26:intregs = S2_asl_i_r_or %25, %13.isub_hi, 2 |
| 157 | + %27:intregs = S2_setbit_i %24, 1 |
| 158 | + %28:intregs = C2_mux %21, %24, %27 |
| 159 | + %29:predregs = C2_cmpeqp %23, %5 |
| 160 | + %30:intregs = C2_muxii %29, 0, -1 |
| 161 | + %7:doubleregs = A2_addsp %30, %23 |
| 162 | + %31:intregs = S2_setbit_i %28, 0 |
| 163 | + %32:intregs = C2_mux %29, %28, %31 |
| 164 | + %9:doubleregs = REG_SEQUENCE %26, %subreg.isub_hi, %32, %subreg.isub_lo |
| 165 | + ENDLOOP0 %bb.1, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0 |
| 166 | + J2_jump %bb.2, implicit-def dead $pc |
| 167 | + |
| 168 | + bb.2: |
| 169 | + successors: %bb.3(0x80000000) |
| 170 | + |
| 171 | + S2_storerdgp @_dp_ctrl_calc_tu_temp2_fp, %9, implicit $gp |
| 172 | + %33:intregs = A2_tfrsi 0 |
| 173 | + %34:intregs = PS_fi %stack.0.rem.i11.i, 0 |
| 174 | + %35:intregs = A2_tfrsi 0 |
| 175 | + %36:doubleregs = L2_loadrd_io %stack.0.rem.i11.i, 0 |
| 176 | + %37:doubleregs = A2_tfrpi 124 |
| 177 | + %38:intregs = A2_tfrsi -1000 |
| 178 | + %39:intregs = A2_tfrsi -1 |
| 179 | + J2_loop0i %bb.3, 4, implicit-def $lc0, implicit-def $sa0, implicit-def $usr |
| 180 | + |
| 181 | + bb.3 (machine-block-address-taken): |
| 182 | + successors: %bb.4(0x04000000), %bb.3(0x7c000000) |
| 183 | + |
| 184 | + %40:doubleregs = PHI %36, %bb.2, %41, %bb.3 |
| 185 | + %42:intregs = PHI %35, %bb.2, %43, %bb.3 |
| 186 | + %44:intregs = PHI %33, %bb.2, %45, %bb.3 |
| 187 | + %46:doubleregs = S2_lsr_i_p %40, 3 |
| 188 | + %47:predregs = C2_cmpgtup %46, %37 |
| 189 | + %48:intregs = C2_mux %47, %38, %33 |
| 190 | + %49:intregs = C2_mux %47, %39, %33 |
| 191 | + %50:doubleregs = REG_SEQUENCE %49, %subreg.isub_hi, %48, %subreg.isub_lo |
| 192 | + %51:doubleregs = A2_addp %50, %40 |
| 193 | + %52:intregs = S2_asl_i_r %42, 2 |
| 194 | + %53:intregs = S2_extractu %42, 2, 30 |
| 195 | + %45:intregs = S2_asl_i_r_or %53, %44, 2 |
| 196 | + %54:intregs = S2_setbit_i %52, 1 |
| 197 | + %55:intregs = C2_mux %47, %54, %52 |
| 198 | + %56:doubleregs = S2_lsr_i_p %51, 3 |
| 199 | + %57:predregs = C2_cmpgtup %56, %37 |
| 200 | + %58:intregs = C2_mux %57, %38, %33 |
| 201 | + %59:intregs = C2_mux %57, %39, %33 |
| 202 | + %60:doubleregs = REG_SEQUENCE %59, %subreg.isub_hi, %58, %subreg.isub_lo |
| 203 | + %41:doubleregs = A2_addp %60, %51 |
| 204 | + %61:intregs = S2_setbit_i %55, 0 |
| 205 | + %43:intregs = C2_mux %57, %61, %55 |
| 206 | + ENDLOOP0 %bb.3, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0 |
| 207 | + J2_jump %bb.4, implicit-def dead $pc |
| 208 | + |
| 209 | + bb.4: |
| 210 | + S2_storerigp @_dp_ctrl_calc_tu_temp1_fp, %43, implicit $gp |
| 211 | + %62:intregs = A2_tfrsi 0 |
| 212 | + %63:doubleregs = REG_SEQUENCE %43, %subreg.isub_lo, %62, %subreg.isub_hi |
| 213 | + S2_storerdgp @dp_panel_update_tu_timings___trans_tmp_5, %63, implicit $gp |
| 214 | + S2_storerdgp @_dp_ctrl_calc_tu___trans_tmp_8, %9, implicit $gp |
| 215 | + PS_jmpret $r31, implicit-def dead $pc |
| 216 | +
|
| 217 | +... |
0 commit comments