HomePhabricator

[x86] fix uses check in broadcast transform (PR38949)

Authored by spatel on Sep 16 2018, 8:41 AM.

Description

[x86] fix uses check in broadcast transform (PR38949)

https://bugs.llvm.org/show_bug.cgi?id=38949

It's not clear to me that we even need a one-use check in this fold.
Ie, 2 independent loads might be better than a load+dependent shuffle.

Note that the existing re-use tests are not affected. We actually do form a
broadcast node in those tests now because there's no extra use of the
insert_subvector node in those cases. But something later in isel pattern
matching decides that it is not worth using a broadcast for the full load in
those tests:

Legalized selection DAG: %bb.0 'test_broadcast_2f64_4f64_reuse:'

t7: v2f64,ch = load<(load 16 from %ir.p0)> t0, t2, undef:i64
    t4: i64,ch = CopyFromReg t0, Register:i64 %1
  t10: ch = store<(store 16 into %ir.p1)> t7:1, t7, t4, undef:i64
    t18: v4f64 = insert_subvector undef:v4f64, t7, Constant:i64<0>
  t20: v4f64 = insert_subvector t18, t7, Constant:i64<2>

Becomes:

t7: v2f64,ch = load<(load 16 from %ir.p0)> t0, t2, undef:i64
    t4: i64,ch = CopyFromReg t0, Register:i64 %1
  t10: ch = store<(store 16 into %ir.p1)> t7:1, t7, t4, undef:i64
  t21: v4f64 = X86ISD::SUBV_BROADCAST t7

ISEL: Starting selection on root node: t21: v4f64 = X86ISD::SUBV_BROADCAST t7
...

Created node: t27: v4f64 = INSERT_SUBREG IMPLICIT_DEF:v4f64, t7, TargetConstant:i32<7>
Morphed node: t21: v4f64 = VINSERTF128rr t27, t7, TargetConstant:i8<1>

llvm-svn: 342347

Details

Committed
spatelSep 16 2018, 8:41 AM
Parents
rG3e095174b0f0: [x86] add failure to splat test (PR38949); NFC
Branches
Unknown
Tags
Unknown