[llvm-dev] llvm-stress crash
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Thu Mar 16 08:35:45 PDT 2017
On 03/15/2017 02:05 AM, Jonas Paulsson via llvm-dev wrote:
> Hi,
>
> Thanks for explanations!
>
> On 2017-03-14 23:46, Hal Finkel wrote:
>
>> Yes, in the sense that you shouldn't introduce uses of undefined
>> physical registers. This seems like somewhat of a special case (in
>> that you're taking an input register and breaking it up into
>> subregisters explicitly). Avoiding inserting the store here also
>> seems like a useful optimization. That having been said, you can
>> force the register to be defined. I recall doing something similar in
>> the PowerPC backend in the CR-bit spilling code -- in
>> lib/Target/PowerPC/PPCRegisterInfo.cpp there's this:
>>
>> BuildMI(MBB, II, dl, TII.get(TargetOpcode::KILL),
>> getCRFromCRBit(SrcReg))
>> .addReg(SrcReg, getKillRegState(MI.getOperand(0).isKill()));
>>
>>
>> -Hal
>
> Interesting - so you are using a KILL instruction to actually mark
> SrcReg as live via the first def-operand? I might have thought an
> IMPLICIT_DEF would make more sense at least in terms of the
> instruction name.
I don't think that IMPLICIT_DEF works that late in the pipeline
(ProcessImplicitDefs.cpp gets rid of them?). I recall using KILL because
this is how ExpandPostRAPseudos.cpp lowers subreg-to-reg.
-Hal
>
>
> On 2017-03-15 00:04, Matthias Braun wrote:
>>> On Mar 14, 2017, at 7:37 AM, Jonas Paulsson via llvm-dev
>>> <llvm-dev at lists.llvm.org> wrote:
>>>
>>> Hi,
>>>
>>> Using llvm-stress, I got a crash after Post-RA pseudo expansion,
>>> with machine verifier.
>>>
>>> A 128 bit register
>>>
>>> %vreg233:subreg_l32<def,read-undef> = LLCRMux %vreg119;
>>> GR128Bit:%vreg233 GRX32Bit:%vreg119
>>>
>>> gets spilled:
>>>
>>> %vreg265:subreg_l32<def,read-undef> = LLCRMux %vreg119;
>>> GR128Bit:%vreg265 GRX32Bit:%vreg119
>>> ST128 %vreg265, <fi#10>, 0, %noreg; mem:ST16[FixedStack10](align=8)
>>> GR128Bit:%vreg265
>>>
>>> -> regalloc
>>>
>>> %R5L<def> = LLCRMux %R6L, %R4Q<imp-def>
>>> ST128 %R4Q<kill>, <fi#10>, 0, %noreg; mem:ST16[FixedStack10](align=8)
>>>
>>> -> pseudo expansion
>>>
>>> %R5L<def> = LLCR %R6L
>>> STG %R4D<kill>, %R15D, 200, %noreg; mem:ST16[FixedStack7](align=8)
>>> STG %R5D<kill>, %R15D, 208, %noreg; mem:ST16[FixedStack7](align=8)
>>>
>>> *** Bad machine code: Using an undefined physical register ***
>>> - function: autogen_SD29355
>>> - basic block: BB#19 CF257 (0x4cb6b00)
>>> - instruction: STG
>>> - operand 0: %R4D<kill>
>>>
>>> So, it seems that vreg233 had only the low 64 bits defined to begin
>>> with, the upper 64 are undefined.
>>> Then this interval is spilled with the ST128 pseudo. After
>>> expansion, both 64 bit parts are spilled,
>>> where naturally the upper half is undefined.
>> The annoying problem here is that we have no way to mark a register
>> as partially undef in LLVM, so when you break bigger uses apart you
>> don't know that one of the halves is completely undefined now.
>> Mindlessly adding read-undef to both register is wrong however (as
>> that semantically means you can do whatever with the use like
>> replacing it with a completely different register). As recomputing
>> liveness at this point to know whether one of the halfes is
>> completely undefined is expensive and complicated I added an
>> exception to the MachineVerifier for this which most other targets
>> should be using:
>>
>> // If there is an additional implicit-use of a super
>> register we stop
>> // here. By definition we are fine if the super register is not
>> // (completely) dead, if the complete super register is dead
>> we will
>> // get a report for its operand.
>>
>> basically you leave a implicit use of the super register around to
>> indicate that your original/higher level operation is about that
>> super register and the verifier shouldn't care if a subregister is
>> undefined.
>>
>> - Matthias
>>
> Thanks for explaining! I tried this and it worked like you said :-)
>
> /Jonas
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list