[LLVMdev] Virtual register def doesn't dominate all uses
Quentin Colombet
qcolombet at apple.com
Mon Nov 3 14:30:52 PST 2014
On Nov 3, 2014, at 1:56 PM, Boris Boesler <baembel at gmx.de> wrote:
> Hi Quentin,
>
>>> Yes, the dags in view-isel-dags and view-legalize-types-dags are correct (the add operations are here and are their results are used) and the dags are the same.
>>
>> And what about view-sched-dags?
>
> The DAG looks like I described below (*)
>
>
>> This one should give you what has been selected. So if this is not correct, you have indeed a problem in the selection problem.
>> If that is the case, you can use -debug-only=isel to help you figuring out what is the problem.
>
> This is the add node (sum + v3) from the dot file (-view-isel-dags):
>
> Node0x7fef2a033610 [shape=record,shape=Mrecord,label="{{<s0>0|<s1>1}|add [ORD=21] [ID=29]|0x7fef2a033610|{<d0>i32}}"];
>
> The debug output (-debug-only=isel) is:
>
> ISEL: Starting pattern match on root node: 0x7fef2a033610: i32 = add 0x7fef2a033410, 0x7fef2a032f10 [ORD=21] [ID=29]
>
> Skipped scope entry (due to false predicate) at index 3, continuing at 2566
> Match failed at index 2575
> Continuing at 2628
> Match failed at index 2639
> Continuing at 2659
> Match failed at index 2663
> Continuing at 2700
> Continuing at 2701
> Continuing at 2702
> Match failed at index 2703
> Continuing at 2817
> Match failed at index 2818
> Continuing at 2901
> Match failed at index 2902
> Continuing at 2985
> Match failed at index 2986
> Continuing at 3100
> Match failed at index 3101
> Continuing at 3215
> Match failed at index 3216
> Continuing at 3330
> Match failed at index 3331
> Continuing at 3445
> Match failed at index 3447
> Continuing at 3591
> Match failed at index 3592
> Continuing at 3706
> Match failed at index 3707
> Continuing at 3790
> Match failed at index 3791
> Continuing at 3874
> Match failed at index 3875
> Continuing at 3958
> Match failed at index 3959
> Continuing at 4046
> Match failed at index 4047
> Continuing at 4081
> Match failed at index 4082
> Continuing at 4116
> Match failed at index 4117
> Continuing at 4179
> Match failed at index 4180
> Continuing at 4209
> Match failed at index 4210
> Continuing at 4230
> Match failed at index 4231
> Continuing at 4261
> Match failed at index 4262
> Continuing at 4309
> Match failed at index 4310
> Continuing at 4322
> Morphed node: 0x7fef2a033610: i32 = MVrr 0x7fef2a033610 [ORD=21]
>
>
> Does the add operation become a MOVE instruction, or is this a chain of rules?
Yes, your add becomes a MVrr instruction. This is likely the problem.
Do you know how to debug this, or do you want me to give you basic directions?
-Quentin
>
> (*)
>>>>>>> But if I use the statement "int res = v1 + v2 + v3;" something strange happens: all arguments are stored in the stack-frame and the local variables are initialized. Now, the variables v1 and v2 are loaded, but they are not used (no ADD instructions) and a MOVE instruction register to register is generated that uses itself as an operand. This register should be stored and should be used as function result.
>
> Boris
>
More information about the llvm-dev
mailing list