summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/Operator.h1
-rw-r--r--llvm/lib/Analysis/IVDescriptors.cpp3
-rw-r--r--llvm/unittests/IR/InstructionsTest.cpp9
3 files changed, 11 insertions, 2 deletions
diff --git a/llvm/include/llvm/IR/Operator.h b/llvm/include/llvm/IR/Operator.h
index 613d4342ef5..fefb13c66d4 100644
--- a/llvm/include/llvm/IR/Operator.h
+++ b/llvm/include/llvm/IR/Operator.h
@@ -379,6 +379,7 @@ public:
case Instruction::ExtractElement:
case Instruction::ShuffleVector:
case Instruction::InsertElement:
+ case Instruction::PHI:
return false;
default:
return V->getType()->isFPOrFPVectorTy();
diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index a452a52b94d..555e3c9ed45 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -549,9 +549,8 @@ RecurrenceDescriptor::isConditionalRdxPattern(
RecurrenceDescriptor::InstDesc
RecurrenceDescriptor::isRecurrenceInstr(Instruction *I, RecurrenceKind Kind,
InstDesc &Prev, bool HasFunNoNaNAttr) {
- bool FP = I->getType()->isFloatingPointTy();
Instruction *UAI = Prev.getUnsafeAlgebraInst();
- if (!UAI && FP && !I->isFast())
+ if (!UAI && isa<FPMathOperator>(I) && !I->isFast())
UAI = I; // Found an unsafe (unvectorizable) algebra instruction.
switch (I->getOpcode()) {
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index 94f37251e60..3b2bd6fa81b 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -993,5 +993,14 @@ TEST(InstructionsTest, SkipDebug) {
EXPECT_EQ(nullptr, Term->getNextNonDebugInstruction());
}
+TEST(InstructionsTest, PhiIsNotFPMathOperator) {
+ LLVMContext Context;
+ IRBuilder<> Builder(Context);
+ MDBuilder MDHelper(Context);
+ Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
+ EXPECT_FALSE(isa<FPMathOperator>(I));
+ I->deleteValue();
+}
+
} // end anonymous namespace
} // end namespace llvm
OpenPOWER on IntegriCloud