1 //===- InstCombine.h - Main InstCombine pass definition -------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef INSTCOMBINE_INSTCOMBINE_H
11 #define INSTCOMBINE_INSTCOMBINE_H
13 #include "InstCombineWorklist.h"
14 #include "llvm/Operator.h"
15 #include "llvm/Pass.h"
16 #include "llvm/Analysis/ValueTracking.h"
17 #include "llvm/Support/IRBuilder.h"
18 #include "llvm/Support/InstVisitor.h"
19 #include "llvm/Support/TargetFolder.h"
28 /// SelectPatternFlavor - We can match a variety of different patterns for
29 /// select operations.
30 enum SelectPatternFlavor
{
37 /// getComplexity: Assign a complexity or rank value to LLVM Values...
38 /// 0 -> undef, 1 -> Const, 2 -> Other, 3 -> Arg, 3 -> Unary, 4 -> OtherInst
39 static inline unsigned getComplexity(Value
*V
) {
40 if (isa
<Instruction
>(V
)) {
41 if (BinaryOperator::isNeg(V
) ||
42 BinaryOperator::isFNeg(V
) ||
43 BinaryOperator::isNot(V
))
47 if (isa
<Argument
>(V
)) return 3;
48 return isa
<Constant
>(V
) ? (isa
<UndefValue
>(V
) ? 0 : 1) : 2;
52 /// InstCombineIRInserter - This is an IRBuilder insertion helper that works
53 /// just like the normal insertion helper, but also adds any new instructions
54 /// to the instcombine worklist.
55 class LLVM_LIBRARY_VISIBILITY InstCombineIRInserter
56 : public IRBuilderDefaultInserter
<true> {
57 InstCombineWorklist
&Worklist
;
59 InstCombineIRInserter(InstCombineWorklist
&WL
) : Worklist(WL
) {}
61 void InsertHelper(Instruction
*I
, const Twine
&Name
,
62 BasicBlock
*BB
, BasicBlock::iterator InsertPt
) const {
63 IRBuilderDefaultInserter
<true>::InsertHelper(I
, Name
, BB
, InsertPt
);
68 /// InstCombiner - The -instcombine pass.
69 class LLVM_LIBRARY_VISIBILITY InstCombiner
70 : public FunctionPass
,
71 public InstVisitor
<InstCombiner
, Instruction
*> {
75 /// Worklist - All of the instructions that need to be simplified.
76 InstCombineWorklist Worklist
;
78 /// Builder - This is an IRBuilder that automatically inserts new
79 /// instructions into the worklist when they are created.
80 typedef IRBuilder
<true, TargetFolder
, InstCombineIRInserter
> BuilderTy
;
83 static char ID
; // Pass identification, replacement for typeid
84 InstCombiner() : FunctionPass(ID
), TD(0), Builder(0) {
85 initializeInstCombinerPass(*PassRegistry::getPassRegistry());
89 virtual bool runOnFunction(Function
&F
);
91 bool DoOneIteration(Function
&F
, unsigned ItNum
);
93 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
95 TargetData
*getTargetData() const { return TD
; }
97 // Visitation implementation - Implement instruction combining for different
98 // instruction types. The semantics are as follows:
100 // null - No change was made
101 // I - Change was made, I is still valid, I may be dead though
102 // otherwise - Change was made, replace I with returned instruction
104 Instruction
*visitAdd(BinaryOperator
&I
);
105 Instruction
*visitFAdd(BinaryOperator
&I
);
106 Value
*OptimizePointerDifference(Value
*LHS
, Value
*RHS
, const Type
*Ty
);
107 Instruction
*visitSub(BinaryOperator
&I
);
108 Instruction
*visitFSub(BinaryOperator
&I
);
109 Instruction
*visitMul(BinaryOperator
&I
);
110 Instruction
*visitFMul(BinaryOperator
&I
);
111 Instruction
*visitURem(BinaryOperator
&I
);
112 Instruction
*visitSRem(BinaryOperator
&I
);
113 Instruction
*visitFRem(BinaryOperator
&I
);
114 bool SimplifyDivRemOfSelect(BinaryOperator
&I
);
115 Instruction
*commonRemTransforms(BinaryOperator
&I
);
116 Instruction
*commonIRemTransforms(BinaryOperator
&I
);
117 Instruction
*commonDivTransforms(BinaryOperator
&I
);
118 Instruction
*commonIDivTransforms(BinaryOperator
&I
);
119 Instruction
*visitUDiv(BinaryOperator
&I
);
120 Instruction
*visitSDiv(BinaryOperator
&I
);
121 Instruction
*visitFDiv(BinaryOperator
&I
);
122 Value
*FoldAndOfICmps(ICmpInst
*LHS
, ICmpInst
*RHS
);
123 Value
*FoldAndOfFCmps(FCmpInst
*LHS
, FCmpInst
*RHS
);
124 Instruction
*visitAnd(BinaryOperator
&I
);
125 Value
*FoldOrOfICmps(ICmpInst
*LHS
, ICmpInst
*RHS
);
126 Value
*FoldOrOfFCmps(FCmpInst
*LHS
, FCmpInst
*RHS
);
127 Instruction
*FoldOrWithConstants(BinaryOperator
&I
, Value
*Op
,
128 Value
*A
, Value
*B
, Value
*C
);
129 Instruction
*visitOr (BinaryOperator
&I
);
130 Instruction
*visitXor(BinaryOperator
&I
);
131 Instruction
*visitShl(BinaryOperator
&I
);
132 Instruction
*visitAShr(BinaryOperator
&I
);
133 Instruction
*visitLShr(BinaryOperator
&I
);
134 Instruction
*commonShiftTransforms(BinaryOperator
&I
);
135 Instruction
*FoldFCmp_IntToFP_Cst(FCmpInst
&I
, Instruction
*LHSI
,
137 Instruction
*FoldCmpLoadFromIndexedGlobal(GetElementPtrInst
*GEP
,
138 GlobalVariable
*GV
, CmpInst
&ICI
,
139 ConstantInt
*AndCst
= 0);
140 Instruction
*visitFCmpInst(FCmpInst
&I
);
141 Instruction
*visitICmpInst(ICmpInst
&I
);
142 Instruction
*visitICmpInstWithCastAndCast(ICmpInst
&ICI
);
143 Instruction
*visitICmpInstWithInstAndIntCst(ICmpInst
&ICI
,
146 Instruction
*FoldICmpDivCst(ICmpInst
&ICI
, BinaryOperator
*DivI
,
147 ConstantInt
*DivRHS
);
148 Instruction
*FoldICmpShrCst(ICmpInst
&ICI
, BinaryOperator
*DivI
,
149 ConstantInt
*DivRHS
);
150 Instruction
*FoldICmpAddOpCst(ICmpInst
&ICI
, Value
*X
, ConstantInt
*CI
,
151 ICmpInst::Predicate Pred
, Value
*TheAdd
);
152 Instruction
*FoldGEPICmp(GEPOperator
*GEPLHS
, Value
*RHS
,
153 ICmpInst::Predicate Cond
, Instruction
&I
);
154 Instruction
*FoldShiftByConstant(Value
*Op0
, ConstantInt
*Op1
,
156 Instruction
*commonCastTransforms(CastInst
&CI
);
157 Instruction
*commonPointerCastTransforms(CastInst
&CI
);
158 Instruction
*visitTrunc(TruncInst
&CI
);
159 Instruction
*visitZExt(ZExtInst
&CI
);
160 Instruction
*visitSExt(SExtInst
&CI
);
161 Instruction
*visitFPTrunc(FPTruncInst
&CI
);
162 Instruction
*visitFPExt(CastInst
&CI
);
163 Instruction
*visitFPToUI(FPToUIInst
&FI
);
164 Instruction
*visitFPToSI(FPToSIInst
&FI
);
165 Instruction
*visitUIToFP(CastInst
&CI
);
166 Instruction
*visitSIToFP(CastInst
&CI
);
167 Instruction
*visitPtrToInt(PtrToIntInst
&CI
);
168 Instruction
*visitIntToPtr(IntToPtrInst
&CI
);
169 Instruction
*visitBitCast(BitCastInst
&CI
);
170 Instruction
*FoldSelectOpOp(SelectInst
&SI
, Instruction
*TI
,
172 Instruction
*FoldSelectIntoOp(SelectInst
&SI
, Value
*, Value
*);
173 Instruction
*FoldSPFofSPF(Instruction
*Inner
, SelectPatternFlavor SPF1
,
174 Value
*A
, Value
*B
, Instruction
&Outer
,
175 SelectPatternFlavor SPF2
, Value
*C
);
176 Instruction
*visitSelectInst(SelectInst
&SI
);
177 Instruction
*visitSelectInstWithICmp(SelectInst
&SI
, ICmpInst
*ICI
);
178 Instruction
*visitCallInst(CallInst
&CI
);
179 Instruction
*visitInvokeInst(InvokeInst
&II
);
181 Instruction
*SliceUpIllegalIntegerPHI(PHINode
&PN
);
182 Instruction
*visitPHINode(PHINode
&PN
);
183 Instruction
*visitGetElementPtrInst(GetElementPtrInst
&GEP
);
184 Instruction
*visitAllocaInst(AllocaInst
&AI
);
185 Instruction
*visitMalloc(Instruction
&FI
);
186 Instruction
*visitFree(CallInst
&FI
);
187 Instruction
*visitLoadInst(LoadInst
&LI
);
188 Instruction
*visitStoreInst(StoreInst
&SI
);
189 Instruction
*visitBranchInst(BranchInst
&BI
);
190 Instruction
*visitSwitchInst(SwitchInst
&SI
);
191 Instruction
*visitInsertElementInst(InsertElementInst
&IE
);
192 Instruction
*visitExtractElementInst(ExtractElementInst
&EI
);
193 Instruction
*visitShuffleVectorInst(ShuffleVectorInst
&SVI
);
194 Instruction
*visitExtractValueInst(ExtractValueInst
&EV
);
196 // visitInstruction - Specify what to return for unhandled instructions...
197 Instruction
*visitInstruction(Instruction
&I
) { return 0; }
200 bool ShouldChangeType(const Type
*From
, const Type
*To
) const;
201 Value
*dyn_castNegVal(Value
*V
) const;
202 Value
*dyn_castFNegVal(Value
*V
) const;
203 const Type
*FindElementAtOffset(const Type
*Ty
, int64_t Offset
,
204 SmallVectorImpl
<Value
*> &NewIndices
);
205 Instruction
*FoldOpIntoSelect(Instruction
&Op
, SelectInst
*SI
);
207 /// ShouldOptimizeCast - Return true if the cast from "V to Ty" actually
208 /// results in any code being generated and is interesting to optimize out. If
209 /// the cast can be eliminated by some other simple transformation, we prefer
210 /// to do the simplification first.
211 bool ShouldOptimizeCast(Instruction::CastOps opcode
,const Value
*V
,
214 Instruction
*visitCallSite(CallSite CS
);
215 Instruction
*tryOptimizeCall(CallInst
*CI
, const TargetData
*TD
);
216 bool transformConstExprCastCall(CallSite CS
);
217 Instruction
*transformCallThroughTrampoline(CallSite CS
);
218 Instruction
*transformZExtICmp(ICmpInst
*ICI
, Instruction
&CI
,
219 bool DoXform
= true);
220 Instruction
*transformSExtICmp(ICmpInst
*ICI
, Instruction
&CI
);
221 bool WillNotOverflowSignedAdd(Value
*LHS
, Value
*RHS
);
222 Value
*EmitGEPOffset(User
*GEP
);
225 // InsertNewInstBefore - insert an instruction New before instruction Old
226 // in the program. Add the new instruction to the worklist.
228 Instruction
*InsertNewInstBefore(Instruction
*New
, Instruction
&Old
) {
229 assert(New
&& New
->getParent() == 0 &&
230 "New instruction already inserted into a basic block!");
231 BasicBlock
*BB
= Old
.getParent();
232 BB
->getInstList().insert(&Old
, New
); // Insert inst
237 // ReplaceInstUsesWith - This method is to be used when an instruction is
238 // found to be dead, replacable with another preexisting expression. Here
239 // we add all uses of I to the worklist, replace all uses of I with the new
240 // value, then return I, so that the inst combiner will know that I was
243 Instruction
*ReplaceInstUsesWith(Instruction
&I
, Value
*V
) {
244 Worklist
.AddUsersToWorkList(I
); // Add all modified instrs to worklist.
246 // If we are replacing the instruction with itself, this must be in a
247 // segment of unreachable code, so just clobber the instruction.
249 V
= UndefValue::get(I
.getType());
251 DEBUG(errs() << "IC: Replacing " << I
<< "\n"
252 " with " << *V
<< '\n');
254 I
.replaceAllUsesWith(V
);
258 // EraseInstFromFunction - When dealing with an instruction that has side
259 // effects or produces a void value, we can't rely on DCE to delete the
260 // instruction. Instead, visit methods should return the value returned by
262 Instruction
*EraseInstFromFunction(Instruction
&I
) {
263 DEBUG(errs() << "IC: ERASE " << I
<< '\n');
265 assert(I
.use_empty() && "Cannot erase instruction that is used!");
266 // Make sure that we reprocess all operands now that we reduced their
268 if (I
.getNumOperands() < 8) {
269 for (User::op_iterator i
= I
.op_begin(), e
= I
.op_end(); i
!= e
; ++i
)
270 if (Instruction
*Op
= dyn_cast
<Instruction
>(*i
))
276 return 0; // Don't do anything with FI
279 void ComputeMaskedBits(Value
*V
, const APInt
&Mask
, APInt
&KnownZero
,
280 APInt
&KnownOne
, unsigned Depth
= 0) const {
281 return llvm::ComputeMaskedBits(V
, Mask
, KnownZero
, KnownOne
, TD
, Depth
);
284 bool MaskedValueIsZero(Value
*V
, const APInt
&Mask
,
285 unsigned Depth
= 0) const {
286 return llvm::MaskedValueIsZero(V
, Mask
, TD
, Depth
);
288 unsigned ComputeNumSignBits(Value
*Op
, unsigned Depth
= 0) const {
289 return llvm::ComputeNumSignBits(Op
, TD
, Depth
);
294 /// SimplifyAssociativeOrCommutative - This performs a few simplifications for
295 /// operators which are associative or commutative.
296 bool SimplifyAssociativeOrCommutative(BinaryOperator
&I
);
298 /// SimplifyUsingDistributiveLaws - This tries to simplify binary operations
299 /// which some other binary operation distributes over either by factorizing
300 /// out common terms (eg "(A*B)+(A*C)" -> "A*(B+C)") or expanding out if this
301 /// results in simplifications (eg: "A & (B | C) -> (A&B) | (A&C)" if this is
302 /// a win). Returns the simplified value, or null if it didn't simplify.
303 Value
*SimplifyUsingDistributiveLaws(BinaryOperator
&I
);
305 /// SimplifyDemandedUseBits - Attempts to replace V with a simpler value
306 /// based on the demanded bits.
307 Value
*SimplifyDemandedUseBits(Value
*V
, APInt DemandedMask
,
308 APInt
& KnownZero
, APInt
& KnownOne
,
310 bool SimplifyDemandedBits(Use
&U
, APInt DemandedMask
,
311 APInt
& KnownZero
, APInt
& KnownOne
,
314 /// SimplifyDemandedInstructionBits - Inst is an integer instruction that
315 /// SimplifyDemandedBits knows about. See if the instruction has any
316 /// properties that allow us to simplify its operands.
317 bool SimplifyDemandedInstructionBits(Instruction
&Inst
);
319 Value
*SimplifyDemandedVectorElts(Value
*V
, APInt DemandedElts
,
320 APInt
& UndefElts
, unsigned Depth
= 0);
322 // FoldOpIntoPhi - Given a binary operator, cast instruction, or select
323 // which has a PHI node as operand #0, see if we can fold the instruction
324 // into the PHI (which is only possible if all operands to the PHI are
327 Instruction
*FoldOpIntoPhi(Instruction
&I
);
329 // FoldPHIArgOpIntoPHI - If all operands to a PHI node are the same "unary"
330 // operator and they all are only used by the PHI, PHI together their
331 // inputs, and do the operation once, to the result of the PHI.
332 Instruction
*FoldPHIArgOpIntoPHI(PHINode
&PN
);
333 Instruction
*FoldPHIArgBinOpIntoPHI(PHINode
&PN
);
334 Instruction
*FoldPHIArgGEPIntoPHI(PHINode
&PN
);
335 Instruction
*FoldPHIArgLoadIntoPHI(PHINode
&PN
);
338 Instruction
*OptAndOp(Instruction
*Op
, ConstantInt
*OpRHS
,
339 ConstantInt
*AndRHS
, BinaryOperator
&TheAnd
);
341 Value
*FoldLogicalPlusAnd(Value
*LHS
, Value
*RHS
, ConstantInt
*Mask
,
342 bool isSub
, Instruction
&I
);
343 Value
*InsertRangeTest(Value
*V
, Constant
*Lo
, Constant
*Hi
,
344 bool isSigned
, bool Inside
);
345 Instruction
*PromoteCastOfAllocation(BitCastInst
&CI
, AllocaInst
&AI
);
346 Instruction
*MatchBSwap(BinaryOperator
&I
);
347 bool SimplifyStoreAtEndOfBlock(StoreInst
&SI
);
348 Instruction
*SimplifyMemTransfer(MemIntrinsic
*MI
);
349 Instruction
*SimplifyMemSet(MemSetInst
*MI
);
352 Value
*EvaluateInDifferentType(Value
*V
, const Type
*Ty
, bool isSigned
);
357 } // end namespace llvm.