[PATCH] D74185: Revert the revert of vectorization commits

Alexey Bataev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 7 15:20:05 PST 2020


ABataev added a comment.

In D74185#1865072 <https://reviews.llvm.org/D74185#1865072>, @george.karpenkov wrote:

> I did manage to reduce the test case further.
>
> For input IR: https://gist.github.com/cheshire/17067d5ba4781817861c8b21d15c928d
>
> Bad optimized version: https://gist.github.com/cheshire/bf1047b4385bcf82c22a70f5cf1fb5df
>
> Good optimized version: https://gist.github.com/cheshire/8bea1f36ab849f8945bc190b519272a6
>
> The compilation comes from XLA <https://www.tensorflow.org/xla/operation_semantics> test case which looks like this:
>
>   HloModule EntryModule
>  
>   ENTRY EntryModule {
>     %input0 = f64[] parameter(0)
>     %sign_227 = f64[] sign(f64[] %input0)
>     %multiply_235 = f64[] multiply(f64[] %sign_227, f64[] %sign_227)
>  
>     %p4 = f64[2,2] broadcast(%input0), dimensions={}
>     %dot_81 = f64[2,2] dot(f64[2,2] %p4, f64[2,2] %p4), lhs_contracting_dims={1}, rhs_contracting_dims={1}
>     %br2 = f64[2,2] broadcast(f64[] %multiply_235), dimensions={}
>     %reshape_294 = f64[2,2] multiply(f64[2,2] %dot_81, f64[2,2] br2)
>  
>     %broadcast_298 = f64[2,3,2,3] broadcast(f64[2,2] %reshape_294), dimensions={0,2}
>  
>     %arg7_8 = f64[3,3] parameter(1)
>     %broadcast_300 = f64[2,3,2,3] broadcast(f64[3,3] %arg7_8), dimensions={1,3}
>     %multiply_301 = f64[2,3,2,3] multiply(f64[2,3,2,3] %broadcast_298, f64[2,3,2,3] %broadcast_300)
>  
>     %reshape_302 = f64[6,6] reshape(f64[2,3,2,3] %multiply_301)
>     %zero = f64[] constant(0)
>     %zeros = f64[6,6] broadcast(f64[] %zero), dimensions={}
>  
>     %diag = pred[6,6] constant({{1,0,0,0,0,0}, {0,1,0,0,0,0}, {0,0,1,0,0,0}, {0,0,0,1,0,0}, {0,0,0,0,1,0}, {0,0,0,0,0,1}})
>     ROOT %select_316 = f64[6,6] select(pred[6,6] %diag, f64[6,6] %reshape_302, f64[6,6] %zeros)
>   }
>
>
> Essentially, it performs some element-wise multiplications on random input floats, and then replaces all non-diagonal entries with zeros.
>
> Difference in output:
>
>   Expected literal:
>   f64[6,6] {
>     { 0.000275566374291495, 0, 0, 0, 0, 0 },
>     { 0, 0.00040918878254846619, 0, 0, 0, 0 },
>     { 0, 0, -0.00058600272184509581, 0, 0, 0 },
>     { 0, 0, 0, 0.000275566374291495, 0, 0 },
>     { 0, 0, 0, 0, 0.00040918878254846619, 0 },
>     { 0, 0, 0, 0, 0, -0.00058600272184509581 }
>   }
>  
>   Actual literal:
>   f64[6,6] {
>     { 0.000275566374291495, 0, 0, 0, 0, 0 },
>     { 0, 1, 0, 0, 0, 0 },
>     { 0, 0, -0.00058600272184509581, 0, 0, 0 },
>     { 0, 0, 0, 0.000275566374291495, 0, 0 },
>     { 0, 0, 0, 0, 0.00040918878254846619, 0 },
>     { 0, 0, 0, 0, 0, -0.00058600272184509581 }
>   }
>   1/1 runs miscompared.
>  
>
>
> This is not something which can be caused by fast math: a number created by elementwise multiplication of random input floats is exactly "1" in the bad version.


Thanks, will check this.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74185/new/

https://reviews.llvm.org/D74185





More information about the llvm-commits mailing list