[PATCH vkd3d 02/17] vkd3d-shader/hlsl: Handle branches in copy propagation.

Zebediah Figura zfigura at codeweavers.com
Wed Dec 15 11:27:43 CST 2021


On 12/3/21 03:28, Giovanni Mascellani wrote:
> Hi,
> 
> On 01/12/21 17:14, Matteo Bruni wrote:
>> changelog: Continue copy propagation after encountering an IF, rework to
>> store the copy_propagation_state structs on the stack and search
>> recursively
> 
> I still don't like these changes, they make the code more complicated 
> than it should be, but I'll live with them.
> 
> However, I think you're introducing some missed optimizations with this 
> specific patch. For example, take this code:
> 
> float2 a;
> a.x = 1.0;
> if (condition)
> {
>      a.y = 2.0;
>      do_something(a.x);
> }
> 
> You would expect a.x replaced with 1.0 in do_something(), but I don't 
> think that's happening in you implementation: inside the conditional a 
> new copy_propagation_var_def is created for variable a, which masks the 
> previous knowledge about a.x being 1.0. This can probably be fixed in 
> copy_propagation_create_var_def in the missing entry case by first doing 
> a lookup on the lower frames and using that result, if it exists, to 
> initialize the new copy_propagation_var_def.
>
Actually, it's worse than that; this patch seems to be incorrectly 
optimizing the following code:

--

bool b;

float4 main() : sv_target
{
     float2 a;
     a.x = 1.0;
     if (b)
     {
         a.y = 2.0;
         a.x += 3;
     }
     return float4(a, 0.0, 0.0);
}

--

The intermediate IR dump says:

  2:       bool | b
  3:      float | 1.00000000e+00
  4:            | = (a.x @3)
  5:            | if (@2) {
  6:      float | 2.00000000e+00
  7:            | = (a.y @6)
  8:     float2 | @6.xx
  9:     float1 | @8.x
10:      float | 3.00000000e+00
11:      float | + (@9 @10 )
12:            | = (a.x @11)
                  } else {
                  }
13:     float2 | a
14:      float | 0.00000000e+00
15:      float | 0.00000000e+00
16:            | = (<constructor-0>.xy @13)
17:            | = (<constructor-0>.z @14)
18:            | = (<constructor-0>.w @15)
19:     float4 | <constructor-0>
20:            | return
21:            | = (<output-sv_target0> @19)

Note instruction 8 here, which is probably supposed to be @3.xx rather 
than @6.xx.



More information about the wine-devel mailing list