Fix bug: test/Regression/Transforms/InstCombine/2002-05-14-SubFailure.ll
[oota-llvm.git] / lib / Transforms / Scalar / InstructionCombining.cpp
1 //===- InstructionCombining.cpp - Combine multiple instructions -------------=//
2 //
3 // InstructionCombining - Combine instructions to form fewer, simple
4 //   instructions.  This pass does not modify the CFG, and has a tendancy to
5 //   make instructions dead, so a subsequent DIE pass is useful.  This pass is
6 //   where algebraic simplification happens.
7 //
8 // This pass combines things like:
9 //    %Y = add int 1, %X
10 //    %Z = add int 1, %Y
11 // into:
12 //    %Z = add int 2, %X
13 //
14 // This is a simple worklist driven algorithm.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #include "llvm/Transforms/Scalar.h"
19 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
20 #include "llvm/ConstantHandling.h"
21 #include "llvm/iMemory.h"
22 #include "llvm/iOther.h"
23 #include "llvm/iPHINode.h"
24 #include "llvm/iOperators.h"
25 #include "llvm/Pass.h"
26 #include "llvm/Support/InstIterator.h"
27 #include "llvm/Support/InstVisitor.h"
28 #include "Support/StatisticReporter.h"
29 #include <algorithm>
30
31 static Statistic<> NumCombined("instcombine\t- Number of insts combined");
32
33 namespace {
34   class InstCombiner : public FunctionPass,
35                        public InstVisitor<InstCombiner, Instruction*> {
36     // Worklist of all of the instructions that need to be simplified.
37     std::vector<Instruction*> WorkList;
38
39     void AddUsesToWorkList(Instruction *I) {
40       // The instruction was simplified, add all users of the instruction to
41       // the work lists because they might get more simplified now...
42       //
43       for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
44            UI != UE; ++UI)
45         WorkList.push_back(cast<Instruction>(*UI));
46     }
47
48   public:
49     const char *getPassName() const { return "Instruction Combining"; }
50
51     virtual bool runOnFunction(Function *F);
52
53     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
54       AU.preservesCFG();
55     }
56
57     // Visitation implementation - Implement instruction combining for different
58     // instruction types.  The semantics are as follows:
59     // Return Value:
60     //    null        - No change was made
61     //     I          - Change was made, I is still valid
62     //   otherwise    - Change was made, replace I with returned instruction
63     //   
64     Instruction *visitNot(UnaryOperator *I);
65     Instruction *visitAdd(BinaryOperator *I);
66     Instruction *visitSub(BinaryOperator *I);
67     Instruction *visitMul(BinaryOperator *I);
68     Instruction *visitDiv(BinaryOperator *I);
69     Instruction *visitRem(BinaryOperator *I);
70     Instruction *visitAnd(BinaryOperator *I);
71     Instruction *visitOr (BinaryOperator *I);
72     Instruction *visitXor(BinaryOperator *I);
73     Instruction *visitSetCondInst(BinaryOperator *I);
74     Instruction *visitShiftInst(Instruction *I);
75     Instruction *visitCastInst(CastInst *CI);
76     Instruction *visitPHINode(PHINode *PN);
77     Instruction *visitGetElementPtrInst(GetElementPtrInst *GEP);
78     Instruction *visitMemAccessInst(MemAccessInst *MAI);
79
80     // visitInstruction - Specify what to return for unhandled instructions...
81     Instruction *visitInstruction(Instruction *I) { return 0; }
82   };
83 }
84
85
86 Instruction *InstCombiner::visitNot(UnaryOperator *I) {
87   if (I->use_empty()) return 0;       // Don't fix dead instructions...
88
89   // not (not X) = X
90   if (Instruction *Op = dyn_cast<Instruction>(I->getOperand(0)))
91     if (Op->getOpcode() == Instruction::Not) {
92       AddUsesToWorkList(I);         // Add all modified instrs to worklist
93       I->replaceAllUsesWith(Op->getOperand(0));
94       return I;
95     }
96   return 0;
97 }
98
99
100 // Make sure that this instruction has a constant on the right hand side if it
101 // has any constant arguments.  If not, fix it an return true.
102 //
103 static bool SimplifyBinOp(BinaryOperator *I) {
104   if (isa<Constant>(I->getOperand(0)) && !isa<Constant>(I->getOperand(1)))
105     return !I->swapOperands();
106   return false;
107 }
108
109 // dyn_castNegInst - Given a 'sub' instruction, return the RHS of the
110 // instruction if the LHS is a constant zero (which is the 'negate' form).
111 //
112 static inline Value *dyn_castNegInst(Value *V) {
113   Instruction *I = dyn_cast<Instruction>(V);
114   if (!I || I->getOpcode() != Instruction::Sub) return 0;
115
116   if (I->getOperand(0) == Constant::getNullValue(I->getType()))
117     return I->getOperand(1);
118   return 0;
119 }
120
121 Instruction *InstCombiner::visitAdd(BinaryOperator *I) {
122   if (I->use_empty()) return 0;       // Don't fix dead add instructions...
123   bool Changed = SimplifyBinOp(I);
124   Value *LHS = I->getOperand(0), *RHS = I->getOperand(1);
125
126   // Eliminate 'add int %X, 0'
127   if (I->getType()->isIntegral() &&
128       RHS == Constant::getNullValue(I->getType())) {
129     AddUsesToWorkList(I);         // Add all modified instrs to worklist
130     I->replaceAllUsesWith(LHS);
131     return I;
132   }
133
134   // -A + B  -->  B - A
135   if (Value *V = dyn_castNegInst(LHS))
136     return BinaryOperator::create(Instruction::Sub, RHS, V);
137
138   // A + -B  -->  A - B
139   if (Value *V = dyn_castNegInst(RHS))
140     return BinaryOperator::create(Instruction::Sub, LHS, V);
141
142   // Simplify add instructions with a constant RHS...
143   if (Constant *Op2 = dyn_cast<Constant>(RHS)) {
144     if (BinaryOperator *ILHS = dyn_cast<BinaryOperator>(LHS)) {
145       if (ILHS->getOpcode() == Instruction::Add &&
146           isa<Constant>(ILHS->getOperand(1))) {
147         // Fold:
148         //    %Y = add int %X, 1
149         //    %Z = add int %Y, 1
150         // into:
151         //    %Z = add int %X, 2
152         //
153         if (Constant *Val = *Op2 + *cast<Constant>(ILHS->getOperand(1))) {
154           I->setOperand(0, ILHS->getOperand(0));
155           I->setOperand(1, Val);
156           return I;
157         }
158       }
159     }
160   }
161
162   return Changed ? I : 0;
163 }
164
165 Instruction *InstCombiner::visitSub(BinaryOperator *I) {
166   if (I->use_empty()) return 0;       // Don't fix dead add instructions...
167   Value *Op0 = I->getOperand(0), *Op1 = I->getOperand(1);
168
169   if (Op0 == Op1) {         // sub X, X  -> 0
170     AddUsesToWorkList(I);         // Add all modified instrs to worklist
171     I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
172     return I;
173   }
174
175   // If this is a subtract instruction with a constant RHS, convert it to an add
176   // instruction of a negative constant
177   //
178   if (Constant *Op2 = dyn_cast<Constant>(Op1))
179     if (Constant *RHS = *Constant::getNullValue(I->getType()) - *Op2) // 0 - RHS
180       return BinaryOperator::create(Instruction::Add, Op0, RHS, I->getName());
181
182   // If this is a 'C = x-B', check to see if 'B = -A', so that C = x+A...
183   if (Value *V = dyn_castNegInst(Op1))
184     return BinaryOperator::create(Instruction::Add, Op0, V);
185
186   // Replace (x - (y - z)) with (x + (z - y)) if the (y - z) subexpression is
187   // not used by anyone else...
188   //
189   if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1))
190     if (Op1I->use_size() == 1 && Op1I->getOpcode() == Instruction::Sub) {
191       // Swap the two operands of the subexpr...
192       Value *IIOp0 = Op1I->getOperand(0), *IIOp1 = Op1I->getOperand(1);
193       Op1I->setOperand(0, IIOp1);
194       Op1I->setOperand(1, IIOp0);
195
196       // Create the new top level add instruction...
197       return BinaryOperator::create(Instruction::Add, Op0, Op1);
198     }
199   return 0;
200 }
201
202 Instruction *InstCombiner::visitMul(BinaryOperator *I) {
203   if (I->use_empty()) return 0;       // Don't fix dead instructions...
204   bool Changed = SimplifyBinOp(I);
205   Value *Op1 = I->getOperand(0);
206
207   // Simplify add instructions with a constant RHS...
208   if (Constant *Op2 = dyn_cast<Constant>(I->getOperand(1))) {
209     if (I->getType()->isIntegral() && cast<ConstantInt>(Op2)->equalsInt(1)){
210       // Eliminate 'mul int %X, 1'
211       AddUsesToWorkList(I);         // Add all modified instrs to worklist
212       I->replaceAllUsesWith(Op1);
213       return I;
214
215     } else if (I->getType()->isIntegral() &&
216                cast<ConstantInt>(Op2)->equalsInt(2)) {
217       // Convert 'mul int %X, 2' to 'add int %X, %X'
218       return BinaryOperator::create(Instruction::Add, Op1, Op1, I->getName());
219
220     } else if (Op2->isNullValue()) {
221       // Eliminate 'mul int %X, 0'
222       AddUsesToWorkList(I);         // Add all modified instrs to worklist
223       I->replaceAllUsesWith(Op2);   // Set this value to zero directly
224       return I;
225     }
226   }
227
228   return Changed ? I : 0;
229 }
230
231
232 Instruction *InstCombiner::visitDiv(BinaryOperator *I) {
233   if (I->use_empty()) return 0;       // Don't fix dead instructions...
234
235   // div X, 1 == X
236   if (ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1)))
237     if (RHS->equalsInt(1)) {
238       AddUsesToWorkList(I);         // Add all modified instrs to worklist
239       I->replaceAllUsesWith(I->getOperand(0));
240       return I;
241     }
242   return 0;
243 }
244
245
246 Instruction *InstCombiner::visitRem(BinaryOperator *I) {
247   if (I->use_empty()) return 0;       // Don't fix dead instructions...
248
249   // rem X, 1 == 0
250   if (ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1)))
251     if (RHS->equalsInt(1)) {
252       AddUsesToWorkList(I);         // Add all modified instrs to worklist
253       I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
254       return I;
255     }
256   return 0;
257 }
258
259 static Constant *getMaxValue(const Type *Ty) {
260   assert(Ty == Type::BoolTy || Ty->isIntegral());
261   if (Ty == Type::BoolTy)
262     return ConstantBool::True;
263
264   if (Ty->isSigned())
265     return ConstantSInt::get(Ty, -1);
266   else if (Ty->isUnsigned()) {
267     // Calculate -1 casted to the right type...
268     unsigned TypeBits = Ty->getPrimitiveSize()*8;
269     uint64_t Val = (uint64_t)-1LL;       // All ones
270     Val >>= 64-TypeBits;                 // Shift out unwanted 1 bits...
271     return ConstantUInt::get(Ty, Val);
272   }
273   return 0;
274 }
275
276
277 Instruction *InstCombiner::visitAnd(BinaryOperator *I) {
278   if (I->use_empty()) return 0;       // Don't fix dead instructions...
279   bool Changed = SimplifyBinOp(I);
280   Value *Op0 = I->getOperand(0), *Op1 = I->getOperand(1);
281
282   // and X, X = X   and X, 0 == 0
283   if (Op0 == Op1 || Op1 == Constant::getNullValue(I->getType())) {
284     AddUsesToWorkList(I);         // Add all modified instrs to worklist
285     I->replaceAllUsesWith(Op1);
286     return I;
287   }
288
289   // and X, -1 == X
290   if (Constant *RHS = dyn_cast<Constant>(Op1))
291     if (RHS == getMaxValue(I->getType())) {
292       AddUsesToWorkList(I);         // Add all modified instrs to worklist
293       I->replaceAllUsesWith(Op0);
294       return I;
295     }
296
297   return Changed ? I : 0;
298 }
299
300
301
302 Instruction *InstCombiner::visitOr(BinaryOperator *I) {
303   if (I->use_empty()) return 0;       // Don't fix dead instructions...
304   bool Changed = SimplifyBinOp(I);
305   Value *Op0 = I->getOperand(0), *Op1 = I->getOperand(1);
306
307   // or X, X = X   or X, 0 == X
308   if (Op0 == Op1 || Op1 == Constant::getNullValue(I->getType())) {
309     AddUsesToWorkList(I);         // Add all modified instrs to worklist
310     I->replaceAllUsesWith(Op0);
311     return I;
312   }
313
314   // or X, -1 == -1
315   if (Constant *RHS = dyn_cast<Constant>(Op1))
316     if (RHS == getMaxValue(I->getType())) {
317       AddUsesToWorkList(I);         // Add all modified instrs to worklist
318       I->replaceAllUsesWith(Op1);
319       return I;
320     }
321
322   return Changed ? I : 0;
323 }
324
325
326
327 Instruction *InstCombiner::visitXor(BinaryOperator *I) {
328   if (I->use_empty()) return 0;       // Don't fix dead instructions...
329   bool Changed = SimplifyBinOp(I);
330   Value *Op0 = I->getOperand(0), *Op1 = I->getOperand(1);
331
332   // xor X, X = 0
333   if (Op0 == Op1) {
334     AddUsesToWorkList(I);         // Add all modified instrs to worklist
335     I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
336     return I;
337   }
338
339   // xor X, 0 == X
340   if (Op1 == Constant::getNullValue(I->getType())) {
341     AddUsesToWorkList(I);         // Add all modified instrs to worklist
342     I->replaceAllUsesWith(Op0);
343     return I;
344   }
345
346   return Changed ? I : 0;
347 }
348
349 // isTrueWhenEqual - Return true if the specified setcondinst instruction is
350 // true when both operands are equal...
351 //
352 static bool isTrueWhenEqual(Instruction *I) {
353   return I->getOpcode() == Instruction::SetEQ ||
354          I->getOpcode() == Instruction::SetGE ||
355          I->getOpcode() == Instruction::SetLE;
356 }
357
358 Instruction *InstCombiner::visitSetCondInst(BinaryOperator *I) {
359   if (I->use_empty()) return 0;       // Don't fix dead instructions...
360   bool Changed = SimplifyBinOp(I);
361
362   // setcc X, X
363   if (I->getOperand(0) == I->getOperand(1)) {
364     AddUsesToWorkList(I);         // Add all modified instrs to worklist
365     I->replaceAllUsesWith(ConstantBool::get(isTrueWhenEqual(I)));
366     return I;
367   }
368
369   // setcc <global*>, 0 - Global value addresses are never null!
370   if (isa<GlobalValue>(I->getOperand(0)) &&
371       isa<ConstantPointerNull>(I->getOperand(1))) {
372     AddUsesToWorkList(I);         // Add all modified instrs to worklist
373     I->replaceAllUsesWith(ConstantBool::get(!isTrueWhenEqual(I)));
374     return I;
375   }
376
377   return Changed ? I : 0;
378 }
379
380
381
382 Instruction *InstCombiner::visitShiftInst(Instruction *I) {
383   if (I->use_empty()) return 0;       // Don't fix dead instructions...
384   assert(I->getOperand(1)->getType() == Type::UByteTy);
385   Value *Op0 = I->getOperand(0), *Op1 = I->getOperand(1);
386
387   // shl X, 0 == X and shr X, 0 == X
388   // shl 0, X == 0 and shr 0, X == 0
389   if (Op1 == Constant::getNullValue(Type::UByteTy) ||
390       Op0 == Constant::getNullValue(Op0->getType())) {
391     AddUsesToWorkList(I);         // Add all modified instrs to worklist
392     I->replaceAllUsesWith(Op0);
393     return I;
394   }
395
396   // shl int X, 32 = 0 and shr sbyte Y, 9 = 0, ... just don't eliminate shr of
397   // a signed value.
398   //
399   if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(Op1)) {
400     unsigned TypeBits = Op0->getType()->getPrimitiveSize()*8;
401     if (CUI->getValue() >= TypeBits &&
402         !(Op0->getType()->isSigned() && I->getOpcode() == Instruction::Shr)) {
403       AddUsesToWorkList(I);         // Add all modified instrs to worklist
404       I->replaceAllUsesWith(Constant::getNullValue(Op0->getType()));
405       return I;
406     }
407   }
408   return 0;
409 }
410
411
412 // isEliminableCastOfCast - Return true if it is valid to eliminate the CI
413 // instruction.
414 //
415 static inline bool isEliminableCastOfCast(const CastInst *CI,
416                                           const CastInst *CSrc) {
417   assert(CI->getOperand(0) == CSrc);
418   const Type *SrcTy = CSrc->getOperand(0)->getType();
419   const Type *MidTy = CSrc->getType();
420   const Type *DstTy = CI->getType();
421
422   // It is legal to eliminate the instruction if casting A->B->A
423   if (SrcTy == DstTy) return true;
424
425   // Allow free casting and conversion of sizes as long as the sign doesn't
426   // change...
427   if (SrcTy->isSigned() == MidTy->isSigned() &&
428       MidTy->isSigned() == DstTy->isSigned())
429     return true;
430
431   // Otherwise, we cannot succeed.  Specifically we do not want to allow things
432   // like:  short -> ushort -> uint, because this can create wrong results if
433   // the input short is negative!
434   //
435   return false;
436 }
437
438
439 // CastInst simplification
440 //
441 Instruction *InstCombiner::visitCastInst(CastInst *CI) {
442   if (CI->use_empty()) return 0;       // Don't fix dead instructions...
443
444   // If the user is casting a value to the same type, eliminate this cast
445   // instruction...
446   if (CI->getType() == CI->getOperand(0)->getType() && !CI->use_empty()) {
447     AddUsesToWorkList(CI);         // Add all modified instrs to worklist
448     CI->replaceAllUsesWith(CI->getOperand(0));
449     return CI;
450   }
451
452
453   // If casting the result of another cast instruction, try to eliminate this
454   // one!
455   //
456   if (CastInst *CSrc = dyn_cast<CastInst>(CI->getOperand(0)))
457     if (isEliminableCastOfCast(CI, CSrc)) {
458       // This instruction now refers directly to the cast's src operand.  This
459       // has a good chance of making CSrc dead.
460       CI->setOperand(0, CSrc->getOperand(0));
461       return CI;
462     }
463
464   return 0;
465 }
466
467
468 // PHINode simplification
469 //
470 Instruction *InstCombiner::visitPHINode(PHINode *PN) {
471   if (PN->use_empty()) return 0;       // Don't fix dead instructions...
472
473   // If the PHI node only has one incoming value, eliminate the PHI node...
474   if (PN->getNumIncomingValues() == 1) {
475     AddUsesToWorkList(PN);         // Add all modified instrs to worklist
476     PN->replaceAllUsesWith(PN->getIncomingValue(0));
477     return PN;
478   }
479
480   return 0;
481 }
482
483
484 Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst *GEP) {
485   // Is it getelementptr %P, uint 0
486   // If so, elminate the noop.
487   if (GEP->getNumOperands() == 2 && !GEP->use_empty() &&
488       GEP->getOperand(1) == Constant::getNullValue(Type::UIntTy)) {
489     AddUsesToWorkList(GEP);         // Add all modified instrs to worklist
490     GEP->replaceAllUsesWith(GEP->getOperand(0));
491     return GEP;
492   }
493
494   return visitMemAccessInst(GEP);
495 }
496
497
498 // Combine Indices - If the source pointer to this mem access instruction is a
499 // getelementptr instruction, combine the indices of the GEP into this
500 // instruction
501 //
502 Instruction *InstCombiner::visitMemAccessInst(MemAccessInst *MAI) {
503   GetElementPtrInst *Src =
504     dyn_cast<GetElementPtrInst>(MAI->getPointerOperand());
505   if (!Src) return 0;
506
507   std::vector<Value *> Indices;
508   
509   // Only special case we have to watch out for is pointer arithmetic on the
510   // 0th index of MAI. 
511   unsigned FirstIdx = MAI->getFirstIndexOperandNumber();
512   if (FirstIdx == MAI->getNumOperands() || 
513       (FirstIdx == MAI->getNumOperands()-1 &&
514        MAI->getOperand(FirstIdx) == ConstantUInt::get(Type::UIntTy, 0))) { 
515     // Replace the index list on this MAI with the index on the getelementptr
516     Indices.insert(Indices.end(), Src->idx_begin(), Src->idx_end());
517   } else if (*MAI->idx_begin() == ConstantUInt::get(Type::UIntTy, 0)) { 
518     // Otherwise we can do the fold if the first index of the GEP is a zero
519     Indices.insert(Indices.end(), Src->idx_begin(), Src->idx_end());
520     Indices.insert(Indices.end(), MAI->idx_begin()+1, MAI->idx_end());
521   }
522
523   if (Indices.empty()) return 0;  // Can't do the fold?
524
525   switch (MAI->getOpcode()) {
526   case Instruction::GetElementPtr:
527     return new GetElementPtrInst(Src->getOperand(0), Indices, MAI->getName());
528   case Instruction::Load:
529     return new LoadInst(Src->getOperand(0), Indices, MAI->getName());
530   case Instruction::Store:
531     return new StoreInst(MAI->getOperand(0), Src->getOperand(0), Indices);
532   default:
533     assert(0 && "Unknown memaccessinst!");
534     break;
535   }
536   abort();
537   return 0;
538 }
539
540
541 bool InstCombiner::runOnFunction(Function *F) {
542   bool Changed = false;
543
544   WorkList.insert(WorkList.end(), inst_begin(F), inst_end(F));
545
546   while (!WorkList.empty()) {
547     Instruction *I = WorkList.back();  // Get an instruction from the worklist
548     WorkList.pop_back();
549
550     // Now that we have an instruction, try combining it to simplify it...
551     Instruction *Result = visit(I);
552     if (Result) {
553       ++NumCombined;
554       // Should we replace the old instruction with a new one?
555       if (Result != I) {
556         // Instructions can end up on the worklist more than once.  Make sure
557         // we do not process an instruction that has been deleted.
558         std::vector<Instruction*>::iterator It = std::find(WorkList.begin(),
559                                                            WorkList.end(), I);
560         while (It != WorkList.end()) {
561           It = WorkList.erase(It);
562           It = std::find(It, WorkList.end(), I);
563         }
564
565         ReplaceInstWithInst(I, Result);
566       }
567
568       WorkList.push_back(Result);
569       AddUsesToWorkList(Result);
570       Changed = true;
571     }
572   }
573
574   return Changed;
575 }
576
577 Pass *createInstructionCombiningPass() {
578   return new InstCombiner();
579 }