[llvm-dev] Help request: Output reshuffling

Dr. ERDI Gergo via llvm-dev llvm-dev at lists.llvm.org
Tue Jun 6 08:46:07 PDT 2017


On Sun, 4 Jun 2017, Dr. ERDI Gergo wrote:

> OK I managed to make some progress on this, by using a MergeValues node:
>
>      SDNode* LDW = CurDAG->getMachineNode(
>        AVR::LDWRdPtr, SDLoc(N), VT, PtrVT, MVT::Other,
>        LD->getBasePtr(), LD->getChain());
>      SDValue Unpack[] = { SDValue(LDW, 0), SDValue(LDW, 2) };
>      SDNode* NN = CurDAG->getMergeValues(Unpack, SDLoc(N)).getNode();
>
>      ReplaceNode(N, NN);
>
>
> which gets me from
>
>  t17: i16,ch = load<LD2[%v25](align=1)(dereferenceable)> t16:1, t2, 
> undef:i16
>
> to
>
>  t24: i16,i16,ch = LDWRdPtr t2, t16:1
>
> looking tood; but then it fails during scheduling with
>
> llc: CodeGen/SelectionDAG/InstrEmitter.cpp:303: unsigned int 
> llvm::InstrEmitter::getVR(
>    llvm::SDValue,
>    llvm::DenseMap<llvm::SDValue, unsigned int>&):
> Assertion `I != VRBaseMap.end() && "Node emitted out of order - late"' 
> failed.

Looking at the result of selection again, I now noticed that here:

t26: i16,i16,ch = LDWRdPtr t2, t0
t27: i16,ch = merge_values t26, t26:2

I'm not sure what that t26:2 means, and why it's not

t27: i16,ch = merge_values t26, ch

Could that be a hint to what's going wrong?


>
> For reference, the full DAG before and after ISEL:
>
>
> SelectionDAG has 22 nodes:
>  t0: ch = EntryToken
>  t2: i16,ch = CopyFromReg t0, Register:i16 %vreg0
>  t5: i16,ch = load<LD2[%v25](align=1)(dereferenceable)> t0, t2, undef:i16
>    t9: ch,glue = callseq_start t5:1, TargetConstant:i16<0>
>  t11: ch,glue = CopyToReg t9, Register:i16 %R25R24, t5
>  t13: ch,glue = CALL t11, TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, 
> Register:i16 %R25R24, RegisterMask:Untyped, t11:1
>  t14: ch,glue = callseq_end t13, TargetConstant:i16<0>, 
> TargetConstant:i16<0>, t13:1
>    t16: i8,ch,glue = CopyFromReg t14, Register:i8 %R24, t14:1
>  t17: i16,ch = load<LD2[%v25](align=1)(dereferenceable)> t16:1, t2, 
> undef:i16
>    t18: ch,glue = callseq_start t17:1, TargetConstant:i16<0>
>  t19: ch,glue = CopyToReg t18, Register:i16 %R25R24, t17
>  t20: ch,glue = CALL t19, TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, 
> Register:i16 %R25R24, RegisterMask:Untyped, t19:1
>  t21: ch,glue = callseq_end t20, TargetConstant:i16<0>, 
> TargetConstant:i16<0>, t20:1
>    t22: i8,ch,glue = CopyFromReg t21, Register:i8 %R24, t21:1
>  t23: ch = RET_FLAG t22:1
>
>
>
> SelectionDAG has 23 nodes:
>  t0: ch = EntryToken
>  t2: i16,ch = CopyFromReg t0, Register:i16 %vreg0
>    t9: i16,ch,glue = ADJCALLSTACKDOWN TargetConstant:i16<0>, t27:1
>  t11: ch,glue = CopyToReg t9:1, Register:i16 %R25R24, t27
>  t13: ch,glue = CALLk TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, 
> Register:i16 %R25R24, RegisterMask:Untyped, t11, t11:1
>  t14: i16,ch,glue = ADJCALLSTACKUP TargetConstant:i16<0>, 
> TargetConstant:i16<0>, t13, t13:1
>    t18: i16,ch,glue = ADJCALLSTACKDOWN TargetConstant:i16<0>, t25:1
>  t19: ch,glue = CopyToReg t18:1, Register:i16 %R25R24, t25
>  t20: ch,glue = CALLk TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, 
> Register:i16 %R25R24, RegisterMask:Untyped, t19, t19:1
>  t21: i16,ch,glue = ADJCALLSTACKUP TargetConstant:i16<0>, 
> TargetConstant:i16<0>, t20, t20:1
>    t16: i8,ch,glue = CopyFromReg t14:1, Register:i8 %R24, t14:2
>  t24: i16,i16,ch = LDWRdPtr t2, t16:1
>  t25: i16,ch = merge_values t24, t24:2
>  t26: i16,i16,ch = LDWRdPtr t2, t0
>  t27: i16,ch = merge_values t26, t26:2
>    t22: i8,ch,glue = CopyFromReg t21:1, Register:i8 %R24, t21:2
>  t23: ch = RET t22:1
>
>

-- 

   .--= ULLA! =-----------------.
    \     http://gergo.erdi.hu   \
     `---= gergo at erdi.hu =-------'
Why is it called tourist season if we can't shoot at them?


More information about the llvm-dev mailing list