[llvm] [SandboxIR] Add remaining SelectInst methods and track swapValues() (PR #108114)
Jorge Gorbe Moya via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 11 11:36:34 PDT 2024
https://github.com/slackito updated https://github.com/llvm/llvm-project/pull/108114
>From 7a12904650cd0b80945b6e7a2d529698a4041cd1 Mon Sep 17 00:00:00 2001
From: Jorge Gorbe Moya <jgorbe at google.com>
Date: Tue, 10 Sep 2024 16:41:00 -0700
Subject: [PATCH 1/3] [SandboxIR] Add remaining SelectInst methods and track
swapValues()
---
llvm/include/llvm/SandboxIR/SandboxIR.h | 15 ++++++++++++-
llvm/lib/SandboxIR/SandboxIR.cpp | 6 +++++
llvm/unittests/SandboxIR/SandboxIRTest.cpp | 11 +++++++++
llvm/unittests/SandboxIR/TrackerTest.cpp | 26 ++++++++++++++++++++++
4 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/SandboxIR/SandboxIR.h b/llvm/include/llvm/SandboxIR/SandboxIR.h
index 2fdbbbd094650f..1e3de9e2d1d089 100644
--- a/llvm/include/llvm/SandboxIR/SandboxIR.h
+++ b/llvm/include/llvm/SandboxIR/SandboxIR.h
@@ -1506,6 +1506,10 @@ class SelectInst : public SingleLLVMInstructionImpl<llvm::SelectInst> {
static Value *create(Value *Cond, Value *True, Value *False,
BasicBlock *InsertAtEnd, Context &Ctx,
const Twine &Name = "");
+
+ const Value* getCondition() const { return getOperand(0); }
+ const Value* getTrueValue() const { return getOperand(1); }
+ const Value* getFalseValue() const { return getOperand(2); }
Value *getCondition() { return getOperand(0); }
Value *getTrueValue() { return getOperand(1); }
Value *getFalseValue() { return getOperand(2); }
@@ -1513,7 +1517,16 @@ class SelectInst : public SingleLLVMInstructionImpl<llvm::SelectInst> {
void setCondition(Value *New) { setOperand(0, New); }
void setTrueValue(Value *New) { setOperand(1, New); }
void setFalseValue(Value *New) { setOperand(2, New); }
- void swapValues() { cast<llvm::SelectInst>(Val)->swapValues(); }
+ void swapValues();
+
+ /// Return a string if the specified operands are invalid for a select
+ /// operation, otherwise return null.
+ static const char *areInvalidOperands(Value *Cond, Value *True,
+ Value *False) {
+ return llvm::SelectInst::areInvalidOperands(Cond->Val, True->Val,
+ False->Val);
+ }
+
/// For isa/dyn_cast.
static bool classof(const Value *From);
};
diff --git a/llvm/lib/SandboxIR/SandboxIR.cpp b/llvm/lib/SandboxIR/SandboxIR.cpp
index 18fdcda15a1a91..df3839518c9d08 100644
--- a/llvm/lib/SandboxIR/SandboxIR.cpp
+++ b/llvm/lib/SandboxIR/SandboxIR.cpp
@@ -662,6 +662,12 @@ Value *SelectInst::create(Value *Cond, Value *True, Value *False,
return createCommon(Cond, True, False, Name, Builder, Ctx);
}
+void SelectInst::swapValues() {
+ Ctx.getTracker().emplaceIfTracking<UseSwap>(getOperandUse(1),
+ getOperandUse(2));
+ cast<llvm::SelectInst>(Val)->swapValues();
+}
+
bool SelectInst::classof(const Value *From) {
return From->getSubclassID() == ClassID::Select;
}
diff --git a/llvm/unittests/SandboxIR/SandboxIRTest.cpp b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
index b76d24dc297b96..dbec60496b7a54 100644
--- a/llvm/unittests/SandboxIR/SandboxIRTest.cpp
+++ b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
@@ -1354,14 +1354,18 @@ define void @foo(i1 %c0, i8 %v0, i8 %v1, i1 %c1) {
auto *BB = &*F->begin();
auto It = BB->begin();
auto *Select = cast<sandboxir::SelectInst>(&*It++);
+ const auto *ConstSelect = Select; // To test the const getters.
auto *Ret = &*It++;
// Check getCondition().
EXPECT_EQ(Select->getCondition(), Cond0);
+ EXPECT_EQ(ConstSelect->getCondition(), Cond0);
// Check getTrueValue().
EXPECT_EQ(Select->getTrueValue(), V0);
+ EXPECT_EQ(ConstSelect->getTrueValue(), V0);
// Check getFalseValue().
EXPECT_EQ(Select->getFalseValue(), V1);
+ EXPECT_EQ(ConstSelect->getFalseValue(), V1);
// Check setCondition().
Select->setCondition(Cond1);
EXPECT_EQ(Select->getCondition(), Cond1);
@@ -1371,6 +1375,13 @@ define void @foo(i1 %c0, i8 %v0, i8 %v1, i1 %c1) {
// Check setFalseValue().
Select->setFalseValue(V0);
EXPECT_EQ(Select->getFalseValue(), V0);
+ // Check swapValues().
+ Select->swapValues();
+ EXPECT_EQ(Select->getTrueValue(), V0);
+ EXPECT_EQ(Select->getFalseValue(), V1);
+ // Check areInvalidOperands.
+ EXPECT_EQ(sandboxir::SelectInst::areInvalidOperands(Cond, V0, V1), nullptr);
+ EXPECT_NE(sandboxir::SelectInst::areInvalidOperands(V0, V1, Cond), nullptr);
{
// Check SelectInst::create() InsertBefore.
diff --git a/llvm/unittests/SandboxIR/TrackerTest.cpp b/llvm/unittests/SandboxIR/TrackerTest.cpp
index a1f39fe958e351..a1a4117b5e97b1 100644
--- a/llvm/unittests/SandboxIR/TrackerTest.cpp
+++ b/llvm/unittests/SandboxIR/TrackerTest.cpp
@@ -964,6 +964,32 @@ define void @foo(i32 %cond0, i32 %cond1) {
EXPECT_EQ(Switch->findCaseDest(BB1), One);
}
+TEST_F(TrackerTest, SelectInst) {
+ parseIR(C, R"IR(
+define void @foo(i1 %c0, i8 %v0, i8 %v1) {
+ %sel = select i1 %c0, i8 %v0, i8 %v1
+ ret void
+}
+)IR");
+ llvm::Function *LLVMF = &*M->getFunction("foo");
+ sandboxir::Context Ctx(C);
+ sandboxir::Function *F = Ctx.createFunction(LLVMF);
+ auto *V0 = F->getArg(1);
+ auto *V1 = F->getArg(2);
+ auto *BB = &*F->begin();
+ auto It = BB->begin();
+ auto *Select = cast<sandboxir::SelectInst>(&*It++);
+
+ // Check tracking for swapValues.
+ Ctx.save();
+ Select->swapValues();
+ EXPECT_EQ(Select->getTrueValue(), V1);
+ EXPECT_EQ(Select->getFalseValue(), V0);
+ Ctx.revert();
+ EXPECT_EQ(Select->getTrueValue(), V0);
+ EXPECT_EQ(Select->getFalseValue(), V1);
+}
+
TEST_F(TrackerTest, ShuffleVectorInst) {
parseIR(C, R"IR(
define void @foo(<2 x i8> %v1, <2 x i8> %v2) {
>From 279b6b9f5a2fe51c32ad19696291af7af09f8764 Mon Sep 17 00:00:00 2001
From: Jorge Gorbe Moya <jgorbe at google.com>
Date: Tue, 10 Sep 2024 16:58:08 -0700
Subject: [PATCH 2/3] clang-format
---
llvm/include/llvm/SandboxIR/SandboxIR.h | 6 +++---
llvm/unittests/SandboxIR/SandboxIRTest.cpp | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/SandboxIR/SandboxIR.h b/llvm/include/llvm/SandboxIR/SandboxIR.h
index 1e3de9e2d1d089..88884683f591a4 100644
--- a/llvm/include/llvm/SandboxIR/SandboxIR.h
+++ b/llvm/include/llvm/SandboxIR/SandboxIR.h
@@ -1507,9 +1507,9 @@ class SelectInst : public SingleLLVMInstructionImpl<llvm::SelectInst> {
BasicBlock *InsertAtEnd, Context &Ctx,
const Twine &Name = "");
- const Value* getCondition() const { return getOperand(0); }
- const Value* getTrueValue() const { return getOperand(1); }
- const Value* getFalseValue() const { return getOperand(2); }
+ const Value *getCondition() const { return getOperand(0); }
+ const Value *getTrueValue() const { return getOperand(1); }
+ const Value *getFalseValue() const { return getOperand(2); }
Value *getCondition() { return getOperand(0); }
Value *getTrueValue() { return getOperand(1); }
Value *getFalseValue() { return getOperand(2); }
diff --git a/llvm/unittests/SandboxIR/SandboxIRTest.cpp b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
index dbec60496b7a54..b5146807626745 100644
--- a/llvm/unittests/SandboxIR/SandboxIRTest.cpp
+++ b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
@@ -1354,7 +1354,7 @@ define void @foo(i1 %c0, i8 %v0, i8 %v1, i1 %c1) {
auto *BB = &*F->begin();
auto It = BB->begin();
auto *Select = cast<sandboxir::SelectInst>(&*It++);
- const auto *ConstSelect = Select; // To test the const getters.
+ const auto *ConstSelect = Select; // To test the const getters.
auto *Ret = &*It++;
// Check getCondition().
>From 515b21edc3bded856465c358893ed5e837dd26e7 Mon Sep 17 00:00:00 2001
From: Jorge Gorbe Moya <jgorbe at google.com>
Date: Wed, 11 Sep 2024 11:36:07 -0700
Subject: [PATCH 3/3] fix build
---
llvm/unittests/SandboxIR/SandboxIRTest.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/unittests/SandboxIR/SandboxIRTest.cpp b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
index b5146807626745..148afd9483d568 100644
--- a/llvm/unittests/SandboxIR/SandboxIRTest.cpp
+++ b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
@@ -1380,8 +1380,8 @@ define void @foo(i1 %c0, i8 %v0, i8 %v1, i1 %c1) {
EXPECT_EQ(Select->getTrueValue(), V0);
EXPECT_EQ(Select->getFalseValue(), V1);
// Check areInvalidOperands.
- EXPECT_EQ(sandboxir::SelectInst::areInvalidOperands(Cond, V0, V1), nullptr);
- EXPECT_NE(sandboxir::SelectInst::areInvalidOperands(V0, V1, Cond), nullptr);
+ EXPECT_EQ(sandboxir::SelectInst::areInvalidOperands(Cond0, V0, V1), nullptr);
+ EXPECT_NE(sandboxir::SelectInst::areInvalidOperands(V0, V1, Cond0), nullptr);
{
// Check SelectInst::create() InsertBefore.
More information about the llvm-commits
mailing list