]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/InstCombine/vec_demanded_elts.ll
Vendor import of llvm trunk r321017:
[FreeBSD/FreeBSD.git] / test / Transforms / InstCombine / vec_demanded_elts.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4
5 define i32 @test2(float %f) {
6 ; CHECK-LABEL: @test2(
7 ; CHECK-NEXT:    [[TMP5:%.*]] = fmul float %f, %f
8 ; CHECK-NEXT:    [[TMP21:%.*]] = bitcast float [[TMP5]] to i32
9 ; CHECK-NEXT:    ret i32 [[TMP21]]
10 ;
11   %tmp5 = fmul float %f, %f
12   %tmp9 = insertelement <4 x float> undef, float %tmp5, i32 0
13   %tmp10 = insertelement <4 x float> %tmp9, float 0.000000e+00, i32 1
14   %tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 2
15   %tmp12 = insertelement <4 x float> %tmp11, float 0.000000e+00, i32 3
16   %tmp19 = bitcast <4 x float> %tmp12 to <4 x i32>
17   %tmp21 = extractelement <4 x i32> %tmp19, i32 0
18   ret i32 %tmp21
19 }
20
21 define void @get_image() nounwind {
22 ; CHECK-LABEL: @get_image(
23 ; CHECK-NEXT:  entry:
24 ; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @fgetc(i8* null) #0
25 ; CHECK-NEXT:    br i1 false, label %bb2, label %bb3
26 ; CHECK:       bb2:
27 ; CHECK-NEXT:    br label %bb3
28 ; CHECK:       bb3:
29 ; CHECK-NEXT:    unreachable
30 ;
31 entry:
32   %0 = call i32 @fgetc(i8* null) nounwind               ; <i32> [#uses=1]
33   %1 = trunc i32 %0 to i8         ; <i8> [#uses=1]
34   %tmp2 = insertelement <100 x i8> zeroinitializer, i8 %1, i32 1          ; <<100 x i8>> [#uses=1]
35   %tmp1 = extractelement <100 x i8> %tmp2, i32 0          ; <i8> [#uses=1]
36   %2 = icmp eq i8 %tmp1, 80               ; <i1> [#uses=1]
37   br i1 %2, label %bb2, label %bb3
38
39 bb2:            ; preds = %entry
40   br label %bb3
41
42 bb3:            ; preds = %bb2, %entry
43   unreachable
44 }
45
46 ; PR4340
47 define void @vac(<4 x float>* nocapture %a) nounwind {
48 ; CHECK-LABEL: @vac(
49 ; CHECK-NEXT:  entry:
50 ; CHECK-NEXT:    store <4 x float> zeroinitializer, <4 x float>* %a, align 16
51 ; CHECK-NEXT:    ret void
52 ;
53 entry:
54   %tmp1 = load <4 x float>, <4 x float>* %a             ; <<4 x float>> [#uses=1]
55   %vecins = insertelement <4 x float> %tmp1, float 0.000000e+00, i32 0  ; <<4 x float>> [#uses=1]
56   %vecins4 = insertelement <4 x float> %vecins, float 0.000000e+00, i32 1; <<4 x float>> [#uses=1]
57   %vecins6 = insertelement <4 x float> %vecins4, float 0.000000e+00, i32 2; <<4 x float>> [#uses=1]
58   %vecins8 = insertelement <4 x float> %vecins6, float 0.000000e+00, i32 3; <<4 x float>> [#uses=1]
59   store <4 x float> %vecins8, <4 x float>* %a
60   ret void
61 }
62
63 declare i32 @fgetc(i8*)
64
65 define <4 x float> @dead_shuffle_elt(<4 x float> %x, <2 x float> %y) nounwind {
66 ; CHECK-LABEL: @dead_shuffle_elt(
67 ; CHECK-NEXT:    [[SHUFFLE_I:%.*]] = shufflevector <2 x float> %y, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
68 ; CHECK-NEXT:    [[SHUFFLE9_I:%.*]] = shufflevector <4 x float> %x, <4 x float> [[SHUFFLE_I]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>
69 ; CHECK-NEXT:    ret <4 x float> [[SHUFFLE9_I]]
70 ;
71   %shuffle.i = shufflevector <2 x float> %y, <2 x float> %y, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
72   %shuffle9.i = shufflevector <4 x float> %x, <4 x float> %shuffle.i, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
73   ret <4 x float> %shuffle9.i
74 }
75
76 define <2 x float> @test_fptrunc(double %f) {
77 ; CHECK-LABEL: @test_fptrunc(
78 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> <double undef, double 0.000000e+00>, double %f, i32 0
79 ; CHECK-NEXT:    [[TMP2:%.*]] = fptrunc <2 x double> [[TMP1]] to <2 x float>
80 ; CHECK-NEXT:    ret <2 x float> [[TMP2]]
81 ;
82   %tmp9 = insertelement <4 x double> undef, double %f, i32 0
83   %tmp10 = insertelement <4 x double> %tmp9, double 0.000000e+00, i32 1
84   %tmp11 = insertelement <4 x double> %tmp10, double 0.000000e+00, i32 2
85   %tmp12 = insertelement <4 x double> %tmp11, double 0.000000e+00, i32 3
86   %tmp5 = fptrunc <4 x double> %tmp12 to <4 x float>
87   %ret = shufflevector <4 x float> %tmp5, <4 x float> undef, <2 x i32> <i32 0, i32 1>
88   ret <2 x float> %ret
89 }
90
91 define <2 x double> @test_fpext(float %f) {
92 ; CHECK-LABEL: @test_fpext(
93 ; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> <float undef, float 0.000000e+00>, float %f, i32 0
94 ; CHECK-NEXT:    [[TMP2:%.*]] = fpext <2 x float> [[TMP1]] to <2 x double>
95 ; CHECK-NEXT:    ret <2 x double> [[TMP2]]
96 ;
97   %tmp9 = insertelement <4 x float> undef, float %f, i32 0
98   %tmp10 = insertelement <4 x float> %tmp9, float 0.000000e+00, i32 1
99   %tmp11 = insertelement <4 x float> %tmp10, float 0.000000e+00, i32 2
100   %tmp12 = insertelement <4 x float> %tmp11, float 0.000000e+00, i32 3
101   %tmp5 = fpext <4 x float> %tmp12 to <4 x double>
102   %ret = shufflevector <4 x double> %tmp5, <4 x double> undef, <2 x i32> <i32 0, i32 1>
103   ret <2 x double> %ret
104 }
105
106 define <4 x double> @test_shuffle(<4 x double> %f) {
107 ; CHECK-LABEL: @test_shuffle(
108 ; CHECK-NEXT:    [[RET1:%.*]] = insertelement <4 x double> %f, double 1.000000e+00, i32 3
109 ; CHECK-NEXT:    ret <4 x double> [[RET1]]
110 ;
111   %ret = shufflevector <4 x double> %f, <4 x double> <double undef, double 1.0, double undef, double undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 5>
112   ret <4 x double> %ret
113 }
114
115 define <4 x float> @test_select(float %f, float %g) {
116 ; CHECK-LABEL: @test_select(
117 ; CHECK-NEXT:    [[A3:%.*]] = insertelement <4 x float> <float undef, float undef, float undef, float 3.000000e+00>, float %f, i32 0
118 ; CHECK-NEXT:    [[RET:%.*]] = shufflevector <4 x float> [[A3]], <4 x float> <float undef, float 4.000000e+00, float 5.000000e+00, float undef>, <4 x i32> <i32 0, i32 5, i32 6, i32 3>
119 ; CHECK-NEXT:    ret <4 x float> [[RET]]
120 ;
121   %a0 = insertelement <4 x float> undef, float %f, i32 0
122   %a1 = insertelement <4 x float> %a0, float 1.000000e+00, i32 1
123   %a2 = insertelement <4 x float> %a1, float 2.000000e+00, i32 2
124   %a3 = insertelement <4 x float> %a2, float 3.000000e+00, i32 3
125   %b0 = insertelement <4 x float> undef, float %g, i32 0
126   %b1 = insertelement <4 x float> %b0, float 4.000000e+00, i32 1
127   %b2 = insertelement <4 x float> %b1, float 5.000000e+00, i32 2
128   %b3 = insertelement <4 x float> %b2, float 6.000000e+00, i32 3
129   %ret = select <4 x i1> <i1 true, i1 false, i1 false, i1 true>, <4 x float> %a3, <4 x float> %b3
130   ret <4 x float> %ret
131 }
132
133 ; Check that instcombine doesn't wrongly fold away the select completely.
134 ; TODO: Should this be an insertelement rather than a shuffle?
135
136 define <2 x i64> @PR24922(<2 x i64> %v) {
137 ; CHECK-LABEL: @PR24922(
138 ; CHECK-NEXT:    [[RESULT1:%.*]] = insertelement <2 x i64> %v, i64 0, i32 0
139 ; CHECK-NEXT:    ret <2 x i64> [[RESULT1]]
140 ;
141   %result = select <2 x i1> <i1 icmp eq (i64 extractelement (<2 x i64> bitcast (<4 x i32> <i32 15, i32 15, i32 15, i32 15> to <2 x i64>), i64 0), i64 0), i1 true>, <2 x i64> %v, <2 x i64> zeroinitializer
142   ret <2 x i64> %result
143 }
144
145 ; The shuffle only demands the 0th (undef) element of 'out123', so everything should fold away.
146
147 define <4 x float> @inselt_shuf_no_demand(float %a1, float %a2, float %a3) {
148 ; CHECK-LABEL: @inselt_shuf_no_demand(
149 ; CHECK-NEXT:    ret <4 x float> undef
150 ;
151   %out1 = insertelement <4 x float> undef, float %a1, i32 1
152   %out12 = insertelement <4 x float> %out1, float %a2, i32 2
153   %out123 = insertelement <4 x float> %out12, float %a3, i32 3
154   %shuffle = shufflevector <4 x float> %out123, <4 x float> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
155   ret <4 x float> %shuffle
156 }
157
158 ; The shuffle only demands the 0th (undef) element of 'out123', so everything should fold away.
159
160 define <4 x float> @inselt_shuf_no_demand_commute(float %a1, float %a2, float %a3) {
161 ; CHECK-LABEL: @inselt_shuf_no_demand_commute(
162 ; CHECK-NEXT:    ret <4 x float> undef
163 ;
164   %out1 = insertelement <4 x float> undef, float %a1, i32 1
165   %out12 = insertelement <4 x float> %out1, float %a2, i32 2
166   %out123 = insertelement <4 x float> %out12, float %a3, i32 3
167   %shuffle = shufflevector <4 x float> undef, <4 x float> %out123, <4 x i32> <i32 4, i32 undef, i32 undef, i32 undef>
168   ret <4 x float> %shuffle
169 }
170
171 ; The add uses 'out012' giving it multiple uses after the shuffle is transformed to also
172 ; use 'out012'. The analysis should be able to see past that.
173
174 define <4 x i32> @inselt_shuf_no_demand_multiuse(i32 %a0, i32 %a1, <4 x i32> %b) {
175 ; CHECK-LABEL: @inselt_shuf_no_demand_multiuse(
176 ; CHECK-NEXT:    [[OUT0:%.*]] = insertelement <4 x i32> undef, i32 %a0, i32 0
177 ; CHECK-NEXT:    [[OUT01:%.*]] = insertelement <4 x i32> [[OUT0]], i32 %a1, i32 1
178 ; CHECK-NEXT:    [[FOO:%.*]] = add <4 x i32> [[OUT01]], %b
179 ; CHECK-NEXT:    ret <4 x i32> [[FOO]]
180 ;
181   %out0 = insertelement <4 x i32> undef, i32 %a0, i32 0
182   %out01 = insertelement <4 x i32> %out0, i32 %a1, i32 1
183   %out012 = insertelement <4 x i32> %out01, i32 %a0, i32 2
184   %foo = add <4 x i32> %out012, %b
185   %out0123 = insertelement <4 x i32> %foo, i32 %a1, i32 3
186   %shuffle = shufflevector <4 x i32> %out0123, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
187   ret <4 x i32> %shuffle
188 }
189
190 ; FIXME: We should be able to look past the bogus use of 'out12' and kill 'out1'.
191
192 define <4 x float> @inselt_shuf_no_demand_bogus_insert_index_in_chain(float %a1, float %a2, float %a3, i32 %variable_index) {
193 ; CHECK-LABEL: @inselt_shuf_no_demand_bogus_insert_index_in_chain(
194 ; CHECK-NEXT:    [[OUT1:%.*]] = insertelement <4 x float> undef, float %a1, i32 1
195 ; CHECK-NEXT:    ret <4 x float> [[OUT1]]
196 ;
197   %out1 = insertelement <4 x float> undef, float %a1, i32 1
198   %out12 = insertelement <4 x float> %out1, float %a2, i32 undef ; something unexpected
199   %out123 = insertelement <4 x float> %out12, float %a3, i32 3
200   %shuffle = shufflevector <4 x float> %out123, <4 x float> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
201   ret <4 x float> %shuffle
202 }
203