1 //===- 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" 16 using namespace llvm; 17 18 /// CheapToScalarize - Return true if the value is cheaper to scalarize than it 19 /// is to leave as a vector operation. 20 static 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 56 /// getShuffleMask - Read and decode a shufflevector mask. 57 /// Turn undef elements into negative values. 58 static std::vector<int> getShuffleMask(const ShuffleVectorInst *SVI) { 59 unsigned NElts = SVI->getType()->getNumElements(); 60 if (isa<ConstantAggregateZero>(SVI->getOperand(2))) 61 return std::vector<int>(NElts, 0); 62 if (isa<UndefValue>(SVI->getOperand(2))) 63 return std::vector<int>(NElts, -1); 64 65 std::vector<int> Result; 66 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)) 69 Result.push_back(-1); // undef 70 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. 78 static Value *FindScalarElement(Value *V, unsigned EltNo) { 79 assert(V->getType()->isVectorTy() && "Not looking at a vector?"); 80 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()); 87 if (isa<ConstantAggregateZero>(V)) 88 return Constant::getNullValue(PTy->getElementType()); 89 if (ConstantVector *CP = dyn_cast<ConstantVector>(V)) 90 return CP->getOperand(EltNo); 91 92 if (InsertElementInst *III = dyn_cast<InsertElementInst>(V)) { 93 // 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); 106 } 107 108 if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(V)) { 109 unsigned LHSWidth = 110 cast<VectorType>(SVI->getOperand(0)->getType())->getNumElements(); 111 int InEl = getShuffleMask(SVI)[EltNo]; 112 if (InEl < 0) 113 return UndefValue::get(PTy->getElementType()); 114 if (InEl < (int)LHSWidth) 115 return FindScalarElement(SVI->getOperand(0), InEl); 116 return FindScalarElement(SVI->getOperand(1), InEl - LHSWidth); 117 } 118 119 // Otherwise, we don't know. 120 return 0; 121 } 122 123 Instruction *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); 162 APInt DemandedMask(VectorWidth, 0); 163 DemandedMask.setBit(IndexVal); 164 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 (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))) { 215 int SrcIdx = getShuffleMask(SVI)[Elt->getZExtValue()]; 216 Value *Src; 217 unsigned LHSWidth = 218 cast<VectorType>(SVI->getOperand(0)->getType())->getNumElements(); 219 220 if (SrcIdx < 0) 221 return ReplaceInstUsesWith(EI, UndefValue::get(EI.getType())); 222 if (SrcIdx < (int)LHSWidth) 223 Src = SVI->getOperand(0); 224 else { 225 SrcIdx -= LHSWidth; 226 Src = SVI->getOperand(1); 227 } 228 Type *Int32Ty = Type::getInt32Ty(EI.getContext()); 229 return ExtractElementInst::Create(Src, 230 ConstantInt::get(Int32Ty, 231 SrcIdx, false)); 232 } 233 } else if (CastInst *CI = dyn_cast<CastInst>(I)) { 234 // Canonicalize extractelement(cast) -> cast(extractelement) 235 // bitcasts can change the number of vector elements and they cost nothing 236 if (CI->hasOneUse() && EI.hasOneUse() && 237 (CI->getOpcode() != Instruction::BitCast)) { 238 Value *EE = Builder->CreateExtractElement(CI->getOperand(0), 239 EI.getIndexOperand()); 240 return CastInst::Create(CI->getOpcode(), EE, EI.getType()); 241 } 242 } 243 } 244 return 0; 245 } 246 247 /// CollectSingleShuffleElements - If V is a shuffle of values that ONLY returns 248 /// elements from either LHS or RHS, return the shuffle mask and true. 249 /// Otherwise, return false. 250 static bool CollectSingleShuffleElements(Value *V, Value *LHS, Value *RHS, 251 std::vector<Constant*> &Mask) { 252 assert(V->getType() == LHS->getType() && V->getType() == RHS->getType() && 253 "Invalid CollectSingleShuffleElements"); 254 unsigned NumElts = cast<VectorType>(V->getType())->getNumElements(); 255 256 if (isa<UndefValue>(V)) { 257 Mask.assign(NumElts, UndefValue::get(Type::getInt32Ty(V->getContext()))); 258 return true; 259 } 260 261 if (V == LHS) { 262 for (unsigned i = 0; i != NumElts; ++i) 263 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()), i)); 264 return true; 265 } 266 267 if (V == RHS) { 268 for (unsigned i = 0; i != NumElts; ++i) 269 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()), 270 i+NumElts)); 271 return true; 272 } 273 274 if (InsertElementInst *IEI = dyn_cast<InsertElementInst>(V)) { 275 // If this is an insert of an extract from some other vector, include it. 276 Value *VecOp = IEI->getOperand(0); 277 Value *ScalarOp = IEI->getOperand(1); 278 Value *IdxOp = IEI->getOperand(2); 279 280 if (!isa<ConstantInt>(IdxOp)) 281 return false; 282 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue(); 283 284 if (isa<UndefValue>(ScalarOp)) { // inserting undef into vector. 285 // Okay, we can handle this if the vector we are insertinting into is 286 // transitively ok. 287 if (CollectSingleShuffleElements(VecOp, LHS, RHS, Mask)) { 288 // If so, update the mask to reflect the inserted undef. 289 Mask[InsertedIdx] = UndefValue::get(Type::getInt32Ty(V->getContext())); 290 return true; 291 } 292 } else if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)){ 293 if (isa<ConstantInt>(EI->getOperand(1)) && 294 EI->getOperand(0)->getType() == V->getType()) { 295 unsigned ExtractedIdx = 296 cast<ConstantInt>(EI->getOperand(1))->getZExtValue(); 297 298 // This must be extracting from either LHS or RHS. 299 if (EI->getOperand(0) == LHS || EI->getOperand(0) == RHS) { 300 // Okay, we can handle this if the vector we are insertinting into is 301 // transitively ok. 302 if (CollectSingleShuffleElements(VecOp, LHS, RHS, Mask)) { 303 // If so, update the mask to reflect the inserted value. 304 if (EI->getOperand(0) == LHS) { 305 Mask[InsertedIdx % NumElts] = 306 ConstantInt::get(Type::getInt32Ty(V->getContext()), 307 ExtractedIdx); 308 } else { 309 assert(EI->getOperand(0) == RHS); 310 Mask[InsertedIdx % NumElts] = 311 ConstantInt::get(Type::getInt32Ty(V->getContext()), 312 ExtractedIdx+NumElts); 313 } 314 return true; 315 } 316 } 317 } 318 } 319 } 320 // TODO: Handle shufflevector here! 321 322 return false; 323 } 324 325 /// CollectShuffleElements - We are building a shuffle of V, using RHS as the 326 /// RHS of the shuffle instruction, if it is not null. Return a shuffle mask 327 /// that computes V and the LHS value of the shuffle. 328 static Value *CollectShuffleElements(Value *V, std::vector<Constant*> &Mask, 329 Value *&RHS) { 330 assert(V->getType()->isVectorTy() && 331 (RHS == 0 || V->getType() == RHS->getType()) && 332 "Invalid shuffle!"); 333 unsigned NumElts = cast<VectorType>(V->getType())->getNumElements(); 334 335 if (isa<UndefValue>(V)) { 336 Mask.assign(NumElts, UndefValue::get(Type::getInt32Ty(V->getContext()))); 337 return V; 338 } else if (isa<ConstantAggregateZero>(V)) { 339 Mask.assign(NumElts, ConstantInt::get(Type::getInt32Ty(V->getContext()),0)); 340 return V; 341 } else if (InsertElementInst *IEI = dyn_cast<InsertElementInst>(V)) { 342 // If this is an insert of an extract from some other vector, include it. 343 Value *VecOp = IEI->getOperand(0); 344 Value *ScalarOp = IEI->getOperand(1); 345 Value *IdxOp = IEI->getOperand(2); 346 347 if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) { 348 if (isa<ConstantInt>(EI->getOperand(1)) && isa<ConstantInt>(IdxOp) && 349 EI->getOperand(0)->getType() == V->getType()) { 350 unsigned ExtractedIdx = 351 cast<ConstantInt>(EI->getOperand(1))->getZExtValue(); 352 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue(); 353 354 // Either the extracted from or inserted into vector must be RHSVec, 355 // otherwise we'd end up with a shuffle of three inputs. 356 if (EI->getOperand(0) == RHS || RHS == 0) { 357 RHS = EI->getOperand(0); 358 Value *V = CollectShuffleElements(VecOp, Mask, RHS); 359 Mask[InsertedIdx % NumElts] = 360 ConstantInt::get(Type::getInt32Ty(V->getContext()), 361 NumElts+ExtractedIdx); 362 return V; 363 } 364 365 if (VecOp == RHS) { 366 Value *V = CollectShuffleElements(EI->getOperand(0), Mask, RHS); 367 // Everything but the extracted element is replaced with the RHS. 368 for (unsigned i = 0; i != NumElts; ++i) { 369 if (i != InsertedIdx) 370 Mask[i] = ConstantInt::get(Type::getInt32Ty(V->getContext()), 371 NumElts+i); 372 } 373 return V; 374 } 375 376 // If this insertelement is a chain that comes from exactly these two 377 // vectors, return the vector and the effective shuffle. 378 if (CollectSingleShuffleElements(IEI, EI->getOperand(0), RHS, Mask)) 379 return EI->getOperand(0); 380 } 381 } 382 } 383 // TODO: Handle shufflevector here! 384 385 // Otherwise, can't do anything fancy. Return an identity vector. 386 for (unsigned i = 0; i != NumElts; ++i) 387 Mask.push_back(ConstantInt::get(Type::getInt32Ty(V->getContext()), i)); 388 return V; 389 } 390 391 Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) { 392 Value *VecOp = IE.getOperand(0); 393 Value *ScalarOp = IE.getOperand(1); 394 Value *IdxOp = IE.getOperand(2); 395 396 // Inserting an undef or into an undefined place, remove this. 397 if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp)) 398 ReplaceInstUsesWith(IE, VecOp); 399 400 // If the inserted element was extracted from some other vector, and if the 401 // indexes are constant, try to turn this into a shufflevector operation. 402 if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) { 403 if (isa<ConstantInt>(EI->getOperand(1)) && isa<ConstantInt>(IdxOp) && 404 EI->getOperand(0)->getType() == IE.getType()) { 405 unsigned NumVectorElts = IE.getType()->getNumElements(); 406 unsigned ExtractedIdx = 407 cast<ConstantInt>(EI->getOperand(1))->getZExtValue(); 408 unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue(); 409 410 if (ExtractedIdx >= NumVectorElts) // Out of range extract. 411 return ReplaceInstUsesWith(IE, VecOp); 412 413 if (InsertedIdx >= NumVectorElts) // Out of range insert. 414 return ReplaceInstUsesWith(IE, UndefValue::get(IE.getType())); 415 416 // If we are extracting a value from a vector, then inserting it right 417 // back into the same place, just use the input vector. 418 if (EI->getOperand(0) == VecOp && ExtractedIdx == InsertedIdx) 419 return ReplaceInstUsesWith(IE, VecOp); 420 421 // If this insertelement isn't used by some other insertelement, turn it 422 // (and any insertelements it points to), into one big shuffle. 423 if (!IE.hasOneUse() || !isa<InsertElementInst>(IE.use_back())) { 424 std::vector<Constant*> Mask; 425 Value *RHS = 0; 426 Value *LHS = CollectShuffleElements(&IE, Mask, RHS); 427 if (RHS == 0) RHS = UndefValue::get(LHS->getType()); 428 // We now have a shuffle of LHS, RHS, Mask. 429 return new ShuffleVectorInst(LHS, RHS, ConstantVector::get(Mask)); 430 } 431 } 432 } 433 434 unsigned VWidth = cast<VectorType>(VecOp->getType())->getNumElements(); 435 APInt UndefElts(VWidth, 0); 436 APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth)); 437 if (Value *V = SimplifyDemandedVectorElts(&IE, AllOnesEltMask, UndefElts)) { 438 if (V != &IE) 439 return ReplaceInstUsesWith(IE, V); 440 return &IE; 441 } 442 443 return 0; 444 } 445 446 447 Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) { 448 Value *LHS = SVI.getOperand(0); 449 Value *RHS = SVI.getOperand(1); 450 std::vector<int> Mask = getShuffleMask(&SVI); 451 452 bool MadeChange = false; 453 454 // Undefined shuffle mask -> undefined value. 455 if (isa<UndefValue>(SVI.getOperand(2))) 456 return ReplaceInstUsesWith(SVI, UndefValue::get(SVI.getType())); 457 458 unsigned VWidth = cast<VectorType>(SVI.getType())->getNumElements(); 459 460 if (VWidth != cast<VectorType>(LHS->getType())->getNumElements()) 461 return 0; 462 463 APInt UndefElts(VWidth, 0); 464 APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth)); 465 if (Value *V = SimplifyDemandedVectorElts(&SVI, AllOnesEltMask, UndefElts)) { 466 if (V != &SVI) 467 return ReplaceInstUsesWith(SVI, V); 468 LHS = SVI.getOperand(0); 469 RHS = SVI.getOperand(1); 470 MadeChange = true; 471 } 472 473 // Canonicalize shuffle(x ,x,mask) -> shuffle(x, undef,mask') 474 // Canonicalize shuffle(undef,x,mask) -> shuffle(x, undef,mask'). 475 if (LHS == RHS || isa<UndefValue>(LHS)) { 476 if (isa<UndefValue>(LHS) && LHS == RHS) { 477 // shuffle(undef,undef,mask) -> undef. 478 return ReplaceInstUsesWith(SVI, LHS); 479 } 480 481 // Remap any references to RHS to use LHS. 482 std::vector<Constant*> Elts; 483 for (unsigned i = 0, e = Mask.size(); i != e; ++i) { 484 if (Mask[i] < 0) 485 Elts.push_back(UndefValue::get(Type::getInt32Ty(SVI.getContext()))); 486 else { 487 if ((Mask[i] >= (int)e && isa<UndefValue>(RHS)) || 488 (Mask[i] < (int)e && isa<UndefValue>(LHS))) { 489 Mask[i] = -1; // Turn into undef. 490 Elts.push_back(UndefValue::get(Type::getInt32Ty(SVI.getContext()))); 491 } else { 492 Mask[i] = Mask[i] % e; // Force to LHS. 493 Elts.push_back(ConstantInt::get(Type::getInt32Ty(SVI.getContext()), 494 Mask[i])); 495 } 496 } 497 } 498 SVI.setOperand(0, SVI.getOperand(1)); 499 SVI.setOperand(1, UndefValue::get(RHS->getType())); 500 SVI.setOperand(2, ConstantVector::get(Elts)); 501 LHS = SVI.getOperand(0); 502 RHS = SVI.getOperand(1); 503 MadeChange = true; 504 } 505 506 // Analyze the shuffle, are the LHS or RHS and identity shuffles? 507 bool isLHSID = true, isRHSID = true; 508 509 for (unsigned i = 0, e = Mask.size(); i != e; ++i) { 510 if (Mask[i] < 0) continue; // Ignore undef values. 511 // Is this an identity shuffle of the LHS value? 512 isLHSID &= (Mask[i] == (int)i); 513 514 // Is this an identity shuffle of the RHS value? 515 isRHSID &= (Mask[i]-e == i); 516 } 517 518 // Eliminate identity shuffles. 519 if (isLHSID) return ReplaceInstUsesWith(SVI, LHS); 520 if (isRHSID) return ReplaceInstUsesWith(SVI, RHS); 521 522 // If the LHS is a shufflevector itself, see if we can combine it with this 523 // one without producing an unusual shuffle. Here we are really conservative: 524 // we are absolutely afraid of producing a shuffle mask not in the input 525 // program, because the code gen may not be smart enough to turn a merged 526 // shuffle into two specific shuffles: it may produce worse code. As such, 527 // we only merge two shuffles if the result is either a splat or one of the 528 // two input shuffle masks. In this case, merging the shuffles just removes 529 // one instruction, which we know is safe. This is good for things like 530 // turning: (splat(splat)) -> splat. 531 if (ShuffleVectorInst *LHSSVI = dyn_cast<ShuffleVectorInst>(LHS)) { 532 if (isa<UndefValue>(RHS)) { 533 std::vector<int> LHSMask = getShuffleMask(LHSSVI); 534 535 if (LHSMask.size() == Mask.size()) { 536 std::vector<int> NewMask; 537 bool isSplat = true; 538 int SplatElt = -1; // undef 539 for (unsigned i = 0, e = Mask.size(); i != e; ++i) { 540 int MaskElt; 541 if (Mask[i] < 0 || Mask[i] >= (int)e) 542 MaskElt = -1; // undef 543 else 544 MaskElt = LHSMask[Mask[i]]; 545 // Check if this could still be a splat. 546 if (MaskElt >= 0) { 547 if (SplatElt >=0 && SplatElt != MaskElt) 548 isSplat = false; 549 SplatElt = MaskElt; 550 } 551 NewMask.push_back(MaskElt); 552 } 553 554 // If the result mask is equal to the src shuffle or this 555 // shuffle mask, do the replacement. 556 if (isSplat || NewMask == LHSMask || NewMask == Mask) { 557 std::vector<Constant*> Elts; 558 Type *Int32Ty = Type::getInt32Ty(SVI.getContext()); 559 for (unsigned i = 0, e = NewMask.size(); i != e; ++i) { 560 if (NewMask[i] < 0) { 561 Elts.push_back(UndefValue::get(Int32Ty)); 562 } else { 563 Elts.push_back(ConstantInt::get(Int32Ty, NewMask[i])); 564 } 565 } 566 return new ShuffleVectorInst(LHSSVI->getOperand(0), 567 LHSSVI->getOperand(1), 568 ConstantVector::get(Elts)); 569 } 570 } 571 } 572 } 573 574 return MadeChange ? &SVI : 0; 575 } 576