Index: llvm/lib/CodeGen/StackProtector.cpp =================================================================== --- llvm/lib/CodeGen/StackProtector.cpp +++ llvm/lib/CodeGen/StackProtector.cpp @@ -158,33 +158,42 @@ bool StackProtector::HasAddressTaken(const Instruction *AI) { for (const User *U : AI->users()) { - if (const StoreInst *SI = dyn_cast(U)) { - if (AI == SI->getValueOperand()) + const auto *I = cast(U); + switch (I->getOpcode()) { + case Instruction::Store: + if (AI == cast(I)->getValueOperand()) return true; - } else if (const PtrToIntInst *SI = dyn_cast(U)) { - if (AI == SI->getOperand(0)) + break; + case Instruction::PtrToInt: + if (AI == cast(I)->getOperand(0)) return true; - } else if (const CallInst *CI = dyn_cast(U)) { + break; + case Instruction::Call: { // Ignore intrinsics that are not calls. TODO: Use isLoweredToCall(). + const auto *CI = cast(I); if (!isa(CI) && !CI->isLifetimeStartOrEnd()) return true; - } else if (isa(U)) { + break; + } + case Instruction::Invoke: return true; - } else if (const SelectInst *SI = dyn_cast(U)) { - if (HasAddressTaken(SI)) + case Instruction::BitCast: + case Instruction::GetElementPtr: + case Instruction::Select: + if (HasAddressTaken(I)) return true; - } else if (const PHINode *PN = dyn_cast(U)) { + break; + case Instruction::PHI: { // Keep track of what PHI nodes we have already visited to ensure // they are only visited once. + const auto *PN = cast(I); if (VisitedPHIs.insert(PN).second) if (HasAddressTaken(PN)) return true; - } else if (const GetElementPtrInst *GEP = dyn_cast(U)) { - if (HasAddressTaken(GEP)) - return true; - } else if (const BitCastInst *BI = dyn_cast(U)) { - if (HasAddressTaken(BI)) - return true; + break; + } + default: + break; } } return false;