llvm.org GIT mirror llvm / 75c9433
[DAGCombiner] insert_vector_elt: Avoid building a vector twice. This patch prevents the following combine when the input vector is used more than once. insert_vector_elt (build_vector elt0, ..., eltN), NewEltIdx, idx => build_vector elt0, ..., NewEltIdx, ..., eltN The reasons are: - Building a vector may be expensive, so try to reuse the existing part of a vector instead of creating a new one (think big vectors). - elt0 to eltN now have two users instead of one. This may prevent some other optimizations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187396 91177308-0d34-0410-b5e6-96231b3b80d8 Quentin Colombet 6 years ago
8 changed file(s) with 56 addition(s) and 27 deletion(s). Raw diff Collapse all Expand all
86118611 // be converted to a BUILD_VECTOR). Fill in the Ops vector with the
86128612 // vector elements.
86138613 SmallVector Ops;
8614 if (InVec.getOpcode() == ISD::BUILD_VECTOR) {
8614 // Do not combine these two vectors if the output vector will not replace
8615 // the input vector.
8616 if (InVec.getOpcode() == ISD::BUILD_VECTOR && InVec.hasOneUse()) {
86158617 Ops.append(InVec.getNode()->op_begin(),
86168618 InVec.getNode()->op_end());
86178619 } else if (InVec.getOpcode() == ISD::UNDEF) {
197197 %vmull.i = tail call <8 x i16> @llvm.arm.neon.vmullu.v8i16(<8 x i8> %0, <8 x i8> %0)
198198 ret <8 x i16> %vmull.i
199199 }
200
201 ; Make sure vector load is used for all three loads.
202 ; Lowering to build vector was breaking the single use property of the load of
203 ; %pix_sp0.0.copyload.
204 ; CHECK: t5
205 ; CHECK: vld1.32 {[[REG1:d[0-9]+]][1]}, [r0]
206 ; CHECK: vorr [[REG2:d[0-9]+]], [[REG1]], [[REG1]]
207 ; CHECK: vld1.32 {[[REG1]][0]}, [r1]
208 ; CHECK: vld1.32 {[[REG2]][0]}, [r2]
209 ; CHECK: vmull.u8 q{{[0-9]+}}, [[REG1]], [[REG2]]
210 define <8 x i16> @t5(i8* nocapture %sp0, i8* nocapture %sp1, i8* nocapture %sp2) {
211 entry:
212 %pix_sp0.0.cast = bitcast i8* %sp0 to i32*
213 %pix_sp0.0.copyload = load i32* %pix_sp0.0.cast, align 1
214 %pix_sp1.0.cast = bitcast i8* %sp1 to i32*
215 %pix_sp1.0.copyload = load i32* %pix_sp1.0.cast, align 1
216 %pix_sp2.0.cast = bitcast i8* %sp2 to i32*
217 %pix_sp2.0.copyload = load i32* %pix_sp2.0.cast, align 1
218 %vec = insertelement <2 x i32> undef, i32 %pix_sp0.0.copyload, i32 1
219 %vecinit1 = insertelement <2 x i32> %vec, i32 %pix_sp1.0.copyload, i32 0
220 %vecinit2 = insertelement <2 x i32> %vec, i32 %pix_sp2.0.copyload, i32 0
221 %0 = bitcast <2 x i32> %vecinit1 to <8 x i8>
222 %1 = bitcast <2 x i32> %vecinit2 to <8 x i8>
223 %vmull.i = tail call <8 x i16> @llvm.arm.neon.vmullu.v8i16(<8 x i8> %0, <8 x i8> %1)
224 ret <8 x i16> %vmull.i
225 }
0 ; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG-CHECK %s
1 ; XFAIL: *
12
23 ;EG-CHECK: @main
34 ;EG-CHECK: EXPORT T{{[0-9]+}}.XYXX
44 ; loads from m32.
55 define void @sample_test(<4 x float>* %source, <2 x float>* %dest) nounwind {
66 ; CHECK: sample_test
7 ; CHECK: movss
8 ; CHECK: pshufd
7 ; CHECK: movaps
8 ; CHECK: insertps
99 entry:
1010 %source.addr = alloca <4 x float>*, align 8
1111 %dest.addr = alloca <2 x float>*, align 8
6565 ; CHECK-NEXT: psllw
6666 %0 = insertelement <8 x i16> undef, i16 %amt, i32 0
6767 %1 = insertelement <8 x i16> %0, i16 %amt, i32 1
68 %2 = insertelement <8 x i16> %0, i16 %amt, i32 2
69 %3 = insertelement <8 x i16> %0, i16 %amt, i32 3
70 %4 = insertelement <8 x i16> %0, i16 %amt, i32 4
71 %5 = insertelement <8 x i16> %0, i16 %amt, i32 5
72 %6 = insertelement <8 x i16> %0, i16 %amt, i32 6
73 %7 = insertelement <8 x i16> %0, i16 %amt, i32 7
68 %2 = insertelement <8 x i16> %1, i16 %amt, i32 2
69 %3 = insertelement <8 x i16> %2, i16 %amt, i32 3
70 %4 = insertelement <8 x i16> %3, i16 %amt, i32 4
71 %5 = insertelement <8 x i16> %4, i16 %amt, i32 5
72 %6 = insertelement <8 x i16> %5, i16 %amt, i32 6
73 %7 = insertelement <8 x i16> %6, i16 %amt, i32 7
7474 %shl = shl <8 x i16> %val, %7
7575 store <8 x i16> %shl, <8 x i16>* %dst
7676 ret void
6565 ; CHECK: psrlw
6666 %0 = insertelement <8 x i16> undef, i16 %amt, i32 0
6767 %1 = insertelement <8 x i16> %0, i16 %amt, i32 1
68 %2 = insertelement <8 x i16> %0, i16 %amt, i32 2
69 %3 = insertelement <8 x i16> %0, i16 %amt, i32 3
70 %4 = insertelement <8 x i16> %0, i16 %amt, i32 4
71 %5 = insertelement <8 x i16> %0, i16 %amt, i32 5
72 %6 = insertelement <8 x i16> %0, i16 %amt, i32 6
73 %7 = insertelement <8 x i16> %0, i16 %amt, i32 7
68 %2 = insertelement <8 x i16> %1, i16 %amt, i32 2
69 %3 = insertelement <8 x i16> %2, i16 %amt, i32 3
70 %4 = insertelement <8 x i16> %3, i16 %amt, i32 4
71 %5 = insertelement <8 x i16> %4, i16 %amt, i32 5
72 %6 = insertelement <8 x i16> %5, i16 %amt, i32 6
73 %7 = insertelement <8 x i16> %6, i16 %amt, i32 7
7474 %lshr = lshr <8 x i16> %val, %7
7575 store <8 x i16> %lshr, <8 x i16>* %dst
7676 ret void
5454 ; CHECK: psraw
5555 %0 = insertelement <8 x i16> undef, i16 %amt, i32 0
5656 %1 = insertelement <8 x i16> %0, i16 %amt, i32 1
57 %2 = insertelement <8 x i16> %0, i16 %amt, i32 2
58 %3 = insertelement <8 x i16> %0, i16 %amt, i32 3
59 %4 = insertelement <8 x i16> %0, i16 %amt, i32 4
60 %5 = insertelement <8 x i16> %0, i16 %amt, i32 5
61 %6 = insertelement <8 x i16> %0, i16 %amt, i32 6
62 %7 = insertelement <8 x i16> %0, i16 %amt, i32 7
57 %2 = insertelement <8 x i16> %1, i16 %amt, i32 2
58 %3 = insertelement <8 x i16> %2, i16 %amt, i32 3
59 %4 = insertelement <8 x i16> %3, i16 %amt, i32 4
60 %5 = insertelement <8 x i16> %4, i16 %amt, i32 5
61 %6 = insertelement <8 x i16> %5, i16 %amt, i32 6
62 %7 = insertelement <8 x i16> %6, i16 %amt, i32 7
6363 %ashr = ashr <8 x i16> %val, %7
6464 store <8 x i16> %ashr, <8 x i16>* %dst
6565 ret void
7171 ; CHECK: psllw
7272 %0 = insertelement <8 x i16> undef, i16 %amt, i32 0
7373 %1 = insertelement <8 x i16> %0, i16 %amt, i32 1
74 %2 = insertelement <8 x i16> %0, i16 %amt, i32 2
75 %3 = insertelement <8 x i16> %0, i16 %amt, i32 3
76 %4 = insertelement <8 x i16> %0, i16 %amt, i32 4
77 %5 = insertelement <8 x i16> %0, i16 %amt, i32 5
78 %6 = insertelement <8 x i16> %0, i16 %amt, i32 6
79 %7 = insertelement <8 x i16> %0, i16 %amt, i32 7
74 %2 = insertelement <8 x i16> %1, i16 %amt, i32 2
75 %3 = insertelement <8 x i16> %2, i16 %amt, i32 3
76 %4 = insertelement <8 x i16> %3, i16 %amt, i32 4
77 %5 = insertelement <8 x i16> %4, i16 %amt, i32 5
78 %6 = insertelement <8 x i16> %5, i16 %amt, i32 6
79 %7 = insertelement <8 x i16> %6, i16 %amt, i32 7
8080 %shl = shl <8 x i16> %val, %7
8181 store <8 x i16> %shl, <8 x i16>* %dst
8282 ret void