-
Notifications
You must be signed in to change notification settings - Fork 14.5k
[SandboxIR] Add utility function to find the base Value for Mem instructions #112030
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,6 +49,16 @@ class Utils { | |
return const_cast<Instruction *>(I); | ||
} | ||
|
||
/// \Returns the base Value for load or store instruction \p LSI. | ||
template <typename LoadOrStoreT> | ||
static Value *getMemInstructionBase(const LoadOrStoreT *LSI) { | ||
static_assert(std::is_same_v<LoadOrStoreT, LoadInst> || | ||
std::is_same_v<LoadOrStoreT, StoreInst>, | ||
"Expected sandboxir::Load or sandboxir::Store!"); | ||
return LSI->Ctx.getOrCreateValue( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. getUnderlyingObject returns an llvm::Value, getOrCreateValue converts that to a sandboxir::Value. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, but there is also a public |
||
getUnderlyingObject(LSI->getPointerOperand()->Val)); | ||
} | ||
|
||
/// \Returns the number of bits required to represent the operands or return | ||
/// value of \p V in \p DL. | ||
static unsigned getNumBits(Value *V, const DataLayout &DL) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -215,3 +215,35 @@ define void @foo(float %arg0, double %arg1, i8 %arg2, i64 %arg3, ptr %arg4) { | |
EXPECT_EQ(sandboxir::Utils::getNumBits(L2), 8u); | ||
EXPECT_EQ(sandboxir::Utils::getNumBits(L3), 64u); | ||
} | ||
|
||
TEST_F(UtilsTest, GetMemBase) { | ||
parseIR(C, R"IR( | ||
define void @foo(ptr %ptrA, float %val, ptr %ptrB) { | ||
bb: | ||
%gepA0 = getelementptr float, ptr %ptrA, i32 0 | ||
%gepA1 = getelementptr float, ptr %ptrA, i32 1 | ||
%gepB0 = getelementptr float, ptr %ptrB, i32 0 | ||
%gepB1 = getelementptr float, ptr %ptrB, i32 1 | ||
store float %val, ptr %gepA0 | ||
store float %val, ptr %gepA1 | ||
store float %val, ptr %gepB0 | ||
store float %val, ptr %gepB1 | ||
ret void | ||
} | ||
)IR"); | ||
llvm::Function &Foo = *M->getFunction("foo"); | ||
sandboxir::Context Ctx(C); | ||
sandboxir::Function *F = Ctx.createFunction(&Foo); | ||
|
||
auto It = std::next(F->begin()->begin(), 4); | ||
auto *St0 = cast<sandboxir::StoreInst>(&*It++); | ||
auto *St1 = cast<sandboxir::StoreInst>(&*It++); | ||
auto *St2 = cast<sandboxir::StoreInst>(&*It++); | ||
auto *St3 = cast<sandboxir::StoreInst>(&*It++); | ||
EXPECT_EQ(sandboxir::Utils::getMemInstructionBase(St0), | ||
sandboxir::Utils::getMemInstructionBase(St1)); | ||
EXPECT_EQ(sandboxir::Utils::getMemInstructionBase(St2), | ||
sandboxir::Utils::getMemInstructionBase(St3)); | ||
EXPECT_NE(sandboxir::Utils::getMemInstructionBase(St0), | ||
sandboxir::Utils::getMemInstructionBase(St3)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These checks are OK, but we are not actually checking what the returned value actually is. Some checks like this would also help:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. will add |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not use LLVM's name
getUnderlyingObject()
? getMemInstructionBase() is a better name, but since we are just wrapping LLVM's getUnderlyingObject() we should probably stick to the same name.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because this does more than just wrap getUnderlyingObject. It also finds the pointer operand.