1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine -S < %s | FileCheck %s
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
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
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
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
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
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
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
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
100 ; CHECK-NOT: shufflevector
101 define <1 x float> @bad4(float %arg) {
102 %tmp = insertelement <1 x float> undef, float %arg, i32 0
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
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