[llvm-commits] [llvm] r115400 - /llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp
Evan Cheng
evan.cheng at apple.com
Fri Oct 1 23:24:49 PDT 2010
Thanks Bob.
Evan
On Oct 1, 2010, at 6:49 PM, Bob Wilson wrote:
> Author: bwilson
> Date: Fri Oct 1 20:49:29 2010
> New Revision: 115400
>
> URL: http://llvm.org/viewvc/llvm-project?rev=115400&view=rev
> Log:
> Fix a miscompile in 186.crafty for Thumb2 that was exposed by Evan's
> scheduling change in svn 115121. The CriticalAntiDepBreaker had bad
> liveness information. It was calculating the KillIndices for one scheduling
> region in a basic block, rescheduling that region so the KillIndices were
> no longer valid, and then using those wrong KillIndices to make decisions
> for the next scheduling region. I've not been able to reduce a small
> testcase for this. Radar 8502534.
>
> Modified:
> llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp
>
> Modified: llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp?rev=115400&r1=115399&r2=115400&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp (original)
> +++ llvm/trunk/lib/CodeGen/CriticalAntiDepBreaker.cpp Fri Oct 1 20:49:29 2010
> @@ -130,21 +130,25 @@
> return;
> assert(Count < InsertPosIndex && "Instruction index out of expected range!");
>
> - // Any register which was defined within the previous scheduling region
> - // may have been rescheduled and its lifetime may overlap with registers
> - // in ways not reflected in our current liveness state. For each such
> - // register, adjust the liveness state to be conservatively correct.
> - for (unsigned Reg = 0; Reg != TRI->getNumRegs(); ++Reg)
> - if (DefIndices[Reg] < InsertPosIndex && DefIndices[Reg] >= Count) {
> - assert(KillIndices[Reg] == ~0u && "Clobbered register is live!");
> -
> - // Mark this register to be non-renamable.
> + for (unsigned Reg = 0; Reg != TRI->getNumRegs(); ++Reg) {
> + if (KillIndices[Reg] != ~0u) {
> + // If Reg is currently live, then mark that it can't be renamed as
> + // we don't know the extent of its live-range anymore (now that it
> + // has been scheduled).
> + Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
> + KillIndices[Reg] = Count;
> + } else if (DefIndices[Reg] < InsertPosIndex && DefIndices[Reg] >= Count) {
> + // Any register which was defined within the previous scheduling region
> + // may have been rescheduled and its lifetime may overlap with registers
> + // in ways not reflected in our current liveness state. For each such
> + // register, adjust the liveness state to be conservatively correct.
> Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
>
> // Move the def index to the end of the previous region, to reflect
> // that the def could theoretically have been scheduled at the end.
> DefIndices[Reg] = InsertPosIndex;
> }
> + }
>
> PrescanInstruction(MI);
> ScanInstruction(MI, Count);
> @@ -580,7 +584,7 @@
> }
>
> // We just went back in time and modified history; the
> - // liveness information for the anti-depenence reg is now
> + // liveness information for the anti-dependence reg is now
> // inconsistent. Set the state as if it were dead.
> Classes[NewReg] = Classes[AntiDepReg];
> DefIndices[NewReg] = DefIndices[AntiDepReg];
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list