Sometimes an instruction has a vector as a source, but all of the
components have the same value. For example,
vec3 32 ssa_16 = load_const (1.0, 1.0, 1.0)
...
vec3 32 ssa_82 = fadd ssa_16, -ssa_81.xyz
No changes on any Gen8 or later platform because those platforms do not
use the vec4 backend.
Haswell
total instructions in shared programs:
13487811 ->
13484467 (-0.02%)
instructions in affected programs: 421981 -> 418637 (-0.79%)
helped: 1859
HURT: 0
helped stats (abs) min: 1 max: 15 x̄: 1.80 x̃: 1
helped stats (rel) min: 0.04% max: 9.80% x̄: 1.04% x̃: 0.84%
95% mean confidence interval for instructions value: -1.85 -1.74
95% mean confidence interval for instructions %-change: -1.07% -1.00%
Instructions are helped.
total cycles in shared programs:
376423252 ->
376420572 (<.01%)
cycles in affected programs:
14800970 ->
14798290 (-0.02%)
helped: 1519
HURT: 329
helped stats (abs) min: 2 max: 462 x̄: 10.59 x̃: 4
helped stats (rel) min: 0.03% max: 16.73% x̄: 0.79% x̃: 0.36%
HURT stats (abs) min: 2 max: 598 x̄: 40.74 x̃: 16
HURT stats (rel) min: <.01% max: 10.32% x̄: 2.56% x̃: 0.98%
95% mean confidence interval for cycles value: -3.53 0.63
95% mean confidence interval for cycles %-change: -0.30% -0.09%
Inconclusive result (value mean confidence interval includes 0).
total fills in shared programs: 34601 -> 34592 (-0.03%)
fills in affected programs: 91 -> 82 (-9.89%)
helped: 9
HURT: 0
Ivy Bridge
total instructions in shared programs:
12053565 ->
12051626 (-0.02%)
instructions in affected programs: 298103 -> 296164 (-0.65%)
helped: 1228
HURT: 0
helped stats (abs) min: 1 max: 8 x̄: 1.58 x̃: 1
helped stats (rel) min: 0.04% max: 3.57% x̄: 0.91% x̃: 0.81%
95% mean confidence interval for instructions value: -1.63 -1.53
95% mean confidence interval for instructions %-change: -0.95% -0.88%
Instructions are helped.
total cycles in shared programs:
180322270 ->
180319922 (<.01%)
cycles in affected programs:
14123840 ->
14121492 (-0.02%)
helped: 1036
HURT: 195
helped stats (abs) min: 2 max: 462 x̄: 11.93 x̃: 2
helped stats (rel) min: 0.03% max: 14.05% x̄: 0.82% x̃: 0.35%
HURT stats (abs) min: 2 max: 598 x̄: 51.33 x̃: 16
HURT stats (rel) min: <.01% max: 9.68% x̄: 3.02% x̃: 0.72%
95% mean confidence interval for cycles value: -4.92 1.10
95% mean confidence interval for cycles %-change: -0.35% -0.07%
Inconclusive result (value mean confidence interval includes 0).
Sandy Bridge
total instructions in shared programs:
10864286 ->
10863189 (-0.01%)
instructions in affected programs: 159722 -> 158625 (-0.69%)
helped: 724
HURT: 0
helped stats (abs) min: 1 max: 4 x̄: 1.52 x̃: 1
helped stats (rel) min: 0.10% max: 2.91% x̄: 0.79% x̃: 0.62%
95% mean confidence interval for instructions value: -1.58 -1.46
95% mean confidence interval for instructions %-change: -0.82% -0.75%
Instructions are helped.
total cycles in shared programs:
153967938 ->
153957926 (<.01%)
cycles in affected programs:
1923186 ->
1913174 (-0.52%)
helped: 654
HURT: 56
helped stats (abs) min: 2 max: 170 x̄: 20.00 x̃: 4
helped stats (rel) min: 0.03% max: 11.82% x̄: 0.89% x̃: 0.18%
HURT stats (abs) min: 2 max: 390 x̄: 54.75 x̃: 32
HURT stats (rel) min: 0.05% max: 6.92% x̄: 3.09% x̃: 2.92%
95% mean confidence interval for cycles value: -17.42 -10.78
95% mean confidence interval for cycles %-change: -0.76% -0.40%
Cycles are helped.
Iron Lake and GM45 had similar results. (Iron Lake shown)
total instructions in shared programs:
8142677 ->
8141721 (-0.01%)
instructions in affected programs: 139511 -> 138555 (-0.69%)
helped: 588
HURT: 0
helped stats (abs) min: 1 max: 8 x̄: 1.63 x̃: 1
helped stats (rel) min: 0.21% max: 4.39% x̄: 0.84% x̃: 0.46%
95% mean confidence interval for instructions value: -1.70 -1.55
95% mean confidence interval for instructions %-change: -0.89% -0.78%
Instructions are helped.
total cycles in shared programs:
188549394 ->
188547676 (<.01%)
cycles in affected programs:
3171960 ->
3170242 (-0.05%)
helped: 527
HURT: 0
helped stats (abs) min: 2 max: 18 x̄: 3.26 x̃: 2
helped stats (rel) min: <.01% max: 0.80% x̄: 0.08% x̃: 0.06%
95% mean confidence interval for cycles value: -3.49 -3.03
95% mean confidence interval for cycles %-change: -0.09% -0.07%
Cycles are helped.
Reviewed-by: Matt Turner <mattst88@gmail.com>
try_immediate_source(const nir_alu_instr *instr, src_reg *op,
MAYBE_UNUSED const gen_device_info *devinfo)
{
- if (nir_src_num_components(instr->src[1].src) != 1 ||
- nir_src_bit_size(instr->src[1].src) != 32 ||
+ if (nir_src_bit_size(instr->src[1].src) != 32 ||
!nir_src_is_const(instr->src[1].src))
return;
switch (old_type) {
case BRW_REGISTER_TYPE_D:
case BRW_REGISTER_TYPE_UD: {
- int d = nir_src_as_int(instr->src[1].src);
+ int first_comp = -1;
+ int d;
+
+ for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
+ if (nir_alu_instr_channel_used(instr, 1, i)) {
+ if (first_comp < 0) {
+ first_comp = i;
+ d = nir_src_comp_as_int(instr->src[1].src,
+ instr->src[1].swizzle[i]);
+ } else if (d != nir_src_comp_as_int(instr->src[1].src,
+ instr->src[1].swizzle[i])) {
+ return;
+ }
+ }
+ }
if (op->abs)
d = MAX2(-d, d);
}
case BRW_REGISTER_TYPE_F: {
- float f = nir_src_as_float(instr->src[1].src);
+ int first_comp = -1;
+ float f;
+
+ for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
+ if (nir_alu_instr_channel_used(instr, 1, i)) {
+ if (first_comp < 0) {
+ first_comp = i;
+ f = nir_src_comp_as_float(instr->src[1].src,
+ instr->src[1].swizzle[i]);
+ } else if (f != nir_src_comp_as_float(instr->src[1].src,
+ instr->src[1].swizzle[i])) {
+ return;
+ }
+ }
+ }
if (op->abs)
f = fabs(f);