ConstantFolding.cpp revision 5520732b24a5a321140dd79af70d321c7ff3dec9
1//===-- ConstantFolding.cpp - Analyze constant folding possibilities ------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This family of functions determines the possibility of performing constant 11// folding. 12// 13//===----------------------------------------------------------------------===// 14 15#include "llvm/Analysis/ConstantFolding.h" 16#include "llvm/Constants.h" 17#include "llvm/DerivedTypes.h" 18#include "llvm/Function.h" 19#include "llvm/Instructions.h" 20#include "llvm/Intrinsics.h" 21#include "llvm/ADT/SmallVector.h" 22#include "llvm/Support/GetElementPtrTypeIterator.h" 23#include "llvm/Support/MathExtras.h" 24#include <cerrno> 25#include <cmath> 26using namespace llvm; 27 28/// ConstantFoldInstruction - Attempt to constant fold the specified 29/// instruction. If successful, the constant result is returned, if not, null 30/// is returned. Note that this function can only fail when attempting to fold 31/// instructions like loads and stores, which have no constant expression form. 32/// 33Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) { 34 if (PHINode *PN = dyn_cast<PHINode>(I)) { 35 if (PN->getNumIncomingValues() == 0) 36 return Constant::getNullValue(PN->getType()); 37 38 Constant *Result = dyn_cast<Constant>(PN->getIncomingValue(0)); 39 if (Result == 0) return 0; 40 41 // Handle PHI nodes specially here... 42 for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i) 43 if (PN->getIncomingValue(i) != Result && PN->getIncomingValue(i) != PN) 44 return 0; // Not all the same incoming constants... 45 46 // If we reach here, all incoming values are the same constant. 47 return Result; 48 } 49 50 // Scan the operand list, checking to see if they are all constants, if so, 51 // hand off to ConstantFoldInstOperands. 52 SmallVector<Constant*, 8> Ops; 53 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) 54 if (Constant *Op = dyn_cast<Constant>(I->getOperand(i))) 55 Ops.push_back(Op); 56 else 57 return 0; // All operands not constant! 58 59 return ConstantFoldInstOperands(I, &Ops[0], Ops.size()); 60} 61 62/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the 63/// specified opcode and operands. If successful, the constant result is 64/// returned, if not, null is returned. Note that this function can fail when 65/// attempting to fold instructions like loads and stores, which have no 66/// constant expression form. 67/// 68Constant *llvm::ConstantFoldInstOperands(const Instruction* I, 69 Constant** Ops, unsigned NumOps, 70 const TargetData *TD) { 71 unsigned Opc = I->getOpcode(); 72 const Type *DestTy = I->getType(); 73 74 // Handle easy binops first 75 if (isa<BinaryOperator>(I)) 76 return ConstantExpr::get(Opc, Ops[0], Ops[1]); 77 78 switch (Opc) { 79 default: return 0; 80 case Instruction::Call: 81 if (Function *F = dyn_cast<Function>(Ops[0])) 82 if (canConstantFoldCallTo(F)) 83 return ConstantFoldCall(F, Ops+1, NumOps); 84 return 0; 85 case Instruction::ICmp: 86 case Instruction::FCmp: 87 return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Ops[0], 88 Ops[1]); 89 case Instruction::Shl: 90 case Instruction::LShr: 91 case Instruction::AShr: 92 return ConstantExpr::get(Opc, Ops[0], Ops[1]); 93 case Instruction::Trunc: 94 case Instruction::ZExt: 95 case Instruction::SExt: 96 case Instruction::FPTrunc: 97 case Instruction::FPExt: 98 case Instruction::UIToFP: 99 case Instruction::SIToFP: 100 case Instruction::FPToUI: 101 case Instruction::FPToSI: 102 case Instruction::PtrToInt: 103 case Instruction::IntToPtr: 104 case Instruction::BitCast: 105 return ConstantExpr::getCast(Opc, Ops[0], DestTy); 106 case Instruction::Select: 107 return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]); 108 case Instruction::ExtractElement: 109 return ConstantExpr::getExtractElement(Ops[0], Ops[1]); 110 case Instruction::InsertElement: 111 return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]); 112 case Instruction::ShuffleVector: 113 return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]); 114 case Instruction::GetElementPtr: 115 return ConstantExpr::getGetElementPtr(Ops[0], 116 std::vector<Constant*>(Ops+1, 117 Ops+NumOps)); 118 } 119} 120 121/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a 122/// getelementptr constantexpr, return the constant value being addressed by the 123/// constant expression, or null if something is funny and we can't decide. 124Constant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C, 125 ConstantExpr *CE) { 126 if (CE->getOperand(1) != Constant::getNullValue(CE->getOperand(1)->getType())) 127 return 0; // Do not allow stepping over the value! 128 129 // Loop over all of the operands, tracking down which value we are 130 // addressing... 131 gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE); 132 for (++I; I != E; ++I) 133 if (const StructType *STy = dyn_cast<StructType>(*I)) { 134 ConstantInt *CU = cast<ConstantInt>(I.getOperand()); 135 assert(CU->getZExtValue() < STy->getNumElements() && 136 "Struct index out of range!"); 137 unsigned El = (unsigned)CU->getZExtValue(); 138 if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) { 139 C = CS->getOperand(El); 140 } else if (isa<ConstantAggregateZero>(C)) { 141 C = Constant::getNullValue(STy->getElementType(El)); 142 } else if (isa<UndefValue>(C)) { 143 C = UndefValue::get(STy->getElementType(El)); 144 } else { 145 return 0; 146 } 147 } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) { 148 if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) { 149 if (CI->getZExtValue() >= ATy->getNumElements()) 150 return 0; 151 if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) 152 C = CA->getOperand(CI->getZExtValue()); 153 else if (isa<ConstantAggregateZero>(C)) 154 C = Constant::getNullValue(ATy->getElementType()); 155 else if (isa<UndefValue>(C)) 156 C = UndefValue::get(ATy->getElementType()); 157 else 158 return 0; 159 } else if (const PackedType *PTy = dyn_cast<PackedType>(*I)) { 160 if (CI->getZExtValue() >= PTy->getNumElements()) 161 return 0; 162 if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C)) 163 C = CP->getOperand(CI->getZExtValue()); 164 else if (isa<ConstantAggregateZero>(C)) 165 C = Constant::getNullValue(PTy->getElementType()); 166 else if (isa<UndefValue>(C)) 167 C = UndefValue::get(PTy->getElementType()); 168 else 169 return 0; 170 } else { 171 return 0; 172 } 173 } else { 174 return 0; 175 } 176 return C; 177} 178 179 180//===----------------------------------------------------------------------===// 181// Constant Folding for Calls 182// 183 184/// canConstantFoldCallTo - Return true if its even possible to fold a call to 185/// the specified function. 186bool 187llvm::canConstantFoldCallTo(Function *F) { 188 const std::string &Name = F->getName(); 189 190 switch (F->getIntrinsicID()) { 191 case Intrinsic::sqrt_f32: 192 case Intrinsic::sqrt_f64: 193 case Intrinsic::bswap_i16: 194 case Intrinsic::bswap_i32: 195 case Intrinsic::bswap_i64: 196 case Intrinsic::powi_f32: 197 case Intrinsic::powi_f64: 198 // FIXME: these should be constant folded as well 199 //case Intrinsic::ctpop_i8: 200 //case Intrinsic::ctpop_i16: 201 //case Intrinsic::ctpop_i32: 202 //case Intrinsic::ctpop_i64: 203 //case Intrinsic::ctlz_i8: 204 //case Intrinsic::ctlz_i16: 205 //case Intrinsic::ctlz_i32: 206 //case Intrinsic::ctlz_i64: 207 //case Intrinsic::cttz_i8: 208 //case Intrinsic::cttz_i16: 209 //case Intrinsic::cttz_i32: 210 //case Intrinsic::cttz_i64: 211 return true; 212 default: break; 213 } 214 215 switch (Name[0]) 216 { 217 case 'a': 218 return Name == "acos" || Name == "asin" || Name == "atan" || 219 Name == "atan2"; 220 case 'c': 221 return Name == "ceil" || Name == "cos" || Name == "cosf" || 222 Name == "cosh"; 223 case 'e': 224 return Name == "exp"; 225 case 'f': 226 return Name == "fabs" || Name == "fmod" || Name == "floor"; 227 case 'l': 228 return Name == "log" || Name == "log10"; 229 case 'p': 230 return Name == "pow"; 231 case 's': 232 return Name == "sin" || Name == "sinh" || 233 Name == "sqrt" || Name == "sqrtf"; 234 case 't': 235 return Name == "tan" || Name == "tanh"; 236 default: 237 return false; 238 } 239} 240 241static Constant *ConstantFoldFP(double (*NativeFP)(double), double V, 242 const Type *Ty) { 243 errno = 0; 244 V = NativeFP(V); 245 if (errno == 0) 246 return ConstantFP::get(Ty, V); 247 errno = 0; 248 return 0; 249} 250 251/// ConstantFoldCall - Attempt to constant fold a call to the specified function 252/// with the specified arguments, returning null if unsuccessful. 253Constant * 254llvm::ConstantFoldCall(Function *F, Constant** Operands, unsigned NumOperands) { 255 const std::string &Name = F->getName(); 256 const Type *Ty = F->getReturnType(); 257 258 if (NumOperands == 1) { 259 if (ConstantFP *Op = dyn_cast<ConstantFP>(Operands[0])) { 260 double V = Op->getValue(); 261 switch (Name[0]) 262 { 263 case 'a': 264 if (Name == "acos") 265 return ConstantFoldFP(acos, V, Ty); 266 else if (Name == "asin") 267 return ConstantFoldFP(asin, V, Ty); 268 else if (Name == "atan") 269 return ConstantFP::get(Ty, atan(V)); 270 break; 271 case 'c': 272 if (Name == "ceil") 273 return ConstantFoldFP(ceil, V, Ty); 274 else if (Name == "cos") 275 return ConstantFP::get(Ty, cos(V)); 276 else if (Name == "cosh") 277 return ConstantFP::get(Ty, cosh(V)); 278 break; 279 case 'e': 280 if (Name == "exp") 281 return ConstantFP::get(Ty, exp(V)); 282 break; 283 case 'f': 284 if (Name == "fabs") 285 return ConstantFP::get(Ty, fabs(V)); 286 else if (Name == "floor") 287 return ConstantFoldFP(floor, V, Ty); 288 break; 289 case 'l': 290 if (Name == "log" && V > 0) 291 return ConstantFP::get(Ty, log(V)); 292 else if (Name == "log10" && V > 0) 293 return ConstantFoldFP(log10, V, Ty); 294 else if (Name == "llvm.sqrt.f32" || Name == "llvm.sqrt.f64") { 295 if (V >= -0.0) 296 return ConstantFP::get(Ty, sqrt(V)); 297 else // Undefined 298 return ConstantFP::get(Ty, 0.0); 299 } 300 break; 301 case 's': 302 if (Name == "sin") 303 return ConstantFP::get(Ty, sin(V)); 304 else if (Name == "sinh") 305 return ConstantFP::get(Ty, sinh(V)); 306 else if (Name == "sqrt" && V >= 0) 307 return ConstantFP::get(Ty, sqrt(V)); 308 else if (Name == "sqrtf" && V >= 0) 309 return ConstantFP::get(Ty, sqrt((float)V)); 310 break; 311 case 't': 312 if (Name == "tan") 313 return ConstantFP::get(Ty, tan(V)); 314 else if (Name == "tanh") 315 return ConstantFP::get(Ty, tanh(V)); 316 break; 317 default: 318 break; 319 } 320 } else if (ConstantInt *Op = dyn_cast<ConstantInt>(Operands[0])) { 321 uint64_t V = Op->getZExtValue(); 322 if (Name == "llvm.bswap.i16") 323 return ConstantInt::get(Ty, ByteSwap_16(V)); 324 else if (Name == "llvm.bswap.i32") 325 return ConstantInt::get(Ty, ByteSwap_32(V)); 326 else if (Name == "llvm.bswap.i64") 327 return ConstantInt::get(Ty, ByteSwap_64(V)); 328 } 329 } else if (NumOperands == 2) { 330 if (ConstantFP *Op1 = dyn_cast<ConstantFP>(Operands[0])) { 331 double Op1V = Op1->getValue(); 332 if (ConstantFP *Op2 = dyn_cast<ConstantFP>(Operands[1])) { 333 double Op2V = Op2->getValue(); 334 335 if (Name == "pow") { 336 errno = 0; 337 double V = pow(Op1V, Op2V); 338 if (errno == 0) 339 return ConstantFP::get(Ty, V); 340 } else if (Name == "fmod") { 341 errno = 0; 342 double V = fmod(Op1V, Op2V); 343 if (errno == 0) 344 return ConstantFP::get(Ty, V); 345 } else if (Name == "atan2") { 346 return ConstantFP::get(Ty, atan2(Op1V,Op2V)); 347 } 348 } else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) { 349 if (Name == "llvm.powi.f32") { 350 return ConstantFP::get(Ty, std::pow((float)Op1V, 351 (int)Op2C->getZExtValue())); 352 } else if (Name == "llvm.powi.f64") { 353 return ConstantFP::get(Ty, std::pow((double)Op1V, 354 (int)Op2C->getZExtValue())); 355 } 356 } 357 } 358 } 359 return 0; 360} 361 362