Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/select-bitext.ll @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | 803732b1fca8 |
children |
comparison
equal
deleted
inserted
replaced
134:3a76565eade5 | 147:c2174574ed3a |
---|---|
3 | 3 |
4 ; Widen a select of constants to eliminate an extend. | 4 ; Widen a select of constants to eliminate an extend. |
5 | 5 |
6 define i16 @sel_sext_constants(i1 %cmp) { | 6 define i16 @sel_sext_constants(i1 %cmp) { |
7 ; CHECK-LABEL: @sel_sext_constants( | 7 ; CHECK-LABEL: @sel_sext_constants( |
8 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i16 -1, i16 42 | 8 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i16 -1, i16 42 |
9 ; CHECK-NEXT: ret i16 [[EXT]] | 9 ; CHECK-NEXT: ret i16 [[EXT]] |
10 ; | 10 ; |
11 %sel = select i1 %cmp, i8 255, i8 42 | 11 %sel = select i1 %cmp, i8 255, i8 42 |
12 %ext = sext i8 %sel to i16 | 12 %ext = sext i8 %sel to i16 |
13 ret i16 %ext | 13 ret i16 %ext |
14 } | 14 } |
15 | 15 |
16 define i16 @sel_zext_constants(i1 %cmp) { | 16 define i16 @sel_zext_constants(i1 %cmp) { |
17 ; CHECK-LABEL: @sel_zext_constants( | 17 ; CHECK-LABEL: @sel_zext_constants( |
18 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i16 255, i16 42 | 18 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i16 255, i16 42 |
19 ; CHECK-NEXT: ret i16 [[EXT]] | 19 ; CHECK-NEXT: ret i16 [[EXT]] |
20 ; | 20 ; |
21 %sel = select i1 %cmp, i8 255, i8 42 | 21 %sel = select i1 %cmp, i8 255, i8 42 |
22 %ext = zext i8 %sel to i16 | 22 %ext = zext i8 %sel to i16 |
23 ret i16 %ext | 23 ret i16 %ext |
24 } | 24 } |
25 | 25 |
26 define double @sel_fpext_constants(i1 %cmp) { | 26 define double @sel_fpext_constants(i1 %cmp) { |
27 ; CHECK-LABEL: @sel_fpext_constants( | 27 ; CHECK-LABEL: @sel_fpext_constants( |
28 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, double -2.550000e+02, double 4.200000e+01 | 28 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], double -2.550000e+02, double 4.200000e+01 |
29 ; CHECK-NEXT: ret double [[EXT]] | 29 ; CHECK-NEXT: ret double [[EXT]] |
30 ; | 30 ; |
31 %sel = select i1 %cmp, float -255.0, float 42.0 | 31 %sel = select i1 %cmp, float -255.0, float 42.0 |
32 %ext = fpext float %sel to double | 32 %ext = fpext float %sel to double |
33 ret double %ext | 33 ret double %ext |
35 | 35 |
36 ; FIXME: We should not grow the size of the select in the next 4 cases. | 36 ; FIXME: We should not grow the size of the select in the next 4 cases. |
37 | 37 |
38 define i64 @sel_sext(i32 %a, i1 %cmp) { | 38 define i64 @sel_sext(i32 %a, i1 %cmp) { |
39 ; CHECK-LABEL: @sel_sext( | 39 ; CHECK-LABEL: @sel_sext( |
40 ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 %a to i64 | 40 ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[A:%.*]] to i64 |
41 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i64 [[TMP1]], i64 42 | 41 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i64 [[TMP1]], i64 42 |
42 ; CHECK-NEXT: ret i64 [[EXT]] | 42 ; CHECK-NEXT: ret i64 [[EXT]] |
43 ; | 43 ; |
44 %sel = select i1 %cmp, i32 %a, i32 42 | 44 %sel = select i1 %cmp, i32 %a, i32 42 |
45 %ext = sext i32 %sel to i64 | 45 %ext = sext i32 %sel to i64 |
46 ret i64 %ext | 46 ret i64 %ext |
47 } | 47 } |
48 | 48 |
49 define <4 x i64> @sel_sext_vec(<4 x i32> %a, <4 x i1> %cmp) { | 49 define <4 x i64> @sel_sext_vec(<4 x i32> %a, <4 x i1> %cmp) { |
50 ; CHECK-LABEL: @sel_sext_vec( | 50 ; CHECK-LABEL: @sel_sext_vec( |
51 ; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i32> %a to <4 x i64> | 51 ; CHECK-NEXT: [[TMP1:%.*]] = sext <4 x i32> [[A:%.*]] to <4 x i64> |
52 ; CHECK-NEXT: [[EXT:%.*]] = select <4 x i1> %cmp, <4 x i64> [[TMP1]], <4 x i64> <i64 42, i64 42, i64 42, i64 42> | 52 ; CHECK-NEXT: [[EXT:%.*]] = select <4 x i1> [[CMP:%.*]], <4 x i64> [[TMP1]], <4 x i64> <i64 42, i64 42, i64 42, i64 42> |
53 ; CHECK-NEXT: ret <4 x i64> [[EXT]] | 53 ; CHECK-NEXT: ret <4 x i64> [[EXT]] |
54 ; | 54 ; |
55 %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> <i32 42, i32 42, i32 42, i32 42> | 55 %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> <i32 42, i32 42, i32 42, i32 42> |
56 %ext = sext <4 x i32> %sel to <4 x i64> | 56 %ext = sext <4 x i32> %sel to <4 x i64> |
57 ret <4 x i64> %ext | 57 ret <4 x i64> %ext |
58 } | 58 } |
59 | 59 |
60 define i64 @sel_zext(i32 %a, i1 %cmp) { | 60 define i64 @sel_zext(i32 %a, i1 %cmp) { |
61 ; CHECK-LABEL: @sel_zext( | 61 ; CHECK-LABEL: @sel_zext( |
62 ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 %a to i64 | 62 ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[A:%.*]] to i64 |
63 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i64 [[TMP1]], i64 42 | 63 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i64 [[TMP1]], i64 42 |
64 ; CHECK-NEXT: ret i64 [[EXT]] | 64 ; CHECK-NEXT: ret i64 [[EXT]] |
65 ; | 65 ; |
66 %sel = select i1 %cmp, i32 %a, i32 42 | 66 %sel = select i1 %cmp, i32 %a, i32 42 |
67 %ext = zext i32 %sel to i64 | 67 %ext = zext i32 %sel to i64 |
68 ret i64 %ext | 68 ret i64 %ext |
69 } | 69 } |
70 | 70 |
71 define <4 x i64> @sel_zext_vec(<4 x i32> %a, <4 x i1> %cmp) { | 71 define <4 x i64> @sel_zext_vec(<4 x i32> %a, <4 x i1> %cmp) { |
72 ; CHECK-LABEL: @sel_zext_vec( | 72 ; CHECK-LABEL: @sel_zext_vec( |
73 ; CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i32> %a to <4 x i64> | 73 ; CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i32> [[A:%.*]] to <4 x i64> |
74 ; CHECK-NEXT: [[EXT:%.*]] = select <4 x i1> %cmp, <4 x i64> [[TMP1]], <4 x i64> <i64 42, i64 42, i64 42, i64 42> | 74 ; CHECK-NEXT: [[EXT:%.*]] = select <4 x i1> [[CMP:%.*]], <4 x i64> [[TMP1]], <4 x i64> <i64 42, i64 42, i64 42, i64 42> |
75 ; CHECK-NEXT: ret <4 x i64> [[EXT]] | 75 ; CHECK-NEXT: ret <4 x i64> [[EXT]] |
76 ; | 76 ; |
77 %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> <i32 42, i32 42, i32 42, i32 42> | 77 %sel = select <4 x i1> %cmp, <4 x i32> %a, <4 x i32> <i32 42, i32 42, i32 42, i32 42> |
78 %ext = zext <4 x i32> %sel to <4 x i64> | 78 %ext = zext <4 x i32> %sel to <4 x i64> |
79 ret <4 x i64> %ext | 79 ret <4 x i64> %ext |
83 ; The only cases where we eliminate an instruction are equal zext with scalar/vector, so that's probably the only | 83 ; The only cases where we eliminate an instruction are equal zext with scalar/vector, so that's probably the only |
84 ; way to justify widening the select. | 84 ; way to justify widening the select. |
85 | 85 |
86 define i64 @trunc_sel_larger_sext(i32 %a, i1 %cmp) { | 86 define i64 @trunc_sel_larger_sext(i32 %a, i1 %cmp) { |
87 ; CHECK-LABEL: @trunc_sel_larger_sext( | 87 ; CHECK-LABEL: @trunc_sel_larger_sext( |
88 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 %a to i16 | 88 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[A:%.*]] to i16 |
89 ; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[TRUNC]] to i64 | 89 ; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[TRUNC]] to i64 |
90 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i64 [[TMP1]], i64 42 | 90 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i64 [[TMP1]], i64 42 |
91 ; CHECK-NEXT: ret i64 [[EXT]] | 91 ; CHECK-NEXT: ret i64 [[EXT]] |
92 ; | 92 ; |
93 %trunc = trunc i32 %a to i16 | 93 %trunc = trunc i32 %a to i16 |
94 %sel = select i1 %cmp, i16 %trunc, i16 42 | 94 %sel = select i1 %cmp, i16 %trunc, i16 42 |
95 %ext = sext i16 %sel to i64 | 95 %ext = sext i16 %sel to i64 |
96 ret i64 %ext | 96 ret i64 %ext |
97 } | 97 } |
98 | 98 |
99 define <2 x i64> @trunc_sel_larger_sext_vec(<2 x i32> %a, <2 x i1> %cmp) { | 99 define <2 x i64> @trunc_sel_larger_sext_vec(<2 x i32> %a, <2 x i1> %cmp) { |
100 ; CHECK-LABEL: @trunc_sel_larger_sext_vec( | 100 ; CHECK-LABEL: @trunc_sel_larger_sext_vec( |
101 ; CHECK-NEXT: [[TRUNC:%.*]] = zext <2 x i32> %a to <2 x i64> | 101 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc <2 x i32> [[A:%.*]] to <2 x i16> |
102 ; CHECK-NEXT: [[SEXT:%.*]] = shl <2 x i64> [[TRUNC]], <i64 48, i64 48> | 102 ; CHECK-NEXT: [[TMP1:%.*]] = sext <2 x i16> [[TRUNC]] to <2 x i64> |
103 ; CHECK-NEXT: [[TMP1:%.*]] = ashr exact <2 x i64> [[SEXT]], <i64 48, i64 48> | 103 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i64> [[TMP1]], <2 x i64> <i64 42, i64 43> |
104 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i64> [[TMP1]], <2 x i64> <i64 42, i64 43> | |
105 ; CHECK-NEXT: ret <2 x i64> [[EXT]] | 104 ; CHECK-NEXT: ret <2 x i64> [[EXT]] |
106 ; | 105 ; |
107 %trunc = trunc <2 x i32> %a to <2 x i16> | 106 %trunc = trunc <2 x i32> %a to <2 x i16> |
108 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 107 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
109 %ext = sext <2 x i16> %sel to <2 x i64> | 108 %ext = sext <2 x i16> %sel to <2 x i64> |
110 ret <2 x i64> %ext | 109 ret <2 x i64> %ext |
111 } | 110 } |
112 | 111 |
113 define i32 @trunc_sel_smaller_sext(i64 %a, i1 %cmp) { | 112 define i32 @trunc_sel_smaller_sext(i64 %a, i1 %cmp) { |
114 ; CHECK-LABEL: @trunc_sel_smaller_sext( | 113 ; CHECK-LABEL: @trunc_sel_smaller_sext( |
115 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 %a to i16 | 114 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[A:%.*]] to i16 |
116 ; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[TRUNC]] to i32 | 115 ; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[TRUNC]] to i32 |
117 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i32 [[TMP1]], i32 42 | 116 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i32 [[TMP1]], i32 42 |
118 ; CHECK-NEXT: ret i32 [[EXT]] | 117 ; CHECK-NEXT: ret i32 [[EXT]] |
119 ; | 118 ; |
120 %trunc = trunc i64 %a to i16 | 119 %trunc = trunc i64 %a to i16 |
121 %sel = select i1 %cmp, i16 %trunc, i16 42 | 120 %sel = select i1 %cmp, i16 %trunc, i16 42 |
122 %ext = sext i16 %sel to i32 | 121 %ext = sext i16 %sel to i32 |
123 ret i32 %ext | 122 ret i32 %ext |
124 } | 123 } |
125 | 124 |
126 define <2 x i32> @trunc_sel_smaller_sext_vec(<2 x i64> %a, <2 x i1> %cmp) { | 125 define <2 x i32> @trunc_sel_smaller_sext_vec(<2 x i64> %a, <2 x i1> %cmp) { |
127 ; CHECK-LABEL: @trunc_sel_smaller_sext_vec( | 126 ; CHECK-LABEL: @trunc_sel_smaller_sext_vec( |
128 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc <2 x i64> %a to <2 x i32> | 127 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc <2 x i64> [[A:%.*]] to <2 x i16> |
129 ; CHECK-NEXT: [[SEXT:%.*]] = shl <2 x i32> [[TRUNC]], <i32 16, i32 16> | 128 ; CHECK-NEXT: [[TMP1:%.*]] = sext <2 x i16> [[TRUNC]] to <2 x i32> |
130 ; CHECK-NEXT: [[TMP1:%.*]] = ashr exact <2 x i32> [[SEXT]], <i32 16, i32 16> | 129 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> |
131 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> | |
132 ; CHECK-NEXT: ret <2 x i32> [[EXT]] | 130 ; CHECK-NEXT: ret <2 x i32> [[EXT]] |
133 ; | 131 ; |
134 %trunc = trunc <2 x i64> %a to <2 x i16> | 132 %trunc = trunc <2 x i64> %a to <2 x i16> |
135 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 133 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
136 %ext = sext <2 x i16> %sel to <2 x i32> | 134 %ext = sext <2 x i16> %sel to <2 x i32> |
137 ret <2 x i32> %ext | 135 ret <2 x i32> %ext |
138 } | 136 } |
139 | 137 |
140 define i32 @trunc_sel_equal_sext(i32 %a, i1 %cmp) { | 138 define i32 @trunc_sel_equal_sext(i32 %a, i1 %cmp) { |
141 ; CHECK-LABEL: @trunc_sel_equal_sext( | 139 ; CHECK-LABEL: @trunc_sel_equal_sext( |
142 ; CHECK-NEXT: [[SEXT:%.*]] = shl i32 %a, 16 | 140 ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[A:%.*]], 16 |
143 ; CHECK-NEXT: [[TMP1:%.*]] = ashr exact i32 [[SEXT]], 16 | 141 ; CHECK-NEXT: [[TMP2:%.*]] = ashr exact i32 [[TMP1]], 16 |
144 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i32 [[TMP1]], i32 42 | 142 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i32 [[TMP2]], i32 42 |
145 ; CHECK-NEXT: ret i32 [[EXT]] | 143 ; CHECK-NEXT: ret i32 [[EXT]] |
146 ; | 144 ; |
147 %trunc = trunc i32 %a to i16 | 145 %trunc = trunc i32 %a to i16 |
148 %sel = select i1 %cmp, i16 %trunc, i16 42 | 146 %sel = select i1 %cmp, i16 %trunc, i16 42 |
149 %ext = sext i16 %sel to i32 | 147 %ext = sext i16 %sel to i32 |
150 ret i32 %ext | 148 ret i32 %ext |
151 } | 149 } |
152 | 150 |
153 define <2 x i32> @trunc_sel_equal_sext_vec(<2 x i32> %a, <2 x i1> %cmp) { | 151 define <2 x i32> @trunc_sel_equal_sext_vec(<2 x i32> %a, <2 x i1> %cmp) { |
154 ; CHECK-LABEL: @trunc_sel_equal_sext_vec( | 152 ; CHECK-LABEL: @trunc_sel_equal_sext_vec( |
155 ; CHECK-NEXT: [[SEXT:%.*]] = shl <2 x i32> %a, <i32 16, i32 16> | 153 ; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> [[A:%.*]], <i32 16, i32 16> |
156 ; CHECK-NEXT: [[TMP1:%.*]] = ashr exact <2 x i32> [[SEXT]], <i32 16, i32 16> | 154 ; CHECK-NEXT: [[TMP2:%.*]] = ashr exact <2 x i32> [[TMP1]], <i32 16, i32 16> |
157 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> | 155 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i32> [[TMP2]], <2 x i32> <i32 42, i32 43> |
158 ; CHECK-NEXT: ret <2 x i32> [[EXT]] | 156 ; CHECK-NEXT: ret <2 x i32> [[EXT]] |
159 ; | 157 ; |
160 %trunc = trunc <2 x i32> %a to <2 x i16> | 158 %trunc = trunc <2 x i32> %a to <2 x i16> |
161 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 159 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
162 %ext = sext <2 x i16> %sel to <2 x i32> | 160 %ext = sext <2 x i16> %sel to <2 x i32> |
163 ret <2 x i32> %ext | 161 ret <2 x i32> %ext |
164 } | 162 } |
165 | 163 |
166 define i64 @trunc_sel_larger_zext(i32 %a, i1 %cmp) { | 164 define i64 @trunc_sel_larger_zext(i32 %a, i1 %cmp) { |
167 ; CHECK-LABEL: @trunc_sel_larger_zext( | 165 ; CHECK-LABEL: @trunc_sel_larger_zext( |
168 ; CHECK-NEXT: [[TRUNC_MASK:%.*]] = and i32 %a, 65535 | 166 ; CHECK-NEXT: [[TRUNC_MASK:%.*]] = and i32 [[A:%.*]], 65535 |
169 ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TRUNC_MASK]] to i64 | 167 ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TRUNC_MASK]] to i64 |
170 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i64 [[TMP1]], i64 42 | 168 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i64 [[TMP1]], i64 42 |
171 ; CHECK-NEXT: ret i64 [[EXT]] | 169 ; CHECK-NEXT: ret i64 [[EXT]] |
172 ; | 170 ; |
173 %trunc = trunc i32 %a to i16 | 171 %trunc = trunc i32 %a to i16 |
174 %sel = select i1 %cmp, i16 %trunc, i16 42 | 172 %sel = select i1 %cmp, i16 %trunc, i16 42 |
175 %ext = zext i16 %sel to i64 | 173 %ext = zext i16 %sel to i64 |
176 ret i64 %ext | 174 ret i64 %ext |
177 } | 175 } |
178 | 176 |
179 define <2 x i64> @trunc_sel_larger_zext_vec(<2 x i32> %a, <2 x i1> %cmp) { | 177 define <2 x i64> @trunc_sel_larger_zext_vec(<2 x i32> %a, <2 x i1> %cmp) { |
180 ; CHECK-LABEL: @trunc_sel_larger_zext_vec( | 178 ; CHECK-LABEL: @trunc_sel_larger_zext_vec( |
181 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> %a, <i32 65535, i32 65535> | 179 ; CHECK-NEXT: [[TRUNC_MASK:%.*]] = and <2 x i32> [[A:%.*]], <i32 65535, i32 65535> |
182 ; CHECK-NEXT: [[TMP2:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64> | 180 ; CHECK-NEXT: [[TMP1:%.*]] = zext <2 x i32> [[TRUNC_MASK]] to <2 x i64> |
183 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i64> [[TMP2]], <2 x i64> <i64 42, i64 43> | 181 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i64> [[TMP1]], <2 x i64> <i64 42, i64 43> |
184 ; CHECK-NEXT: ret <2 x i64> [[EXT]] | 182 ; CHECK-NEXT: ret <2 x i64> [[EXT]] |
185 ; | 183 ; |
186 %trunc = trunc <2 x i32> %a to <2 x i16> | 184 %trunc = trunc <2 x i32> %a to <2 x i16> |
187 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 185 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
188 %ext = zext <2 x i16> %sel to <2 x i64> | 186 %ext = zext <2 x i16> %sel to <2 x i64> |
189 ret <2 x i64> %ext | 187 ret <2 x i64> %ext |
190 } | 188 } |
191 | 189 |
192 define i32 @trunc_sel_smaller_zext(i64 %a, i1 %cmp) { | 190 define i32 @trunc_sel_smaller_zext(i64 %a, i1 %cmp) { |
193 ; CHECK-LABEL: @trunc_sel_smaller_zext( | 191 ; CHECK-LABEL: @trunc_sel_smaller_zext( |
194 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 %a to i32 | 192 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[A:%.*]] to i32 |
195 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 65535 | 193 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 65535 |
196 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i32 [[TMP2]], i32 42 | 194 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i32 [[TMP2]], i32 42 |
197 ; CHECK-NEXT: ret i32 [[EXT]] | 195 ; CHECK-NEXT: ret i32 [[EXT]] |
198 ; | 196 ; |
199 %trunc = trunc i64 %a to i16 | 197 %trunc = trunc i64 %a to i16 |
200 %sel = select i1 %cmp, i16 %trunc, i16 42 | 198 %sel = select i1 %cmp, i16 %trunc, i16 42 |
201 %ext = zext i16 %sel to i32 | 199 %ext = zext i16 %sel to i32 |
202 ret i32 %ext | 200 ret i32 %ext |
203 } | 201 } |
204 | 202 |
205 define <2 x i32> @trunc_sel_smaller_zext_vec(<2 x i64> %a, <2 x i1> %cmp) { | 203 define <2 x i32> @trunc_sel_smaller_zext_vec(<2 x i64> %a, <2 x i1> %cmp) { |
206 ; CHECK-LABEL: @trunc_sel_smaller_zext_vec( | 204 ; CHECK-LABEL: @trunc_sel_smaller_zext_vec( |
207 ; CHECK-NEXT: [[TRUNC:%.*]] = trunc <2 x i64> %a to <2 x i32> | 205 ; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i64> [[A:%.*]] to <2 x i32> |
208 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[TRUNC]], <i32 65535, i32 65535> | 206 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 65535, i32 65535> |
209 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> | 207 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i32> [[TMP2]], <2 x i32> <i32 42, i32 43> |
210 ; CHECK-NEXT: ret <2 x i32> [[EXT]] | 208 ; CHECK-NEXT: ret <2 x i32> [[EXT]] |
211 ; | 209 ; |
212 %trunc = trunc <2 x i64> %a to <2 x i16> | 210 %trunc = trunc <2 x i64> %a to <2 x i16> |
213 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 211 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
214 %ext = zext <2 x i16> %sel to <2 x i32> | 212 %ext = zext <2 x i16> %sel to <2 x i32> |
215 ret <2 x i32> %ext | 213 ret <2 x i32> %ext |
216 } | 214 } |
217 | 215 |
218 define i32 @trunc_sel_equal_zext(i32 %a, i1 %cmp) { | 216 define i32 @trunc_sel_equal_zext(i32 %a, i1 %cmp) { |
219 ; CHECK-LABEL: @trunc_sel_equal_zext( | 217 ; CHECK-LABEL: @trunc_sel_equal_zext( |
220 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 %a, 65535 | 218 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], 65535 |
221 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, i32 [[TMP1]], i32 42 | 219 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], i32 [[TMP1]], i32 42 |
222 ; CHECK-NEXT: ret i32 [[EXT]] | 220 ; CHECK-NEXT: ret i32 [[EXT]] |
223 ; | 221 ; |
224 %trunc = trunc i32 %a to i16 | 222 %trunc = trunc i32 %a to i16 |
225 %sel = select i1 %cmp, i16 %trunc, i16 42 | 223 %sel = select i1 %cmp, i16 %trunc, i16 42 |
226 %ext = zext i16 %sel to i32 | 224 %ext = zext i16 %sel to i32 |
227 ret i32 %ext | 225 ret i32 %ext |
228 } | 226 } |
229 | 227 |
230 define <2 x i32> @trunc_sel_equal_zext_vec(<2 x i32> %a, <2 x i1> %cmp) { | 228 define <2 x i32> @trunc_sel_equal_zext_vec(<2 x i32> %a, <2 x i1> %cmp) { |
231 ; CHECK-LABEL: @trunc_sel_equal_zext_vec( | 229 ; CHECK-LABEL: @trunc_sel_equal_zext_vec( |
232 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> %a, <i32 65535, i32 65535> | 230 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], <i32 65535, i32 65535> |
233 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> | 231 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x i32> [[TMP1]], <2 x i32> <i32 42, i32 43> |
234 ; CHECK-NEXT: ret <2 x i32> [[EXT]] | 232 ; CHECK-NEXT: ret <2 x i32> [[EXT]] |
235 ; | 233 ; |
236 %trunc = trunc <2 x i32> %a to <2 x i16> | 234 %trunc = trunc <2 x i32> %a to <2 x i16> |
237 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> | 235 %sel = select <2 x i1> %cmp, <2 x i16> %trunc, <2 x i16> <i16 42, i16 43> |
238 %ext = zext <2 x i16> %sel to <2 x i32> | 236 %ext = zext <2 x i16> %sel to <2 x i32> |
239 ret <2 x i32> %ext | 237 ret <2 x i32> %ext |
240 } | 238 } |
241 | 239 |
242 define double @trunc_sel_larger_fpext(float %a, i1 %cmp) { | 240 define double @trunc_sel_larger_fpext(float %a, i1 %cmp) { |
243 ; CHECK-LABEL: @trunc_sel_larger_fpext( | 241 ; CHECK-LABEL: @trunc_sel_larger_fpext( |
244 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc float %a to half | 242 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc float [[A:%.*]] to half |
245 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to double | 243 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to double |
246 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, double [[TMP1]], double 4.200000e+01 | 244 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], double [[TMP1]], double 4.200000e+01 |
247 ; CHECK-NEXT: ret double [[EXT]] | 245 ; CHECK-NEXT: ret double [[EXT]] |
248 ; | 246 ; |
249 %trunc = fptrunc float %a to half | 247 %trunc = fptrunc float %a to half |
250 %sel = select i1 %cmp, half %trunc, half 42.0 | 248 %sel = select i1 %cmp, half %trunc, half 42.0 |
251 %ext = fpext half %sel to double | 249 %ext = fpext half %sel to double |
252 ret double %ext | 250 ret double %ext |
253 } | 251 } |
254 | 252 |
255 define <2 x double> @trunc_sel_larger_fpext_vec(<2 x float> %a, <2 x i1> %cmp) { | 253 define <2 x double> @trunc_sel_larger_fpext_vec(<2 x float> %a, <2 x i1> %cmp) { |
256 ; CHECK-LABEL: @trunc_sel_larger_fpext_vec( | 254 ; CHECK-LABEL: @trunc_sel_larger_fpext_vec( |
257 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x float> %a to <2 x half> | 255 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x float> [[A:%.*]] to <2 x half> |
258 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x double> | 256 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x double> |
259 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x double> [[TMP1]], <2 x double> <double 4.200000e+01, double 4.300000e+01> | 257 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x double> [[TMP1]], <2 x double> <double 4.200000e+01, double 4.300000e+01> |
260 ; CHECK-NEXT: ret <2 x double> [[EXT]] | 258 ; CHECK-NEXT: ret <2 x double> [[EXT]] |
261 ; | 259 ; |
262 %trunc = fptrunc <2 x float> %a to <2 x half> | 260 %trunc = fptrunc <2 x float> %a to <2 x half> |
263 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> | 261 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> |
264 %ext = fpext <2 x half> %sel to <2 x double> | 262 %ext = fpext <2 x half> %sel to <2 x double> |
265 ret <2 x double> %ext | 263 ret <2 x double> %ext |
266 } | 264 } |
267 | 265 |
268 define float @trunc_sel_smaller_fpext(double %a, i1 %cmp) { | 266 define float @trunc_sel_smaller_fpext(double %a, i1 %cmp) { |
269 ; CHECK-LABEL: @trunc_sel_smaller_fpext( | 267 ; CHECK-LABEL: @trunc_sel_smaller_fpext( |
270 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc double %a to half | 268 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc double [[A:%.*]] to half |
271 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to float | 269 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to float |
272 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, float [[TMP1]], float 4.200000e+01 | 270 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], float [[TMP1]], float 4.200000e+01 |
273 ; CHECK-NEXT: ret float [[EXT]] | 271 ; CHECK-NEXT: ret float [[EXT]] |
274 ; | 272 ; |
275 %trunc = fptrunc double %a to half | 273 %trunc = fptrunc double %a to half |
276 %sel = select i1 %cmp, half %trunc, half 42.0 | 274 %sel = select i1 %cmp, half %trunc, half 42.0 |
277 %ext = fpext half %sel to float | 275 %ext = fpext half %sel to float |
278 ret float %ext | 276 ret float %ext |
279 } | 277 } |
280 | 278 |
281 define <2 x float> @trunc_sel_smaller_fpext_vec(<2 x double> %a, <2 x i1> %cmp) { | 279 define <2 x float> @trunc_sel_smaller_fpext_vec(<2 x double> %a, <2 x i1> %cmp) { |
282 ; CHECK-LABEL: @trunc_sel_smaller_fpext_vec( | 280 ; CHECK-LABEL: @trunc_sel_smaller_fpext_vec( |
283 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x double> %a to <2 x half> | 281 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x double> [[A:%.*]] to <2 x half> |
284 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x float> | 282 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x float> |
285 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x float> [[TMP1]], <2 x float> <float 4.200000e+01, float 4.300000e+01> | 283 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x float> [[TMP1]], <2 x float> <float 4.200000e+01, float 4.300000e+01> |
286 ; CHECK-NEXT: ret <2 x float> [[EXT]] | 284 ; CHECK-NEXT: ret <2 x float> [[EXT]] |
287 ; | 285 ; |
288 %trunc = fptrunc <2 x double> %a to <2 x half> | 286 %trunc = fptrunc <2 x double> %a to <2 x half> |
289 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> | 287 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> |
290 %ext = fpext <2 x half> %sel to <2 x float> | 288 %ext = fpext <2 x half> %sel to <2 x float> |
291 ret <2 x float> %ext | 289 ret <2 x float> %ext |
292 } | 290 } |
293 | 291 |
294 define float @trunc_sel_equal_fpext(float %a, i1 %cmp) { | 292 define float @trunc_sel_equal_fpext(float %a, i1 %cmp) { |
295 ; CHECK-LABEL: @trunc_sel_equal_fpext( | 293 ; CHECK-LABEL: @trunc_sel_equal_fpext( |
296 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc float %a to half | 294 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc float [[A:%.*]] to half |
297 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to float | 295 ; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TRUNC]] to float |
298 ; CHECK-NEXT: [[EXT:%.*]] = select i1 %cmp, float [[TMP1]], float 4.200000e+01 | 296 ; CHECK-NEXT: [[EXT:%.*]] = select i1 [[CMP:%.*]], float [[TMP1]], float 4.200000e+01 |
299 ; CHECK-NEXT: ret float [[EXT]] | 297 ; CHECK-NEXT: ret float [[EXT]] |
300 ; | 298 ; |
301 %trunc = fptrunc float %a to half | 299 %trunc = fptrunc float %a to half |
302 %sel = select i1 %cmp, half %trunc, half 42.0 | 300 %sel = select i1 %cmp, half %trunc, half 42.0 |
303 %ext = fpext half %sel to float | 301 %ext = fpext half %sel to float |
304 ret float %ext | 302 ret float %ext |
305 } | 303 } |
306 | 304 |
307 define <2 x float> @trunc_sel_equal_fpext_vec(<2 x float> %a, <2 x i1> %cmp) { | 305 define <2 x float> @trunc_sel_equal_fpext_vec(<2 x float> %a, <2 x i1> %cmp) { |
308 ; CHECK-LABEL: @trunc_sel_equal_fpext_vec( | 306 ; CHECK-LABEL: @trunc_sel_equal_fpext_vec( |
309 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x float> %a to <2 x half> | 307 ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc <2 x float> [[A:%.*]] to <2 x half> |
310 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x float> | 308 ; CHECK-NEXT: [[TMP1:%.*]] = fpext <2 x half> [[TRUNC]] to <2 x float> |
311 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> %cmp, <2 x float> [[TMP1]], <2 x float> <float 4.200000e+01, float 4.300000e+01> | 309 ; CHECK-NEXT: [[EXT:%.*]] = select <2 x i1> [[CMP:%.*]], <2 x float> [[TMP1]], <2 x float> <float 4.200000e+01, float 4.300000e+01> |
312 ; CHECK-NEXT: ret <2 x float> [[EXT]] | 310 ; CHECK-NEXT: ret <2 x float> [[EXT]] |
313 ; | 311 ; |
314 %trunc = fptrunc <2 x float> %a to <2 x half> | 312 %trunc = fptrunc <2 x float> %a to <2 x half> |
315 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> | 313 %sel = select <2 x i1> %cmp, <2 x half> %trunc, <2 x half> <half 42.0, half 43.0> |
316 %ext = fpext <2 x half> %sel to <2 x float> | 314 %ext = fpext <2 x half> %sel to <2 x float> |
317 ret <2 x float> %ext | 315 ret <2 x float> %ext |
318 } | 316 } |
319 | 317 |
320 define i32 @test_sext1(i1 %cca, i1 %ccb) { | 318 define i32 @test_sext1(i1 %cca, i1 %ccb) { |
321 ; CHECK-LABEL: @test_sext1( | 319 ; CHECK-LABEL: @test_sext1( |
322 ; CHECK-NEXT: [[FOLD_R:%.*]] = and i1 %ccb, %cca | 320 ; CHECK-NEXT: [[NARROW:%.*]] = and i1 [[CCB:%.*]], [[CCA:%.*]] |
323 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[FOLD_R]] to i32 | 321 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[NARROW]] to i32 |
324 ; CHECK-NEXT: ret i32 [[R]] | 322 ; CHECK-NEXT: ret i32 [[R]] |
325 ; | 323 ; |
326 %ccax = sext i1 %cca to i32 | 324 %ccax = sext i1 %cca to i32 |
327 %r = select i1 %ccb, i32 %ccax, i32 0 | 325 %r = select i1 %ccb, i32 %ccax, i32 0 |
328 ret i32 %r | 326 ret i32 %r |
329 } | 327 } |
330 | 328 |
331 define i32 @test_sext2(i1 %cca, i1 %ccb) { | 329 define i32 @test_sext2(i1 %cca, i1 %ccb) { |
332 ; CHECK-LABEL: @test_sext2( | 330 ; CHECK-LABEL: @test_sext2( |
333 ; CHECK-NEXT: [[FOLD_R:%.*]] = or i1 %ccb, %cca | 331 ; CHECK-NEXT: [[NARROW:%.*]] = or i1 [[CCB:%.*]], [[CCA:%.*]] |
334 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[FOLD_R]] to i32 | 332 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[NARROW]] to i32 |
335 ; CHECK-NEXT: ret i32 [[R]] | 333 ; CHECK-NEXT: ret i32 [[R]] |
336 ; | 334 ; |
337 %ccax = sext i1 %cca to i32 | 335 %ccax = sext i1 %cca to i32 |
338 %r = select i1 %ccb, i32 -1, i32 %ccax | 336 %r = select i1 %ccb, i32 -1, i32 %ccax |
339 ret i32 %r | 337 ret i32 %r |
340 } | 338 } |
341 | 339 |
342 define i32 @test_sext3(i1 %cca, i1 %ccb) { | 340 define i32 @test_sext3(i1 %cca, i1 %ccb) { |
343 ; CHECK-LABEL: @test_sext3( | 341 ; CHECK-LABEL: @test_sext3( |
344 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 %ccb, true | 342 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 [[CCB:%.*]], true |
345 ; CHECK-NEXT: [[FOLD_R:%.*]] = and i1 [[NOT_CCB]], %cca | 343 ; CHECK-NEXT: [[NARROW:%.*]] = and i1 [[NOT_CCB]], [[CCA:%.*]] |
346 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[FOLD_R]] to i32 | 344 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[NARROW]] to i32 |
347 ; CHECK-NEXT: ret i32 [[R]] | 345 ; CHECK-NEXT: ret i32 [[R]] |
348 ; | 346 ; |
349 %ccax = sext i1 %cca to i32 | 347 %ccax = sext i1 %cca to i32 |
350 %r = select i1 %ccb, i32 0, i32 %ccax | 348 %r = select i1 %ccb, i32 0, i32 %ccax |
351 ret i32 %r | 349 ret i32 %r |
352 } | 350 } |
353 | 351 |
354 define i32 @test_sext4(i1 %cca, i1 %ccb) { | 352 define i32 @test_sext4(i1 %cca, i1 %ccb) { |
355 ; CHECK-LABEL: @test_sext4( | 353 ; CHECK-LABEL: @test_sext4( |
356 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 %ccb, true | 354 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 [[CCB:%.*]], true |
357 ; CHECK-NEXT: [[FOLD_R:%.*]] = or i1 [[NOT_CCB]], %cca | 355 ; CHECK-NEXT: [[NARROW:%.*]] = or i1 [[NOT_CCB]], [[CCA:%.*]] |
358 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[FOLD_R]] to i32 | 356 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[NARROW]] to i32 |
359 ; CHECK-NEXT: ret i32 [[R]] | 357 ; CHECK-NEXT: ret i32 [[R]] |
360 ; | 358 ; |
361 %ccax = sext i1 %cca to i32 | 359 %ccax = sext i1 %cca to i32 |
362 %r = select i1 %ccb, i32 %ccax, i32 -1 | 360 %r = select i1 %ccb, i32 %ccax, i32 -1 |
363 ret i32 %r | 361 ret i32 %r |
364 } | 362 } |
365 | 363 |
366 define i32 @test_zext1(i1 %cca, i1 %ccb) { | 364 define i32 @test_zext1(i1 %cca, i1 %ccb) { |
367 ; CHECK-LABEL: @test_zext1( | 365 ; CHECK-LABEL: @test_zext1( |
368 ; CHECK-NEXT: [[FOLD_R:%.*]] = and i1 %ccb, %cca | 366 ; CHECK-NEXT: [[NARROW:%.*]] = and i1 [[CCB:%.*]], [[CCA:%.*]] |
369 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[FOLD_R]] to i32 | 367 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[NARROW]] to i32 |
370 ; CHECK-NEXT: ret i32 [[R]] | 368 ; CHECK-NEXT: ret i32 [[R]] |
371 ; | 369 ; |
372 %ccax = zext i1 %cca to i32 | 370 %ccax = zext i1 %cca to i32 |
373 %r = select i1 %ccb, i32 %ccax, i32 0 | 371 %r = select i1 %ccb, i32 %ccax, i32 0 |
374 ret i32 %r | 372 ret i32 %r |
375 } | 373 } |
376 | 374 |
377 define i32 @test_zext2(i1 %cca, i1 %ccb) { | 375 define i32 @test_zext2(i1 %cca, i1 %ccb) { |
378 ; CHECK-LABEL: @test_zext2( | 376 ; CHECK-LABEL: @test_zext2( |
379 ; CHECK-NEXT: [[FOLD_R:%.*]] = or i1 %ccb, %cca | 377 ; CHECK-NEXT: [[NARROW:%.*]] = or i1 [[CCB:%.*]], [[CCA:%.*]] |
380 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[FOLD_R]] to i32 | 378 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[NARROW]] to i32 |
381 ; CHECK-NEXT: ret i32 [[R]] | 379 ; CHECK-NEXT: ret i32 [[R]] |
382 ; | 380 ; |
383 %ccax = zext i1 %cca to i32 | 381 %ccax = zext i1 %cca to i32 |
384 %r = select i1 %ccb, i32 1, i32 %ccax | 382 %r = select i1 %ccb, i32 1, i32 %ccax |
385 ret i32 %r | 383 ret i32 %r |
386 } | 384 } |
387 | 385 |
388 define i32 @test_zext3(i1 %cca, i1 %ccb) { | 386 define i32 @test_zext3(i1 %cca, i1 %ccb) { |
389 ; CHECK-LABEL: @test_zext3( | 387 ; CHECK-LABEL: @test_zext3( |
390 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 %ccb, true | 388 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 [[CCB:%.*]], true |
391 ; CHECK-NEXT: [[FOLD_R:%.*]] = and i1 [[NOT_CCB]], %cca | 389 ; CHECK-NEXT: [[NARROW:%.*]] = and i1 [[NOT_CCB]], [[CCA:%.*]] |
392 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[FOLD_R]] to i32 | 390 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[NARROW]] to i32 |
393 ; CHECK-NEXT: ret i32 [[R]] | 391 ; CHECK-NEXT: ret i32 [[R]] |
394 ; | 392 ; |
395 %ccax = zext i1 %cca to i32 | 393 %ccax = zext i1 %cca to i32 |
396 %r = select i1 %ccb, i32 0, i32 %ccax | 394 %r = select i1 %ccb, i32 0, i32 %ccax |
397 ret i32 %r | 395 ret i32 %r |
398 } | 396 } |
399 | 397 |
400 define i32 @test_zext4(i1 %cca, i1 %ccb) { | 398 define i32 @test_zext4(i1 %cca, i1 %ccb) { |
401 ; CHECK-LABEL: @test_zext4( | 399 ; CHECK-LABEL: @test_zext4( |
402 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 %ccb, true | 400 ; CHECK-NEXT: [[NOT_CCB:%.*]] = xor i1 [[CCB:%.*]], true |
403 ; CHECK-NEXT: [[FOLD_R:%.*]] = or i1 [[NOT_CCB]], %cca | 401 ; CHECK-NEXT: [[NARROW:%.*]] = or i1 [[NOT_CCB]], [[CCA:%.*]] |
404 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[FOLD_R]] to i32 | 402 ; CHECK-NEXT: [[R:%.*]] = zext i1 [[NARROW]] to i32 |
405 ; CHECK-NEXT: ret i32 [[R]] | 403 ; CHECK-NEXT: ret i32 [[R]] |
406 ; | 404 ; |
407 %ccax = zext i1 %cca to i32 | 405 %ccax = zext i1 %cca to i32 |
408 %r = select i1 %ccb, i32 %ccax, i32 1 | 406 %r = select i1 %ccb, i32 %ccax, i32 1 |
409 ret i32 %r | 407 ret i32 %r |
410 } | 408 } |
411 | 409 |
412 define i32 @test_negative_sext(i1 %a, i1 %cc) { | 410 define i32 @test_negative_sext(i1 %a, i1 %cc) { |
413 ; CHECK-LABEL: @test_negative_sext( | 411 ; CHECK-LABEL: @test_negative_sext( |
414 ; CHECK-NEXT: [[A_EXT:%.*]] = sext i1 %a to i32 | 412 ; CHECK-NEXT: [[A_EXT:%.*]] = sext i1 [[A:%.*]] to i32 |
415 ; CHECK-NEXT: [[R:%.*]] = select i1 %cc, i32 [[A_EXT]], i32 1 | 413 ; CHECK-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], i32 [[A_EXT]], i32 1 |
416 ; CHECK-NEXT: ret i32 [[R]] | 414 ; CHECK-NEXT: ret i32 [[R]] |
417 ; | 415 ; |
418 %a.ext = sext i1 %a to i32 | 416 %a.ext = sext i1 %a to i32 |
419 %r = select i1 %cc, i32 %a.ext, i32 1 | 417 %r = select i1 %cc, i32 %a.ext, i32 1 |
420 ret i32 %r | 418 ret i32 %r |
421 } | 419 } |
422 | 420 |
423 define i32 @test_negative_zext(i1 %a, i1 %cc) { | 421 define i32 @test_negative_zext(i1 %a, i1 %cc) { |
424 ; CHECK-LABEL: @test_negative_zext( | 422 ; CHECK-LABEL: @test_negative_zext( |
425 ; CHECK-NEXT: [[A_EXT:%.*]] = zext i1 %a to i32 | 423 ; CHECK-NEXT: [[A_EXT:%.*]] = zext i1 [[A:%.*]] to i32 |
426 ; CHECK-NEXT: [[R:%.*]] = select i1 %cc, i32 [[A_EXT]], i32 -1 | 424 ; CHECK-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], i32 [[A_EXT]], i32 -1 |
427 ; CHECK-NEXT: ret i32 [[R]] | 425 ; CHECK-NEXT: ret i32 [[R]] |
428 ; | 426 ; |
429 %a.ext = zext i1 %a to i32 | 427 %a.ext = zext i1 %a to i32 |
430 %r = select i1 %cc, i32 %a.ext, i32 -1 | 428 %r = select i1 %cc, i32 %a.ext, i32 -1 |
431 ret i32 %r | 429 ret i32 %r |
432 } | 430 } |
433 | 431 |
434 define i32 @test_bits_sext(i8 %a, i1 %cc) { | 432 define i32 @test_bits_sext(i8 %a, i1 %cc) { |
435 ; CHECK-LABEL: @test_bits_sext( | 433 ; CHECK-LABEL: @test_bits_sext( |
436 ; CHECK-NEXT: [[A_EXT:%.*]] = sext i8 %a to i32 | 434 ; CHECK-NEXT: [[A_EXT:%.*]] = sext i8 [[A:%.*]] to i32 |
437 ; CHECK-NEXT: [[R:%.*]] = select i1 %cc, i32 [[A_EXT]], i32 -128 | 435 ; CHECK-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], i32 [[A_EXT]], i32 -128 |
438 ; CHECK-NEXT: ret i32 [[R]] | 436 ; CHECK-NEXT: ret i32 [[R]] |
439 ; | 437 ; |
440 %a.ext = sext i8 %a to i32 | 438 %a.ext = sext i8 %a to i32 |
441 %r = select i1 %cc, i32 %a.ext, i32 -128 | 439 %r = select i1 %cc, i32 %a.ext, i32 -128 |
442 ret i32 %r | 440 ret i32 %r |
443 } | 441 } |
444 | 442 |
445 define i32 @test_bits_zext(i8 %a, i1 %cc) { | 443 define i32 @test_bits_zext(i8 %a, i1 %cc) { |
446 ; CHECK-LABEL: @test_bits_zext( | 444 ; CHECK-LABEL: @test_bits_zext( |
447 ; CHECK-NEXT: [[A_EXT:%.*]] = zext i8 %a to i32 | 445 ; CHECK-NEXT: [[A_EXT:%.*]] = zext i8 [[A:%.*]] to i32 |
448 ; CHECK-NEXT: [[R:%.*]] = select i1 %cc, i32 [[A_EXT]], i32 255 | 446 ; CHECK-NEXT: [[R:%.*]] = select i1 [[CC:%.*]], i32 [[A_EXT]], i32 255 |
449 ; CHECK-NEXT: ret i32 [[R]] | 447 ; CHECK-NEXT: ret i32 [[R]] |
450 ; | 448 ; |
451 %a.ext = zext i8 %a to i32 | 449 %a.ext = zext i8 %a to i32 |
452 %r = select i1 %cc, i32 %a.ext, i32 255 | 450 %r = select i1 %cc, i32 %a.ext, i32 255 |
453 ret i32 %r | 451 ret i32 %r |
454 } | 452 } |
455 | 453 |
456 define i32 @test_op_op(i32 %a, i32 %b, i32 %c) { | 454 define i32 @test_op_op(i32 %a, i32 %b, i32 %c) { |
457 ; CHECK-LABEL: @test_op_op( | 455 ; CHECK-LABEL: @test_op_op( |
458 ; CHECK-NEXT: [[CCA:%.*]] = icmp sgt i32 %a, 0 | 456 ; CHECK-NEXT: [[CCA:%.*]] = icmp sgt i32 [[A:%.*]], 0 |
459 ; CHECK-NEXT: [[CCB:%.*]] = icmp sgt i32 %b, 0 | 457 ; CHECK-NEXT: [[CCB:%.*]] = icmp sgt i32 [[B:%.*]], 0 |
460 ; CHECK-NEXT: [[CCC:%.*]] = icmp sgt i32 %c, 0 | 458 ; CHECK-NEXT: [[CCC:%.*]] = icmp sgt i32 [[C:%.*]], 0 |
461 ; CHECK-NEXT: [[R_V:%.*]] = select i1 [[CCC]], i1 [[CCA]], i1 [[CCB]] | 459 ; CHECK-NEXT: [[R_V:%.*]] = select i1 [[CCC]], i1 [[CCA]], i1 [[CCB]] |
462 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[R:%.*]].v to i32 | 460 ; CHECK-NEXT: [[R:%.*]] = sext i1 [[R_V]] to i32 |
463 ; CHECK-NEXT: ret i32 [[R]] | 461 ; CHECK-NEXT: ret i32 [[R]] |
464 ; | 462 ; |
465 %cca = icmp sgt i32 %a, 0 | 463 %cca = icmp sgt i32 %a, 0 |
466 %ccax = sext i1 %cca to i32 | 464 %ccax = sext i1 %cca to i32 |
467 %ccb = icmp sgt i32 %b, 0 | 465 %ccb = icmp sgt i32 %b, 0 |
471 ret i32 %r | 469 ret i32 %r |
472 } | 470 } |
473 | 471 |
474 define <2 x i32> @test_vectors_sext(<2 x i1> %cca, <2 x i1> %ccb) { | 472 define <2 x i32> @test_vectors_sext(<2 x i1> %cca, <2 x i1> %ccb) { |
475 ; CHECK-LABEL: @test_vectors_sext( | 473 ; CHECK-LABEL: @test_vectors_sext( |
476 ; CHECK-NEXT: [[FOLD_R:%.*]] = and <2 x i1> %ccb, %cca | 474 ; CHECK-NEXT: [[NARROW:%.*]] = and <2 x i1> [[CCB:%.*]], [[CCA:%.*]] |
477 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[FOLD_R]] to <2 x i32> | 475 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[NARROW]] to <2 x i32> |
478 ; CHECK-NEXT: ret <2 x i32> [[R]] | 476 ; CHECK-NEXT: ret <2 x i32> [[R]] |
479 ; | 477 ; |
480 %ccax = sext <2 x i1> %cca to <2 x i32> | 478 %ccax = sext <2 x i1> %cca to <2 x i32> |
481 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> | 479 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> |
482 ret <2 x i32> %r | 480 ret <2 x i32> %r |
483 } | 481 } |
484 | 482 |
485 define <2 x i32> @test_vectors_sext_nonsplat(<2 x i1> %cca, <2 x i1> %ccb) { | 483 define <2 x i32> @test_vectors_sext_nonsplat(<2 x i1> %cca, <2 x i1> %ccb) { |
486 ; CHECK-LABEL: @test_vectors_sext_nonsplat( | 484 ; CHECK-LABEL: @test_vectors_sext_nonsplat( |
487 ; CHECK-NEXT: [[NARROW:%.*]] = select <2 x i1> %ccb, <2 x i1> %cca, <2 x i1> <i1 false, i1 true> | 485 ; CHECK-NEXT: [[NARROW:%.*]] = select <2 x i1> [[CCB:%.*]], <2 x i1> [[CCA:%.*]], <2 x i1> <i1 false, i1 true> |
488 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[NARROW]] to <2 x i32> | 486 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[NARROW]] to <2 x i32> |
489 ; CHECK-NEXT: ret <2 x i32> [[R]] | 487 ; CHECK-NEXT: ret <2 x i32> [[R]] |
490 ; | 488 ; |
491 %ccax = sext <2 x i1> %cca to <2 x i32> | 489 %ccax = sext <2 x i1> %cca to <2 x i32> |
492 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 -1> | 490 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 -1> |
493 ret <2 x i32> %r | 491 ret <2 x i32> %r |
494 } | 492 } |
495 | 493 |
496 define <2 x i32> @test_vectors_zext(<2 x i1> %cca, <2 x i1> %ccb) { | 494 define <2 x i32> @test_vectors_zext(<2 x i1> %cca, <2 x i1> %ccb) { |
497 ; CHECK-LABEL: @test_vectors_zext( | 495 ; CHECK-LABEL: @test_vectors_zext( |
498 ; CHECK-NEXT: [[FOLD_R:%.*]] = and <2 x i1> %ccb, %cca | 496 ; CHECK-NEXT: [[NARROW:%.*]] = and <2 x i1> [[CCB:%.*]], [[CCA:%.*]] |
499 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[FOLD_R]] to <2 x i32> | 497 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[NARROW]] to <2 x i32> |
500 ; CHECK-NEXT: ret <2 x i32> [[R]] | 498 ; CHECK-NEXT: ret <2 x i32> [[R]] |
501 ; | 499 ; |
502 %ccax = zext <2 x i1> %cca to <2 x i32> | 500 %ccax = zext <2 x i1> %cca to <2 x i32> |
503 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> | 501 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> |
504 ret <2 x i32> %r | 502 ret <2 x i32> %r |
505 } | 503 } |
506 | 504 |
507 define <2 x i32> @test_vectors_zext_nonsplat(<2 x i1> %cca, <2 x i1> %ccb) { | 505 define <2 x i32> @test_vectors_zext_nonsplat(<2 x i1> %cca, <2 x i1> %ccb) { |
508 ; CHECK-LABEL: @test_vectors_zext_nonsplat( | 506 ; CHECK-LABEL: @test_vectors_zext_nonsplat( |
509 ; CHECK-NEXT: [[NARROW:%.*]] = select <2 x i1> %ccb, <2 x i1> %cca, <2 x i1> <i1 true, i1 false> | 507 ; CHECK-NEXT: [[NARROW:%.*]] = select <2 x i1> [[CCB:%.*]], <2 x i1> [[CCA:%.*]], <2 x i1> <i1 true, i1 false> |
510 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[NARROW]] to <2 x i32> | 508 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[NARROW]] to <2 x i32> |
511 ; CHECK-NEXT: ret <2 x i32> [[R]] | 509 ; CHECK-NEXT: ret <2 x i32> [[R]] |
512 ; | 510 ; |
513 %ccax = zext <2 x i1> %cca to <2 x i32> | 511 %ccax = zext <2 x i1> %cca to <2 x i32> |
514 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 1, i32 0> | 512 %r = select <2 x i1> %ccb, <2 x i32> %ccax, <2 x i32> <i32 1, i32 0> |
515 ret <2 x i32> %r | 513 ret <2 x i32> %r |
516 } | 514 } |
517 | 515 |
518 define <2 x i32> @scalar_select_of_vectors_sext(<2 x i1> %cca, i1 %ccb) { | 516 define <2 x i32> @scalar_select_of_vectors_sext(<2 x i1> %cca, i1 %ccb) { |
519 ; CHECK-LABEL: @scalar_select_of_vectors_sext( | 517 ; CHECK-LABEL: @scalar_select_of_vectors_sext( |
520 ; CHECK-NEXT: [[FOLD_R:%.*]] = select i1 %ccb, <2 x i1> %cca, <2 x i1> zeroinitializer | 518 ; CHECK-NEXT: [[NARROW:%.*]] = select i1 [[CCB:%.*]], <2 x i1> [[CCA:%.*]], <2 x i1> zeroinitializer |
521 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[FOLD_R]] to <2 x i32> | 519 ; CHECK-NEXT: [[R:%.*]] = sext <2 x i1> [[NARROW]] to <2 x i32> |
522 ; CHECK-NEXT: ret <2 x i32> [[R]] | 520 ; CHECK-NEXT: ret <2 x i32> [[R]] |
523 ; | 521 ; |
524 %ccax = sext <2 x i1> %cca to <2 x i32> | 522 %ccax = sext <2 x i1> %cca to <2 x i32> |
525 %r = select i1 %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> | 523 %r = select i1 %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> |
526 ret <2 x i32> %r | 524 ret <2 x i32> %r |
527 } | 525 } |
528 | 526 |
529 define <2 x i32> @scalar_select_of_vectors_zext(<2 x i1> %cca, i1 %ccb) { | 527 define <2 x i32> @scalar_select_of_vectors_zext(<2 x i1> %cca, i1 %ccb) { |
530 ; CHECK-LABEL: @scalar_select_of_vectors_zext( | 528 ; CHECK-LABEL: @scalar_select_of_vectors_zext( |
531 ; CHECK-NEXT: [[FOLD_R:%.*]] = select i1 %ccb, <2 x i1> %cca, <2 x i1> zeroinitializer | 529 ; CHECK-NEXT: [[NARROW:%.*]] = select i1 [[CCB:%.*]], <2 x i1> [[CCA:%.*]], <2 x i1> zeroinitializer |
532 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[FOLD_R]] to <2 x i32> | 530 ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[NARROW]] to <2 x i32> |
533 ; CHECK-NEXT: ret <2 x i32> [[R]] | 531 ; CHECK-NEXT: ret <2 x i32> [[R]] |
534 ; | 532 ; |
535 %ccax = zext <2 x i1> %cca to <2 x i32> | 533 %ccax = zext <2 x i1> %cca to <2 x i32> |
536 %r = select i1 %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> | 534 %r = select i1 %ccb, <2 x i32> %ccax, <2 x i32> <i32 0, i32 0> |
537 ret <2 x i32> %r | 535 ret <2 x i32> %r |
538 } | 536 } |
539 | 537 |
540 define i32 @sext_true_val_must_be_all_ones(i1 %x) { | 538 define i32 @sext_true_val_must_be_all_ones(i1 %x) { |
541 ; CHECK-LABEL: @sext_true_val_must_be_all_ones( | 539 ; CHECK-LABEL: @sext_true_val_must_be_all_ones( |
542 ; CHECK-NEXT: [[SEL:%.*]] = select i1 %x, i32 -1, i32 42, !prof !0 | 540 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X:%.*]], i32 -1, i32 42, !prof !0 |
543 ; CHECK-NEXT: ret i32 [[SEL]] | 541 ; CHECK-NEXT: ret i32 [[SEL]] |
544 ; | 542 ; |
545 %ext = sext i1 %x to i32 | 543 %ext = sext i1 %x to i32 |
546 %sel = select i1 %x, i32 %ext, i32 42, !prof !0 | 544 %sel = select i1 %x, i32 %ext, i32 42, !prof !0 |
547 ret i32 %sel | 545 ret i32 %sel |
548 } | 546 } |
549 | 547 |
550 define <2 x i32> @sext_true_val_must_be_all_ones_vec(<2 x i1> %x) { | 548 define <2 x i32> @sext_true_val_must_be_all_ones_vec(<2 x i1> %x) { |
551 ; CHECK-LABEL: @sext_true_val_must_be_all_ones_vec( | 549 ; CHECK-LABEL: @sext_true_val_must_be_all_ones_vec( |
552 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> %x, <2 x i32> <i32 -1, i32 -1>, <2 x i32> <i32 42, i32 12>, !prof !0 | 550 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[X:%.*]], <2 x i32> <i32 -1, i32 -1>, <2 x i32> <i32 42, i32 12>, !prof !0 |
553 ; CHECK-NEXT: ret <2 x i32> [[SEL]] | 551 ; CHECK-NEXT: ret <2 x i32> [[SEL]] |
554 ; | 552 ; |
555 %ext = sext <2 x i1> %x to <2 x i32> | 553 %ext = sext <2 x i1> %x to <2 x i32> |
556 %sel = select <2 x i1> %x, <2 x i32> %ext, <2 x i32> <i32 42, i32 12>, !prof !0 | 554 %sel = select <2 x i1> %x, <2 x i32> %ext, <2 x i32> <i32 42, i32 12>, !prof !0 |
557 ret <2 x i32> %sel | 555 ret <2 x i32> %sel |
558 } | 556 } |
559 | 557 |
560 define i32 @zext_true_val_must_be_one(i1 %x) { | 558 define i32 @zext_true_val_must_be_one(i1 %x) { |
561 ; CHECK-LABEL: @zext_true_val_must_be_one( | 559 ; CHECK-LABEL: @zext_true_val_must_be_one( |
562 ; CHECK-NEXT: [[SEL:%.*]] = select i1 %x, i32 1, i32 42, !prof !0 | 560 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X:%.*]], i32 1, i32 42, !prof !0 |
563 ; CHECK-NEXT: ret i32 [[SEL]] | 561 ; CHECK-NEXT: ret i32 [[SEL]] |
564 ; | 562 ; |
565 %ext = zext i1 %x to i32 | 563 %ext = zext i1 %x to i32 |
566 %sel = select i1 %x, i32 %ext, i32 42, !prof !0 | 564 %sel = select i1 %x, i32 %ext, i32 42, !prof !0 |
567 ret i32 %sel | 565 ret i32 %sel |
568 } | 566 } |
569 | 567 |
570 define <2 x i32> @zext_true_val_must_be_one_vec(<2 x i1> %x) { | 568 define <2 x i32> @zext_true_val_must_be_one_vec(<2 x i1> %x) { |
571 ; CHECK-LABEL: @zext_true_val_must_be_one_vec( | 569 ; CHECK-LABEL: @zext_true_val_must_be_one_vec( |
572 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> %x, <2 x i32> <i32 1, i32 1>, <2 x i32> <i32 42, i32 12>, !prof !0 | 570 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[X:%.*]], <2 x i32> <i32 1, i32 1>, <2 x i32> <i32 42, i32 12>, !prof !0 |
573 ; CHECK-NEXT: ret <2 x i32> [[SEL]] | 571 ; CHECK-NEXT: ret <2 x i32> [[SEL]] |
574 ; | 572 ; |
575 %ext = zext <2 x i1> %x to <2 x i32> | 573 %ext = zext <2 x i1> %x to <2 x i32> |
576 %sel = select <2 x i1> %x, <2 x i32> %ext, <2 x i32> <i32 42, i32 12>, !prof !0 | 574 %sel = select <2 x i1> %x, <2 x i32> %ext, <2 x i32> <i32 42, i32 12>, !prof !0 |
577 ret <2 x i32> %sel | 575 ret <2 x i32> %sel |
578 } | 576 } |
579 | 577 |
580 define i32 @sext_false_val_must_be_zero(i1 %x) { | 578 define i32 @sext_false_val_must_be_zero(i1 %x) { |
581 ; CHECK-LABEL: @sext_false_val_must_be_zero( | 579 ; CHECK-LABEL: @sext_false_val_must_be_zero( |
582 ; CHECK-NEXT: [[SEL:%.*]] = select i1 %x, i32 42, i32 0, !prof !0 | 580 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X:%.*]], i32 42, i32 0, !prof !0 |
583 ; CHECK-NEXT: ret i32 [[SEL]] | 581 ; CHECK-NEXT: ret i32 [[SEL]] |
584 ; | 582 ; |
585 %ext = sext i1 %x to i32 | 583 %ext = sext i1 %x to i32 |
586 %sel = select i1 %x, i32 42, i32 %ext, !prof !0 | 584 %sel = select i1 %x, i32 42, i32 %ext, !prof !0 |
587 ret i32 %sel | 585 ret i32 %sel |
588 } | 586 } |
589 | 587 |
590 define <2 x i32> @sext_false_val_must_be_zero_vec(<2 x i1> %x) { | 588 define <2 x i32> @sext_false_val_must_be_zero_vec(<2 x i1> %x) { |
591 ; CHECK-LABEL: @sext_false_val_must_be_zero_vec( | 589 ; CHECK-LABEL: @sext_false_val_must_be_zero_vec( |
592 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> zeroinitializer, !prof !0 | 590 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[X:%.*]], <2 x i32> <i32 42, i32 12>, <2 x i32> zeroinitializer, !prof !0 |
593 ; CHECK-NEXT: ret <2 x i32> [[SEL]] | 591 ; CHECK-NEXT: ret <2 x i32> [[SEL]] |
594 ; | 592 ; |
595 %ext = sext <2 x i1> %x to <2 x i32> | 593 %ext = sext <2 x i1> %x to <2 x i32> |
596 %sel = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> %ext, !prof !0 | 594 %sel = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> %ext, !prof !0 |
597 ret <2 x i32> %sel | 595 ret <2 x i32> %sel |
598 } | 596 } |
599 | 597 |
600 define i32 @zext_false_val_must_be_zero(i1 %x) { | 598 define i32 @zext_false_val_must_be_zero(i1 %x) { |
601 ; CHECK-LABEL: @zext_false_val_must_be_zero( | 599 ; CHECK-LABEL: @zext_false_val_must_be_zero( |
602 ; CHECK-NEXT: [[SEL:%.*]] = select i1 %x, i32 42, i32 0, !prof !0 | 600 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[X:%.*]], i32 42, i32 0, !prof !0 |
603 ; CHECK-NEXT: ret i32 [[SEL]] | 601 ; CHECK-NEXT: ret i32 [[SEL]] |
604 ; | 602 ; |
605 %ext = zext i1 %x to i32 | 603 %ext = zext i1 %x to i32 |
606 %sel = select i1 %x, i32 42, i32 %ext, !prof !0 | 604 %sel = select i1 %x, i32 42, i32 %ext, !prof !0 |
607 ret i32 %sel | 605 ret i32 %sel |
608 } | 606 } |
609 | 607 |
610 define <2 x i32> @zext_false_val_must_be_zero_vec(<2 x i1> %x) { | 608 define <2 x i32> @zext_false_val_must_be_zero_vec(<2 x i1> %x) { |
611 ; CHECK-LABEL: @zext_false_val_must_be_zero_vec( | 609 ; CHECK-LABEL: @zext_false_val_must_be_zero_vec( |
612 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> zeroinitializer, !prof !0 | 610 ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[X:%.*]], <2 x i32> <i32 42, i32 12>, <2 x i32> zeroinitializer, !prof !0 |
613 ; CHECK-NEXT: ret <2 x i32> [[SEL]] | 611 ; CHECK-NEXT: ret <2 x i32> [[SEL]] |
614 ; | 612 ; |
615 %ext = zext <2 x i1> %x to <2 x i32> | 613 %ext = zext <2 x i1> %x to <2 x i32> |
616 %sel = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> %ext, !prof !0 | 614 %sel = select <2 x i1> %x, <2 x i32> <i32 42, i32 12>, <2 x i32> %ext, !prof !0 |
617 ret <2 x i32> %sel | 615 ret <2 x i32> %sel |