From b77facd7308d07a3133bf31f0f6bf31bd8d61c08 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 17 Jan 2020 08:31:16 -0500 Subject: [PATCH] [IR] fix Constant::isElementWiseEqual() to allow for all undef elements compare We could argue that match() should be more flexible here, but I'm not sure what impact that would have on existing code. --- lib/IR/Constants.cpp | 3 ++- unittests/IR/ConstantsTest.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/IR/Constants.cpp b/lib/IR/Constants.cpp index 93d406fa2eb..79c30286736 100644 --- a/lib/IR/Constants.cpp +++ b/lib/IR/Constants.cpp @@ -296,7 +296,8 @@ bool Constant::isElementWiseEqual(Value *Y) const { 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()); + Constant *CmpEq = ConstantExpr::getICmp(ICmpInst::ICMP_EQ, C0, C1); + return isa(CmpEq) || match(CmpEq, m_One()); } bool Constant::containsUndefElement() const { diff --git a/unittests/IR/ConstantsTest.cpp b/unittests/IR/ConstantsTest.cpp index 7154f35ccbd..5b5e8d154c2 100644 --- a/unittests/IR/ConstantsTest.cpp +++ b/unittests/IR/ConstantsTest.cpp @@ -620,7 +620,7 @@ TEST(ConstantsTest, isElementWiseEqual) { EXPECT_TRUE(CF1211->isElementWiseEqual(CF12U1)); EXPECT_TRUE(CF12U1->isElementWiseEqual(CF1211)); - EXPECT_FALSE(CFUU1U->isElementWiseEqual(CF12U1)); // FIXME - all lanes compare as undef + EXPECT_TRUE(CFUU1U->isElementWiseEqual(CF12U1)); EXPECT_FALSE(CF12U2->isElementWiseEqual(CF12U1)); EXPECT_FALSE(CF12U1->isElementWiseEqual(CF12U2));