[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