diff options
author | Jason Ekstrand <[email protected]> | 2017-10-17 18:56:29 -0700 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2017-11-10 16:29:27 +0000 |
commit | e759beb906ac80343361ad1b146b7b71b0dead2f (patch) | |
tree | c1b7ede59c50d5dc9b860e32fc30853e6f216f8d | |
parent | bd5db7af2a4cd9f2cc3e98d0fefcaf2d46023069 (diff) |
intel/fs: Fix integer multiplication lowering for src/dst hazards
Reviewed-by: Iago Toral Quiroga <[email protected]>
Cc: [email protected]
(cherry picked from commit d54f8ec744545673fd78f15ffce3cb4e47d4b5f1)
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index dad159fa54a..91f3533188b 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -3480,8 +3480,14 @@ fs_visitor::lower_integer_multiplication() * schedule multi-component multiplications much better. */ + bool needs_mov = false; fs_reg orig_dst = inst->dst; - if (orig_dst.is_null() || orig_dst.file == MRF) { + if (orig_dst.is_null() || orig_dst.file == MRF || + regions_overlap(inst->dst, inst->size_written, + inst->src[0], inst->size_read(0)) || + regions_overlap(inst->dst, inst->size_written, + inst->src[1], inst->size_read(1))) { + needs_mov = true; inst->dst = fs_reg(VGRF, alloc.allocate(dispatch_width / 8), inst->dst.type); } @@ -3512,7 +3518,7 @@ fs_visitor::lower_integer_multiplication() subscript(low, BRW_REGISTER_TYPE_UW, 1), subscript(high, BRW_REGISTER_TYPE_UW, 0)); - if (inst->conditional_mod || orig_dst.file == MRF) { + if (needs_mov || inst->conditional_mod) { set_condmod(inst->conditional_mod, ibld.MOV(orig_dst, inst->dst)); } |