Index: lib/CodeGen/SelectionDAG/FastISel.cpp =================================================================== --- lib/CodeGen/SelectionDAG/FastISel.cpp +++ lib/CodeGen/SelectionDAG/FastISel.cpp @@ -89,6 +89,7 @@ #include "llvm/IR/Mangler.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Operator.h" +#include "llvm/IR/PatternMatch.h" #include "llvm/IR/Type.h" #include "llvm/IR/User.h" #include "llvm/IR/Value.h" @@ -110,6 +111,7 @@ #include using namespace llvm; +using namespace PatternMatch; #define DEBUG_TYPE "isel" @@ -1784,7 +1786,7 @@ return selectBinaryOp(I, ISD::SUB); case Instruction::FSub: // FNeg is currently represented in LLVM IR as a special case of FSub. - if (BinaryOperator::isFNeg(I)) + if (match(I, m_FNeg(m_Value()))) return selectFNeg(I); return selectBinaryOp(I, ISD::FSUB); case Instruction::Mul: Index: lib/Transforms/InstCombine/InstCombineCasts.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCasts.cpp +++ lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1611,9 +1611,10 @@ } } + Value *X; // (fptrunc (fneg x)) -> (fneg (fptrunc x)) - if (BinaryOperator::isFNeg(OpI)) { - Value *InnerTrunc = Builder.CreateFPTrunc(OpI->getOperand(1), Ty); + if (match(OpI, m_FNeg(m_Value(X)))) { + Value *InnerTrunc = Builder.CreateFPTrunc(X, Ty); return BinaryOperator::CreateFNegFMF(InnerTrunc, OpI); } } Index: lib/Transforms/InstCombine/InstCombineInternal.h =================================================================== --- lib/Transforms/InstCombine/InstCombineInternal.h +++ lib/Transforms/InstCombine/InstCombineInternal.h @@ -83,7 +83,7 @@ static inline unsigned getComplexity(Value *V) { if (isa(V)) { if (isa(V) || BinaryOperator::isNeg(V) || - BinaryOperator::isFNeg(V) || BinaryOperator::isNot(V)) + match(V, m_FNeg(m_Value())) || BinaryOperator::isNot(V)) return 4; return 5; }