radeonsi: Go back to using llvm.pow intrinsic for nir_op_fpow
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 15 Feb 2019 19:00:39 +0000 (11:00 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 19 Feb 2019 23:56:19 +0000 (15:56 -0800)
commitba7519ca36ce0de74657b01fe4fa2c97aace538e
treee3cc10318f323a2c90641f66d4300f1876524c40
parent9c4d5926aa9cf0f8f5e0e163845b20b83f02b515
radeonsi: Go back to using llvm.pow intrinsic for nir_op_fpow

ARB_vertex_program and ARB_fragment_program define 0^0 = 1 (while GLSL
leaves it undefined).  Performing fpow lowering in NIR would break this
behavior, preventing us from using prog_to_nir.

According to llvm/lib/Target/AMDGPU/SIInstructions.td, POW_common
expands to <V_LOG_F32_e32, V_EXP_F32_e32, V_MUL_LEGACY_F32_e32>,
which presumably does a zero-wins multiply.

Lowering in NIR results in a non-legacy multiply, where:

   pow(0, 0) = 2^(log2(0) * 0)
             = 2^(-INF * 0)
             = 2^(-NaN)
             = -NaN

which isn't the desired result.

This reverts:
- commit d6b75392067712908bdc372f1007e085439bf9f5
  (ac/nir: remove emission of nir_op_fpow)
- commit 22430224fec31591432d4a3e65c6f457ba1c1653
  (radeonsi/nir: enable lowering of fpow)

and prevents a regression in gl-1.0-spot-light with AMD_DEBUG=nir
after enabling prog_to_nir in st/mesa later in this series.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/amd/common/ac_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_get.c