Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / Transforms / InstCombine / broadcast.ll
blob8485cd9c53fa24d840360e76239fab8458031c3d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine -S < %s | FileCheck %s
4 ; CHECK-LABEL: good1
5 ; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
6 ; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
7 ; CHECK-NEXT: ret <4 x float> %[[BCAST]]
8 define <4 x float> @good1(float %arg) {
9   %tmp = insertelement <4 x float> undef, float %arg, i32 0
10   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
11   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
12   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
13   ret <4 x float> %tmp6
16 ; CHECK-LABEL: good2
17 ; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
18 ; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
19 ; CHECK-NEXT: ret <4 x float> %[[BCAST]]
20 define <4 x float> @good2(float %arg) {
21   %tmp = insertelement <4 x float> undef, float %arg, i32 1
22   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 2
23   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 0
24   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
25   ret <4 x float> %tmp6
28 ; CHECK-LABEL: good3
29 ; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
30 ; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
31 ; CHECK-NEXT: ret <4 x float> %[[BCAST]]
32 define <4 x float> @good3(float %arg) {
33   %tmp = insertelement <4 x float> zeroinitializer, float %arg, i32 0
34   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
35   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
36   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
37   ret <4 x float> %tmp6
40 ; CHECK-LABEL: good4
41 ; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
42 ; CHECK-NEXT: %[[ADD:.*]] = fadd <4 x float> %[[INS]], %[[INS]]
43 ; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[ADD]], <4 x float> undef, <4 x i32> zeroinitializer
44 ; CHECK-NEXT: ret <4 x float> %[[BCAST]]
45 define <4 x float> @good4(float %arg) {
46   %tmp = insertelement <4 x float> zeroinitializer, float %arg, i32 0
47   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
48   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
49   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
50   %tmp7 = fadd <4 x float> %tmp6, %tmp6
51   ret <4 x float> %tmp7
54 ; CHECK-LABEL: @good5(
55 ; CHECK-NEXT:    %ins1 = insertelement <4 x float> undef, float %v, i32 0
56 ; CHECK-NEXT:    %a1 = fadd <4 x float> %ins1, %ins1
57 ; CHECK-NEXT:    %ins4 = shufflevector <4 x float> %ins1, <4 x float> undef, <4 x i32> zeroinitializer
58 ; CHECK-NEXT:    %res = fadd <4 x float> %a1, %ins4
59 ; CHECK-NEXT: ret <4 x float> %res
60 define <4 x float> @good5(float %v) {
61   %ins1 = insertelement <4 x float> undef, float %v, i32 0
62   %a1 = fadd <4 x float> %ins1, %ins1
63   %ins2 = insertelement<4 x float> %ins1, float %v, i32 1
64   %ins3 = insertelement<4 x float> %ins2, float %v, i32 2
65   %ins4 = insertelement<4 x float> %ins3, float %v, i32 3
66   %res = fadd <4 x float> %a1, %ins4
67   ret <4 x float> %res
70 ; CHECK-LABEL: bad1
71 ; CHECK-NOT: shufflevector
72 define <4 x float> @bad1(float %arg) {
73   %tmp = insertelement <4 x float> undef, float %arg, i32 1
74   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
75   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
76   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
77   ret <4 x float> %tmp6
80 ; CHECK-LABEL: bad2
81 ; CHECK-NOT: shufflevector
82 define <4 x float> @bad2(float %arg) {
83   %tmp = insertelement <4 x float> undef, float %arg, i32 0
84   %tmp5 = insertelement <4 x float> %tmp, float %arg, i32 2
85   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
86   ret <4 x float> %tmp6
89 ; CHECK-LABEL: bad3
90 ; CHECK-NOT: shufflevector
91 define <4 x float> @bad3(float %arg, float %arg2) {
92   %tmp = insertelement <4 x float> undef, float %arg, i32 0
93   %tmp4 = insertelement <4 x float> %tmp, float %arg2, i32 1
94   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
95   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
96   ret <4 x float> %tmp6
99 ; CHECK-LABEL: bad4
100 ; CHECK-NOT: shufflevector
101 define <1 x float> @bad4(float %arg) {
102   %tmp = insertelement <1 x float> undef, float %arg, i32 0
103   ret <1 x float> %tmp
106 ; CHECK-LABEL: bad5
107 ; CHECK-NOT: shufflevector
108 define <4 x float> @bad5(float %arg) {
109   %tmp = insertelement <4 x float> undef, float %arg, i32 0
110   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
111   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
112   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
113   %tmp7 = fadd <4 x float> %tmp6, %tmp4
114   ret <4 x float> %tmp7
117 ; CHECK-LABEL: bad6
118 ; CHECK-NOT: shufflevector
119 define <4 x float> @bad6(float %arg, i32 %k) {
120   %tmp = insertelement <4 x float> undef, float %arg, i32 0
121   %tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
122   %tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 %k
123   %tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
124   ret <4 x float> %tmp6
127 ; CHECK-LABEL: @bad7(
128 ; CHECK-NOT: shufflevector
129 define <4 x float> @bad7(float %v) {
130   %ins1 = insertelement <4 x float> undef, float %v, i32 1
131   %a1 = fadd <4 x float> %ins1, %ins1
132   %ins2 = insertelement<4 x float> %ins1, float %v, i32 2
133   %ins3 = insertelement<4 x float> %ins2, float %v, i32 3
134   %ins4 = insertelement<4 x float> %ins3, float %v, i32 0
135   %res = fadd <4 x float> %a1, %ins4
136   ret <4 x float> %res