Index: lib/CodeGen/MachineScheduler.cpp =================================================================== --- lib/CodeGen/MachineScheduler.cpp +++ lib/CodeGen/MachineScheduler.cpp @@ -2843,6 +2843,9 @@ return 0; } +// EXPERIMENTAL +static cl::opt LESSLATENCY("lesslatency", cl::init(false)); + void GenericScheduler::initCandidate(SchedCandidate &Cand, SUnit *SU, bool AtTop, const RegPressureTracker &RPTracker, @@ -2873,7 +2876,32 @@ DAG->getRegPressure().MaxSetPressure); } } + + if (LESSLATENCY && Cand.Policy.ReduceLatency) { + // Don't schedule SU for latency if it is related to a high pressure. + // This assumes input order is register pressure friendly, and that + // the regpressure heuristics may fail to see the bigger picture. + const std::vector &CurrPressure = RPTracker.getRegSetPressureAtPos(); + for (unsigned PSet = 0; PSet < CurrPressure.size(); ++PSet) { + unsigned Limit = Context->RegClassInfo->getRegPressureSetLimit(PSet); + if (CurrPressure[PSet] + 1 < Limit) + continue; + + // Look at the cached pressure diff of SU. + PressureDiff &PDiff = DAG->getPressureDiff(SU); + for (const PressureChange &PC : PDiff) { + if (!PC.isValid()) + break; + if (PC.getPSet() == PSet) { + Cand.Policy.ReduceLatency = false; + goto Done; + } + } + } + Done:; + } } + DEBUG(if (Cand.RPDelta.Excess.isValid()) dbgs() << " Try SU(" << Cand.SU->NodeNum << ") " << TRI->getRegPressureSetName(Cand.RPDelta.Excess.getPSet()) Index: test/CodeGen/SystemZ/misched-bidir-spill.ll =================================================================== --- /dev/null +++ test/CodeGen/SystemZ/misched-bidir-spill.ll @@ -0,0 +1,233 @@ + +; NOTE: -lesslatency is EXPERIMENTAL (temporary) +; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -misched-topdown=false -misched-bottomup=false -stats -lesslatency < %s 2>&1 | FileCheck %s +; REQUIRES: asserts + +; CHECK-NOT: spilled live ranges + +%0 = type { %1, %35 } +%1 = type { %2, %30 } +%2 = type { %3, %16 } +%3 = type { %4, %4, %9, %13 } +%4 = type { %5 } +%5 = type { %6 } +%6 = type { %7, %7, i64* } +%7 = type { %8, [4 x i8] } +%8 = type <{ i64*, i32 }> +%9 = type { %10 } +%10 = type { %11 } +%11 = type { %12*, %12*, %12* } +%12 = type { i32, i32 } +%13 = type { %14 } +%14 = type { %15 } +%15 = type { i32*, i32*, i32* } +%16 = type { %17, %21, %4, %4, %24, %27 } +%17 = type { %18 } +%18 = type { %19 } +%19 = type { %20*, %20*, %20* } +%20 = type { [2 x i32] } +%21 = type { %22 } +%22 = type { %23 } +%23 = type { i32*, i32*, i32* } +%24 = type { %25 } +%25 = type { %26 } +%26 = type { i8*, i8*, i8* } +%27 = type { %28 } +%28 = type { %29 } +%29 = type { i8**, i8**, i8** } +%30 = type { %31, %21, %4, %4, %24, %27 } +%31 = type { %32 } +%32 = type { %33 } +%33 = type { %34*, %34*, %34* } +%34 = type { [4 x i32] } +%35 = type { %36, %21, %4, %4, %24, %27, %4 } +%36 = type { %37 } +%37 = type { %38 } +%38 = type { %39*, %39*, %39* } +%39 = type { [6 x i32] } +%40 = type { %41 } +%41 = type { [3 x double] } + +define void @fun() { + %1 = load %0**, %0*** undef, align 8 + %2 = getelementptr inbounds %0*, %0** %1, i64 undef + %3 = load %0*, %0** %2, align 8 + %4 = getelementptr inbounds %0, %0* %3, i64 0, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0 + %5 = load %34*, %34** %4, align 8 + %6 = getelementptr inbounds %0, %0* %3, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0 + %7 = load %20*, %20** %6, align 8 + %8 = load i32, i32* undef, align 4 + %9 = sext i32 %8 to i64 + %10 = load %40*, %40** undef, align 8 + %11 = getelementptr inbounds %20, %20* %7, i64 undef, i32 0, i64 0 + %12 = load i32, i32* %11, align 4 + %13 = sext i32 %12 to i64 + %14 = getelementptr inbounds %40, %40* %10, i64 %13, i32 0, i32 0, i64 0 + %15 = load double, double* %14, align 8 + %16 = getelementptr inbounds %34, %34* %5, i64 undef, i32 0, i64 0 + %17 = load i32, i32* %16, align 4 + %18 = sext i32 %17 to i64 + %19 = getelementptr inbounds %20, %20* %7, i64 %18, i32 0, i64 0 + %20 = load i32, i32* %19, align 4 + %21 = sext i32 %20 to i64 + %22 = load double, double* undef, align 8 + %23 = getelementptr inbounds %20, %20* %7, i64 undef, i32 0, i64 0 + %24 = load double, double* undef, align 8 + %25 = load i32, i32* %23, align 4 + %26 = sext i32 %25 to i64 + %27 = getelementptr inbounds %40, %40* %10, i64 %26, i32 0, i32 0, i64 0 + %28 = load double, double* %27, align 8 + %29 = load double, double* null, align 8 + %30 = getelementptr inbounds %20, %20* %7, i64 undef, i32 0, i64 0 + %31 = getelementptr inbounds %40, %40* %10, i64 undef, i32 0, i32 0, i64 1 + %32 = load double, double* %31, align 8 + %33 = load i32, i32* %30, align 4 + %34 = sext i32 %33 to i64 + %35 = getelementptr inbounds %40, %40* %10, i64 %34, i32 0, i32 0, i64 1 + %36 = load double, double* %35, align 8 + %37 = getelementptr inbounds %40, %40* %10, i64 %21, i32 0, i32 0, i64 1 + %38 = load double, double* %37, align 8 + %39 = load double, double* undef, align 8 + %40 = load double, double* null, align 8 + %41 = getelementptr inbounds %40, %40* %10, i64 undef, i32 0, i32 0, i64 2 + %42 = load double, double* %41, align 8 + %43 = getelementptr inbounds %40, %40* %10, i64 %21, i32 0, i32 0, i64 2 + %44 = load double, double* %43, align 8 + %45 = getelementptr inbounds %40, %40* %10, i64 undef, i32 0, i32 0, i64 2 + %46 = load double, double* %45, align 8 + %47 = fmul double undef, undef + %48 = fmul double %47, %39 + %49 = fmul double %15, undef + %50 = fmul double %38, %49 + %51 = fmul double undef, %32 + %52 = fmul double undef, undef + %53 = fmul double %38, %52 + %54 = fmul double %36, undef + %55 = fdiv double 1.000000e+00, undef + %56 = fmul double %29, %39 + %57 = fmul double %22, %56 + %58 = fmul double 0.000000e+00, %40 + %59 = fmul double 0.000000e+00, %39 + %60 = fadd double %59, undef + %61 = fmul double %55, %60 + %62 = fmul double %61, 0x3FC5555555555555 + %63 = fmul double undef, %44 + %64 = fmul double %22, %63 + %65 = fmul double %24, undef + %66 = fmul double %38, %65 + %67 = fmul double %40, 0.000000e+00 + %68 = fmul double undef, %42 + %69 = fmul double undef, %68 + %70 = fmul double undef, undef + %71 = fmul double 0.000000e+00, %67 + %72 = fmul double %40, %42 + %73 = fmul double 0.000000e+00, %42 + %74 = fmul double undef, 0.000000e+00 + %75 = fmul double undef, undef + %76 = fmul double %29, undef + %77 = fmul double %39, 0.000000e+00 + %78 = fmul double %57, %46 + %79 = fadd double %78, undef + %80 = fmul double 0.000000e+00, %44 + %81 = fsub double %79, %80 + %82 = fmul double %54, %44 + %83 = fsub double %81, %82 + %84 = fmul double %22, %77 + %85 = fmul double %29, %84 + %86 = fsub double %83, %85 + %87 = fmul double %38, undef + %88 = fmul double %87, %40 + %89 = fsub double %86, %88 + %90 = fmul double undef, %72 + %91 = fmul double %29, %90 + %92 = fadd double %91, %89 + %93 = fmul double %36, %73 + %94 = fmul double %93, %44 + %95 = fadd double %94, %92 + %96 = fmul double undef, undef + %97 = fmul double %38, %96 + %98 = fadd double %97, %95 + %99 = fmul double %22, undef + %100 = fmul double %99, %46 + %101 = fadd double %100, %98 + %102 = fmul double undef, %42 + %103 = fmul double undef, %102 + %104 = fmul double %103, %44 + %105 = fadd double %104, %101 + %106 = fmul double 0.000000e+00, %44 + %107 = fsub double %105, %106 + %108 = fmul double undef, %46 + %109 = fsub double %107, %108 + %110 = fmul double %22, %42 + %111 = fmul double %36, %110 + %112 = fmul double %111, %46 + %113 = fadd double %112, %109 + %114 = fmul double %40, %70 + %115 = fsub double %113, %114 + %116 = fmul double %32, %69 + %117 = fadd double %116, %115 + %118 = fmul double %36, 0.000000e+00 + %119 = fsub double %117, %118 + %120 = fsub double %119, undef + %121 = fmul double %38, %74 + %122 = fadd double %121, %120 + %123 = fmul double 0.000000e+00, undef + %124 = fmul double %38, %123 + %125 = fadd double %124, %122 + %126 = fmul double %29, undef + %127 = fmul double %22, %126 + %128 = fmul double %127, %46 + %129 = fadd double %128, %125 + %130 = fmul double %39, %66 + %131 = fsub double %129, %130 + %132 = fmul double %40, %64 + %133 = fadd double %132, %131 + %134 = fmul double %28, %44 + %135 = fmul double %38, %134 + %136 = fmul double %42, %135 + %137 = fadd double %136, %133 + %138 = fmul double %22, %44 + %139 = fmul double undef, %138 + %140 = fmul double %42, %139 + %141 = fsub double %137, %140 + %142 = fmul double undef, %44 + %143 = fmul double %38, %142 + %144 = fmul double %143, %46 + %145 = fsub double %141, %144 + %146 = fadd double undef, %145 + %147 = fmul double %29, undef + %148 = fsub double %146, %147 + %149 = fsub double %148, undef + %150 = fmul double %15, undef + %151 = fmul double %38, %150 + %152 = fadd double %151, %149 + %153 = fsub double %152, undef + %154 = fmul double %39, %75 + %155 = fsub double %153, %154 + %156 = fmul double %38, %71 + %157 = fadd double %156, %155 + %158 = fmul double %22, %67 + %159 = fmul double %29, %158 + %160 = fsub double %157, %159 + %161 = fmul double %15, 0.000000e+00 + %162 = fmul double %161, %44 + %163 = fsub double %160, %162 + %164 = fmul double %32, undef + %165 = fmul double %164, %44 + %166 = fadd double %165, %163 + %167 = fmul double %15, %67 + %168 = fmul double %38, %167 + %169 = fadd double %168, %166 + %170 = fmul double %32, %158 + %171 = fsub double %169, %170 + %172 = fadd double undef, %171 + %173 = fsub double %172, undef + %174 = fmul double %15, %58 + %175 = fmul double %174, %42 + %176 = fadd double %175, %173 + %177 = fmul double %55, %176 + %178 = fmul double %177, 0x3FC5555555555555 + store double %62, double* undef, align 8 + store double %178, double* undef, align 8 + ret void +}