[LLVMdev] Virtual register def doesn't dominate all uses

Boris Boesler
Mon, 03 Nov 2014 21:56:51 -0000

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?

(*)
>>>>>> 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