blob: 2ebaadba14baf998e13d3cf6019deff3865a412c [file] [log] [blame]
Chris Lattnerec97a902010-01-05 05:36:20 +00001//===- InstCombineVectorOps.cpp -------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements instcombine for ExtractElement, InsertElement and
11// ShuffleVector.
12//
13//===----------------------------------------------------------------------===//
14
15#include "InstCombine.h"
16using namespace llvm;
17
18/// CheapToScalarize - Return true if the value is cheaper to scalarize than it
19/// is to leave as a vector operation.
20static bool CheapToScalarize(Value *V, bool isConstant) {
21 if (isa<ConstantAggregateZero>(V))
22 return true;
23 if (ConstantVector *C = dyn_cast<ConstantVector>(V)) {
24 if (isConstant) return true;
25 // If all elts are the same, we can extract.
26 Constant *Op0 = C->getOperand(0);
27 for (unsigned i = 1; i < C->getNumOperands(); ++i)
28 if (C->getOperand(i) != Op0)
29 return false;
30 return true;
31 }
32 Instruction *I = dyn_cast<Instruction>(V);
33 if (!I) return false;
34
35 // Insert element gets simplified to the inserted element or is deleted if
36 // this is constant idx extract element and its a constant idx insertelt.
37 if (I->getOpcode() == Instruction::InsertElement && isConstant &&
38 isa<ConstantInt>(I->getOperand(2)))
39 return true;
40 if (I->getOpcode() == Instruction::Load && I->hasOneUse())
41 return true;
42 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(I))
43 if (BO->hasOneUse() &&
44 (CheapToScalarize(BO->getOperand(0), isConstant) ||
45 CheapToScalarize(BO->getOperand(1), isConstant)))
46 return true;
47 if (CmpInst *CI = dyn_cast<CmpInst>(I))
48 if (CI->hasOneUse() &&
49 (CheapToScalarize(CI->getOperand(0), isConstant) ||
50 CheapToScalarize(CI->getOperand(1), isConstant)))
51 return true;
52
53 return false;
54}
55
Bob Wilson11ee4562010-10-29 22:03:05 +000056/// getShuffleMask - Read and decode a shufflevector mask.
57/// Turn undef elements into negative values.
58static std::vector<int> getShuffleMask(const ShuffleVectorInst *SVI) {
Chris Lattnerec97a902010-01-05 05:36:20 +000059 unsigned NElts = SVI->getType()->getNumElements();
60 if (isa<ConstantAggregateZero>(SVI->getOperand(2)))
Bob Wilson11ee4562010-10-29 22:03:05 +000061 return std::vector<int>(NElts, 0);
Chris Lattnerec97a902010-01-05 05:36:20 +000062 if (isa<UndefValue>(SVI->getOperand(2)))
Bob Wilson11ee4562010-10-29 22:03:05 +000063 return std::vector<int>(NElts, -1);
Chris Lattnerec97a902010-01-05 05:36:20 +000064
Bob Wilson11ee4562010-10-29 22:03:05 +000065 std::vector<int> Result;
Chris Lattnerec97a902010-01-05 05:36:20 +000066 const ConstantVector *CP = cast<ConstantVector>(SVI->getOperand(2));
67 for (User::const_op_iterator i = CP->op_begin(), e = CP->op_end(); i!=e; ++i)
68 if (isa<UndefValue>(*i))
Bob Wilson11ee4562010-10-29 22:03:05 +000069 Result.push_back(-1); // undef
Chris Lattnerec97a902010-01-05 05:36:20 +000070 else
71 Result.push_back(cast<ConstantInt>(*i)->getZExtValue());
72 return Result;
73}
74
75/// FindScalarElement - Given a vector and an element number, see if the scalar
76/// value is already around as a register, for example if it were inserted then
77/// extracted from the vector.
78static Value *FindScalarElement(Value *V, unsigned EltNo) {
Duncan Sands19d0b472010-02-16 11:11:14 +000079 assert(V->getType()->isVectorTy() && "Not looking at a vector?");
Chris Lattnerec97a902010-01-05 05:36:20 +000080 const VectorType *PTy = cast<VectorType>(V->getType());
81 unsigned Width = PTy->getNumElements();
82 if (EltNo >= Width) // Out of range access.
83 return UndefValue::get(PTy->getElementType());
84
85 if (isa<UndefValue>(V))
86 return UndefValue::get(PTy->getElementType());
Chris Lattner841af4f2010-01-05 05:42:08 +000087 if (isa<ConstantAggregateZero>(V))
Chris Lattnerec97a902010-01-05 05:36:20 +000088 return Constant::getNullValue(PTy->getElementType());
Chris Lattner841af4f2010-01-05 05:42:08 +000089 if (ConstantVector *CP = dyn_cast<ConstantVector>(V))
Chris Lattnerec97a902010-01-05 05:36:20 +000090 return CP->getOperand(EltNo);
Chris Lattner841af4f2010-01-05 05:42:08 +000091
92 if (InsertElementInst *III = dyn_cast<InsertElementInst>(V)) {
Chris Lattnerec97a902010-01-05 05:36:20 +000093 // If this is an insert to a variable element, we don't know what it is.
94 if (!isa<ConstantInt>(III->getOperand(2)))
95 return 0;
96 unsigned IIElt = cast<ConstantInt>(III->getOperand(2))->getZExtValue();
97
98 // If this is an insert to the element we are looking for, return the
99 // inserted value.
100 if (EltNo == IIElt)
101 return III->getOperand(1);
102
103 // Otherwise, the insertelement doesn't modify the value, recurse on its
104 // vector input.
105 return FindScalarElement(III->getOperand(0), EltNo);
Chris Lattner841af4f2010-01-05 05:42:08 +0000106 }
107
108 if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(V)) {
Chris Lattnerec97a902010-01-05 05:36:20 +0000109 unsigned LHSWidth =
Bob Wilson11ee4562010-10-29 22:03:05 +0000110 cast<VectorType>(SVI->getOperand(0)->getType())->getNumElements();
111 int InEl = getShuffleMask(SVI)[EltNo];
112 if (InEl < 0)
Chris Lattnerec97a902010-01-05 05:36:20 +0000113 return UndefValue::get(PTy->getElementType());
Bob Wilson11ee4562010-10-29 22:03:05 +0000114 if (InEl < (int)LHSWidth)
115 return FindScalarElement(SVI->getOperand(0), InEl);
116 return FindScalarElement(SVI->getOperand(1), InEl - LHSWidth);
Chris Lattnerec97a902010-01-05 05:36:20 +0000117 }
118
119 // Otherwise, we don't know.
120 return 0;
121}
122
123Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
124 // If vector val is undef, replace extract with scalar undef.
125 if (isa<UndefValue>(EI.getOperand(0)))
126 return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType()));
127
128 // If vector val is constant 0, replace extract with scalar 0.
129 if (isa<ConstantAggregateZero>(EI.getOperand(0)))
130 return ReplaceInstUsesWith(EI, Constant::getNullValue(EI.getType()));
131
132 if (ConstantVector *C = dyn_cast<ConstantVector>(EI.getOperand(0))) {
133 // If vector val is constant with all elements the same, replace EI with
134 // that element. When the elements are not identical, we cannot replace yet
135 // (we do that below, but only when the index is constant).
136 Constant *op0 = C->getOperand(0);
137 for (unsigned i = 1; i != C->getNumOperands(); ++i)
138 if (C->getOperand(i) != op0) {
139 op0 = 0;
140 break;
141 }
142 if (op0)
143 return ReplaceInstUsesWith(EI, op0);
144 }
145
146 // If extracting a specified index from the vector, see if we can recursively
147 // find a previously computed scalar that was inserted into the vector.
148 if (ConstantInt *IdxC = dyn_cast<ConstantInt>(EI.getOperand(1))) {
149 unsigned IndexVal = IdxC->getZExtValue();
150 unsigned VectorWidth = EI.getVectorOperandType()->getNumElements();
151
152 // If this is extracting an invalid index, turn this into undef, to avoid
153 // crashing the code below.
154 if (IndexVal >= VectorWidth)
155 return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType()));
156
157 // This instruction only demands the single element from the input vector.
158 // If the input vector has a single use, simplify it based on this use
159 // property.
160 if (EI.getOperand(0)->hasOneUse() && VectorWidth != 1) {
161 APInt UndefElts(VectorWidth, 0);
Chris Lattnerb22423c2010-02-08 23:56:03 +0000162 APInt DemandedMask(VectorWidth, 0);
163 DemandedMask.set(IndexVal);
Chris Lattnerec97a902010-01-05 05:36:20 +0000164 if (Value *V = SimplifyDemandedVectorElts(EI.getOperand(0),
165 DemandedMask, UndefElts)) {
166 EI.setOperand(0, V);
167 return &EI;
168 }
169 }
170
171 if (Value *Elt = FindScalarElement(EI.getOperand(0), IndexVal))
172 return ReplaceInstUsesWith(EI, Elt);
173
174 // If the this extractelement is directly using a bitcast from a vector of
175 // the same number of elements, see if we can find the source element from
176 // it. In this case, we will end up needing to bitcast the scalars.
177 if (BitCastInst *BCI = dyn_cast<BitCastInst>(EI.getOperand(0))) {
178 if (const VectorType *VT =
179 dyn_cast<VectorType>(BCI->getOperand(0)->getType()))
180 if (VT->getNumElements() == VectorWidth)
181 if (Value *Elt = FindScalarElement(BCI->getOperand(0), IndexVal))
182 return new BitCastInst(Elt, EI.getType());
183 }
184 }
185
186 if (Instruction *I = dyn_cast<Instruction>(EI.getOperand(0))) {
187 // Push extractelement into predecessor operation if legal and
188 // profitable to do so
189 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(I)) {
190 if (I->hasOneUse() &&
191 CheapToScalarize(BO, isa<ConstantInt>(EI.getOperand(1)))) {
192 Value *newEI0 =
193 Builder->CreateExtractElement(BO->getOperand(0), EI.getOperand(1),
194 EI.getName()+".lhs");
195 Value *newEI1 =
196 Builder->CreateExtractElement(BO->getOperand(1), EI.getOperand(1),
197 EI.getName()+".rhs");
198 return BinaryOperator::Create(BO->getOpcode(), newEI0, newEI1);
199 }
200 } else if (InsertElementInst *IE = dyn_cast<InsertElementInst>(I)) {
201 // Extracting the inserted element?
202 if (IE->getOperand(2) == EI.getOperand(1))
203 return ReplaceInstUsesWith(EI, IE->getOperand(1));
204 // If the inserted and extracted elements are constants, they must not
205 // be the same value, extract from the pre-inserted value instead.
206 if (isa<Constant>(IE->getOperand(2)) && isa<Constant>(EI.getOperand(1))) {
207 Worklist.AddValue(EI.getOperand(0));
208 EI.setOperand(0, IE->getOperand(0));
209 return &EI;
210 }
211 } else if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I)) {
212 // If this is extracting an element from a shufflevector, figure out where
213 // it came from and extract from the appropriate input element instead.
214 if (ConstantInt *Elt = dyn_cast<ConstantInt>(EI.getOperand(1))) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000215 int SrcIdx = getShuffleMask(SVI)[Elt->getZExtValue()];
Chris Lattnerec97a902010-01-05 05:36:20 +0000216 Value *Src;
217 unsigned LHSWidth =
Bob Wilson11ee4562010-10-29 22:03:05 +0000218 cast<VectorType>(SVI->getOperand(0)->getType())->getNumElements();
Chris Lattnerec97a902010-01-05 05:36:20 +0000219
Bob Wilson11ee4562010-10-29 22:03:05 +0000220 if (SrcIdx < 0)
221 return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType()));
222 if (SrcIdx < (int)LHSWidth)
Chris Lattnerec97a902010-01-05 05:36:20 +0000223 Src = SVI->getOperand(0);
Bob Wilson11ee4562010-10-29 22:03:05 +0000224 else {
Chris Lattnerec97a902010-01-05 05:36:20 +0000225 SrcIdx -= LHSWidth;
226 Src = SVI->getOperand(1);
Chris Lattnerec97a902010-01-05 05:36:20 +0000227 }
228 return ExtractElementInst::Create(Src,
229 ConstantInt::get(Type::getInt32Ty(EI.getContext()),
230 SrcIdx, false));
231 }
232 }
233 // FIXME: Canonicalize extractelement(bitcast) -> bitcast(extractelement)
234 }
235 return 0;
236}
237
238/// CollectSingleShuffleElements - If V is a shuffle of values that ONLY returns
239/// elements from either LHS or RHS, return the shuffle mask and true.
240/// Otherwise, return false.
241static bool CollectSingleShuffleElements(Value *V, Value *LHS, Value *RHS,
242 std::vector<Constant*> &Mask) {
243 assert(V->getType() == LHS->getType() && V->getType() == RHS->getType() &&
244 "Invalid CollectSingleShuffleElements");
245 unsigned NumElts = cast<VectorType>(V->getType())->getNumElements();
246
247 if (isa<UndefValue>(V)) {
248 Mask.assign(NumElts, UndefValue::get(Type::getInt32Ty(V->getContext())));
249 return true;
250 }
251
252 if (V == LHS) {
253 for (unsigned i = 0; i != NumElts; ++i)
254 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()), i));
255 return true;
256 }
257
258 if (V == RHS) {
259 for (unsigned i = 0; i != NumElts; ++i)
260 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()),
261 i+NumElts));
262 return true;
263 }
264
265 if (InsertElementInst *IEI = dyn_cast<InsertElementInst>(V)) {
266 // If this is an insert of an extract from some other vector, include it.
267 Value *VecOp = IEI->getOperand(0);
268 Value *ScalarOp = IEI->getOperand(1);
269 Value *IdxOp = IEI->getOperand(2);
270
271 if (!isa<ConstantInt>(IdxOp))
272 return false;
273 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue();
274
275 if (isa<UndefValue>(ScalarOp)) { // inserting undef into vector.
276 // Okay, we can handle this if the vector we are insertinting into is
277 // transitively ok.
278 if (CollectSingleShuffleElements(VecOp, LHS, RHS, Mask)) {
279 // If so, update the mask to reflect the inserted undef.
280 Mask[InsertedIdx] = UndefValue::get(Type::getInt32Ty(V->getContext()));
281 return true;
282 }
283 } else if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)){
284 if (isa<ConstantInt>(EI->getOperand(1)) &&
285 EI->getOperand(0)->getType() == V->getType()) {
286 unsigned ExtractedIdx =
287 cast<ConstantInt>(EI->getOperand(1))->getZExtValue();
288
289 // This must be extracting from either LHS or RHS.
290 if (EI->getOperand(0) == LHS || EI->getOperand(0) == RHS) {
291 // Okay, we can handle this if the vector we are insertinting into is
292 // transitively ok.
293 if (CollectSingleShuffleElements(VecOp, LHS, RHS, Mask)) {
294 // If so, update the mask to reflect the inserted value.
295 if (EI->getOperand(0) == LHS) {
296 Mask[InsertedIdx % NumElts] =
297 ConstantInt::get(Type::getInt32Ty(V->getContext()),
298 ExtractedIdx);
299 } else {
300 assert(EI->getOperand(0) == RHS);
301 Mask[InsertedIdx % NumElts] =
302 ConstantInt::get(Type::getInt32Ty(V->getContext()),
303 ExtractedIdx+NumElts);
304
305 }
306 return true;
307 }
308 }
309 }
310 }
311 }
312 // TODO: Handle shufflevector here!
313
314 return false;
315}
316
317/// CollectShuffleElements - We are building a shuffle of V, using RHS as the
318/// RHS of the shuffle instruction, if it is not null. Return a shuffle mask
319/// that computes V and the LHS value of the shuffle.
320static Value *CollectShuffleElements(Value *V, std::vector<Constant*> &Mask,
321 Value *&RHS) {
Duncan Sands19d0b472010-02-16 11:11:14 +0000322 assert(V->getType()->isVectorTy() &&
Chris Lattnerec97a902010-01-05 05:36:20 +0000323 (RHS == 0 || V->getType() == RHS->getType()) &&
324 "Invalid shuffle!");
325 unsigned NumElts = cast<VectorType>(V->getType())->getNumElements();
326
327 if (isa<UndefValue>(V)) {
328 Mask.assign(NumElts, UndefValue::get(Type::getInt32Ty(V->getContext())));
329 return V;
330 } else if (isa<ConstantAggregateZero>(V)) {
331 Mask.assign(NumElts, ConstantInt::get(Type::getInt32Ty(V->getContext()),0));
332 return V;
333 } else if (InsertElementInst *IEI = dyn_cast<InsertElementInst>(V)) {
334 // If this is an insert of an extract from some other vector, include it.
335 Value *VecOp = IEI->getOperand(0);
336 Value *ScalarOp = IEI->getOperand(1);
337 Value *IdxOp = IEI->getOperand(2);
338
339 if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) {
340 if (isa<ConstantInt>(EI->getOperand(1)) && isa<ConstantInt>(IdxOp) &&
341 EI->getOperand(0)->getType() == V->getType()) {
342 unsigned ExtractedIdx =
343 cast<ConstantInt>(EI->getOperand(1))->getZExtValue();
344 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue();
345
346 // Either the extracted from or inserted into vector must be RHSVec,
347 // otherwise we'd end up with a shuffle of three inputs.
348 if (EI->getOperand(0) == RHS || RHS == 0) {
349 RHS = EI->getOperand(0);
350 Value *V = CollectShuffleElements(VecOp, Mask, RHS);
351 Mask[InsertedIdx % NumElts] =
352 ConstantInt::get(Type::getInt32Ty(V->getContext()),
353 NumElts+ExtractedIdx);
354 return V;
355 }
356
357 if (VecOp == RHS) {
358 Value *V = CollectShuffleElements(EI->getOperand(0), Mask, RHS);
359 // Everything but the extracted element is replaced with the RHS.
360 for (unsigned i = 0; i != NumElts; ++i) {
361 if (i != InsertedIdx)
362 Mask[i] = ConstantInt::get(Type::getInt32Ty(V->getContext()),
363 NumElts+i);
364 }
365 return V;
366 }
367
368 // If this insertelement is a chain that comes from exactly these two
369 // vectors, return the vector and the effective shuffle.
370 if (CollectSingleShuffleElements(IEI, EI->getOperand(0), RHS, Mask))
371 return EI->getOperand(0);
372 }
373 }
374 }
375 // TODO: Handle shufflevector here!
376
377 // Otherwise, can't do anything fancy. Return an identity vector.
378 for (unsigned i = 0; i != NumElts; ++i)
379 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()), i));
380 return V;
381}
382
383Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) {
384 Value *VecOp = IE.getOperand(0);
385 Value *ScalarOp = IE.getOperand(1);
386 Value *IdxOp = IE.getOperand(2);
387
388 // Inserting an undef or into an undefined place, remove this.
389 if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp))
390 ReplaceInstUsesWith(IE, VecOp);
391
392 // If the inserted element was extracted from some other vector, and if the
393 // indexes are constant, try to turn this into a shufflevector operation.
394 if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) {
395 if (isa<ConstantInt>(EI->getOperand(1)) && isa<ConstantInt>(IdxOp) &&
396 EI->getOperand(0)->getType() == IE.getType()) {
397 unsigned NumVectorElts = IE.getType()->getNumElements();
398 unsigned ExtractedIdx =
399 cast<ConstantInt>(EI->getOperand(1))->getZExtValue();
400 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue();
401
402 if (ExtractedIdx >= NumVectorElts) // Out of range extract.
403 return ReplaceInstUsesWith(IE, VecOp);
404
405 if (InsertedIdx >= NumVectorElts) // Out of range insert.
406 return ReplaceInstUsesWith(IE, UndefValue::get(IE.getType()));
407
408 // If we are extracting a value from a vector, then inserting it right
409 // back into the same place, just use the input vector.
410 if (EI->getOperand(0) == VecOp && ExtractedIdx == InsertedIdx)
411 return ReplaceInstUsesWith(IE, VecOp);
412
413 // If this insertelement isn't used by some other insertelement, turn it
414 // (and any insertelements it points to), into one big shuffle.
415 if (!IE.hasOneUse() || !isa<InsertElementInst>(IE.use_back())) {
416 std::vector<Constant*> Mask;
417 Value *RHS = 0;
418 Value *LHS = CollectShuffleElements(&IE, Mask, RHS);
419 if (RHS == 0) RHS = UndefValue::get(LHS->getType());
420 // We now have a shuffle of LHS, RHS, Mask.
421 return new ShuffleVectorInst(LHS, RHS,
422 ConstantVector::get(Mask));
423 }
424 }
425 }
426
427 unsigned VWidth = cast<VectorType>(VecOp->getType())->getNumElements();
428 APInt UndefElts(VWidth, 0);
429 APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth));
430 if (SimplifyDemandedVectorElts(&IE, AllOnesEltMask, UndefElts))
431 return &IE;
432
433 return 0;
434}
435
436
437Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
438 Value *LHS = SVI.getOperand(0);
439 Value *RHS = SVI.getOperand(1);
Bob Wilson11ee4562010-10-29 22:03:05 +0000440 std::vector<int> Mask = getShuffleMask(&SVI);
Chris Lattnerec97a902010-01-05 05:36:20 +0000441
442 bool MadeChange = false;
443
444 // Undefined shuffle mask -> undefined value.
445 if (isa<UndefValue>(SVI.getOperand(2)))
446 return ReplaceInstUsesWith(SVI, UndefValue::get(SVI.getType()));
447
Eric Christopher51edc7b2010-08-17 22:55:27 +0000448 unsigned VWidth = cast<VectorType>(SVI.getType())->getNumElements();
449
450 if (VWidth != cast<VectorType>(LHS->getType())->getNumElements())
451 return 0;
Chris Lattnerec97a902010-01-05 05:36:20 +0000452
453 APInt UndefElts(VWidth, 0);
454 APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth));
455 if (SimplifyDemandedVectorElts(&SVI, AllOnesEltMask, UndefElts)) {
456 LHS = SVI.getOperand(0);
457 RHS = SVI.getOperand(1);
458 MadeChange = true;
459 }
460
461 // Canonicalize shuffle(x ,x,mask) -> shuffle(x, undef,mask')
462 // Canonicalize shuffle(undef,x,mask) -> shuffle(x, undef,mask').
463 if (LHS == RHS || isa<UndefValue>(LHS)) {
Eric Christopher51edc7b2010-08-17 22:55:27 +0000464 if (isa<UndefValue>(LHS) && LHS == RHS) {
465 // shuffle(undef,undef,mask) -> undef.
466 return ReplaceInstUsesWith(SVI, LHS);
467 }
Chris Lattnerec97a902010-01-05 05:36:20 +0000468
469 // Remap any references to RHS to use LHS.
470 std::vector<Constant*> Elts;
Eric Christopher51edc7b2010-08-17 22:55:27 +0000471 for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000472 if (Mask[i] < 0)
Chris Lattnerec97a902010-01-05 05:36:20 +0000473 Elts.push_back(UndefValue::get(Type::getInt32Ty(SVI.getContext())));
474 else {
Bob Wilson11ee4562010-10-29 22:03:05 +0000475 if ((Mask[i] >= (int)e && isa<UndefValue>(RHS)) ||
476 (Mask[i] < (int)e && isa<UndefValue>(LHS))) {
477 Mask[i] = -1; // Turn into undef.
Chris Lattnerec97a902010-01-05 05:36:20 +0000478 Elts.push_back(UndefValue::get(Type::getInt32Ty(SVI.getContext())));
479 } else {
480 Mask[i] = Mask[i] % e; // Force to LHS.
481 Elts.push_back(ConstantInt::get(Type::getInt32Ty(SVI.getContext()),
482 Mask[i]));
483 }
484 }
485 }
486 SVI.setOperand(0, SVI.getOperand(1));
487 SVI.setOperand(1, UndefValue::get(RHS->getType()));
488 SVI.setOperand(2, ConstantVector::get(Elts));
489 LHS = SVI.getOperand(0);
490 RHS = SVI.getOperand(1);
491 MadeChange = true;
492 }
493
494 // Analyze the shuffle, are the LHS or RHS and identity shuffles?
Eric Christopher51edc7b2010-08-17 22:55:27 +0000495 bool isLHSID = true, isRHSID = true;
496
497 for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000498 if (Mask[i] < 0) continue; // Ignore undef values.
Eric Christopher51edc7b2010-08-17 22:55:27 +0000499 // Is this an identity shuffle of the LHS value?
Bob Wilson11ee4562010-10-29 22:03:05 +0000500 isLHSID &= (Mask[i] == (int)i);
Chris Lattnerec97a902010-01-05 05:36:20 +0000501
Eric Christopher51edc7b2010-08-17 22:55:27 +0000502 // Is this an identity shuffle of the RHS value?
503 isRHSID &= (Mask[i]-e == i);
504 }
505
506 // Eliminate identity shuffles.
507 if (isLHSID) return ReplaceInstUsesWith(SVI, LHS);
508 if (isRHSID) return ReplaceInstUsesWith(SVI, RHS);
509
510 // If the LHS is a shufflevector itself, see if we can combine it with this
511 // one without producing an unusual shuffle. Here we are really conservative:
512 // we are absolutely afraid of producing a shuffle mask not in the input
513 // program, because the code gen may not be smart enough to turn a merged
514 // shuffle into two specific shuffles: it may produce worse code. As such,
Bob Wilsoncb11b482010-10-29 22:02:50 +0000515 // we only merge two shuffles if the result is either a splat or one of the
516 // two input shuffle masks. In this case, merging the shuffles just removes
517 // one instruction, which we know is safe. This is good for things like
518 // turning: (splat(splat)) -> splat.
Eric Christopher51edc7b2010-08-17 22:55:27 +0000519 if (ShuffleVectorInst *LHSSVI = dyn_cast<ShuffleVectorInst>(LHS)) {
520 if (isa<UndefValue>(RHS)) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000521 std::vector<int> LHSMask = getShuffleMask(LHSSVI);
Nate Begeman2a0ca3e92010-08-13 00:17:53 +0000522
Eric Christopher51edc7b2010-08-17 22:55:27 +0000523 if (LHSMask.size() == Mask.size()) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000524 std::vector<int> NewMask;
Bob Wilsoncb11b482010-10-29 22:02:50 +0000525 bool isSplat = true;
Bob Wilson11ee4562010-10-29 22:03:05 +0000526 int SplatElt = -1; // undef
Bob Wilsoncb11b482010-10-29 22:02:50 +0000527 for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000528 int MaskElt;
529 if (Mask[i] < 0 || Mask[i] >= (int)e)
530 MaskElt = -1; // undef
531 else
Bob Wilsoncb11b482010-10-29 22:02:50 +0000532 MaskElt = LHSMask[Mask[i]];
533 // Check if this could still be a splat.
Bob Wilson11ee4562010-10-29 22:03:05 +0000534 if (MaskElt >= 0) {
535 if (SplatElt >=0 && SplatElt != MaskElt)
Bob Wilsoncb11b482010-10-29 22:02:50 +0000536 isSplat = false;
537 SplatElt = MaskElt;
538 }
539 NewMask.push_back(MaskElt);
540 }
Eric Christopher51edc7b2010-08-17 22:55:27 +0000541
542 // If the result mask is equal to the src shuffle or this
543 // shuffle mask, do the replacement.
Bob Wilsoncb11b482010-10-29 22:02:50 +0000544 if (isSplat || NewMask == LHSMask || NewMask == Mask) {
Eric Christopher51edc7b2010-08-17 22:55:27 +0000545 std::vector<Constant*> Elts;
Bob Wilsoncb11b482010-10-29 22:02:50 +0000546 const Type *Int32Ty = Type::getInt32Ty(SVI.getContext());
Eric Christopher51edc7b2010-08-17 22:55:27 +0000547 for (unsigned i = 0, e = NewMask.size(); i != e; ++i) {
Bob Wilson11ee4562010-10-29 22:03:05 +0000548 if (NewMask[i] < 0) {
Bob Wilsoncb11b482010-10-29 22:02:50 +0000549 Elts.push_back(UndefValue::get(Int32Ty));
Eric Christopher51edc7b2010-08-17 22:55:27 +0000550 } else {
Bob Wilsoncb11b482010-10-29 22:02:50 +0000551 Elts.push_back(ConstantInt::get(Int32Ty, NewMask[i]));
Eric Christopher51edc7b2010-08-17 22:55:27 +0000552 }
553 }
554 return new ShuffleVectorInst(LHSSVI->getOperand(0),
555 LHSSVI->getOperand(1),
556 ConstantVector::get(Elts));
Nate Begeman2a0ca3e92010-08-13 00:17:53 +0000557 }
558 }
Nate Begeman2a0ca3e92010-08-13 00:17:53 +0000559 }
560 }
Eric Christopher51edc7b2010-08-17 22:55:27 +0000561
Chris Lattnerec97a902010-01-05 05:36:20 +0000562 return MadeChange ? &SVI : 0;
563}
Eric Christopher51edc7b2010-08-17 22:55:27 +0000564