Index: llvm/lib/IR/Constants.cpp =================================================================== --- llvm/lib/IR/Constants.cpp +++ llvm/lib/IR/Constants.cpp @@ -287,11 +287,11 @@ return false; // They may still be identical element-wise (if they have `undef`s). - // FIXME: This crashes on FP vector constants. - return match(ConstantExpr::getICmp(ICmpInst::Predicate::ICMP_EQ, - const_cast(this), - cast(Y)), - m_One()); + // Bitcast to integer to allow exact bitwise comparison for all types. + Type *IntTy = VectorType::getInteger(cast(Ty)); + Constant *C0 = ConstantExpr::getBitCast(const_cast(this), IntTy); + Constant *C1 = ConstantExpr::getBitCast(cast(Y), IntTy); + return match(ConstantExpr::getICmp(ICmpInst::ICMP_EQ, C0, C1), m_One()); } bool Constant::containsUndefElement() const { Index: llvm/unittests/IR/ConstantsTest.cpp =================================================================== --- llvm/unittests/IR/ConstantsTest.cpp +++ llvm/unittests/IR/ConstantsTest.cpp @@ -607,7 +607,6 @@ EXPECT_FALSE(C12U1->isElementWiseEqual(C12U2)); EXPECT_FALSE(C12U21->isElementWiseEqual(C12U2)); -/* FIXME: This will crash. Type *FltTy = Type::getFloatTy(Context); Constant *CFU = UndefValue::get(FltTy); Constant *CF1 = ConstantFP::get(FltTy, 1.0); @@ -621,7 +620,6 @@ EXPECT_TRUE(CF12U1->isElementWiseEqual(CF1211)); EXPECT_FALSE(CF12U2->isElementWiseEqual(CF12U1)); EXPECT_FALSE(CF12U1->isElementWiseEqual(CF12U2)); -*/ } } // end anonymous namespace