Skip to content

[SandboxIR] Implement FPToUIInst #101369

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

Merged
merged 1 commit into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions llvm/include/llvm/SandboxIR/SandboxIR.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
// | |
// | +- FPToSIInst
// | |
// | +- FPToUIInst
// | |
// | +- IntToPtrInst
// | |
// | +- PtrToIntInst
Expand Down Expand Up @@ -1376,6 +1378,27 @@ class CastInst : public Instruction {
#endif
};

class FPToUIInst final : public CastInst {
public:
static Value *create(Value *Src, Type *DestTy, BBIterator WhereIt,
BasicBlock *WhereBB, Context &Ctx,
const Twine &Name = "");
static Value *create(Value *Src, Type *DestTy, Instruction *InsertBefore,
Context &Ctx, const Twine &Name = "");
static Value *create(Value *Src, Type *DestTy, BasicBlock *InsertAtEnd,
Context &Ctx, const Twine &Name = "");

static bool classof(const Value *From) {
if (auto *I = dyn_cast<Instruction>(From))
return I->getOpcode() == Opcode::FPToUI;
return false;
}
#ifndef NDEBUG
void dump(raw_ostream &OS) const final;
LLVM_DUMP_METHOD void dump() const final;
#endif // NDEBUG
};

class FPToSIInst final : public CastInst {
public:
static Value *create(Value *Src, Type *DestTy, BBIterator WhereIt,
Expand Down
28 changes: 28 additions & 0 deletions llvm/lib/SandboxIR/SandboxIR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1143,6 +1143,34 @@ void CastInst::dump() const {
}
#endif // NDEBUG

Value *FPToUIInst::create(Value *Src, Type *DestTy, BBIterator WhereIt,
BasicBlock *WhereBB, Context &Ctx,
const Twine &Name) {
return CastInst::create(DestTy, Instruction::Opcode::FPToUI, Src, WhereIt,
WhereBB, Ctx, Name);
}
Value *FPToUIInst::create(Value *Src, Type *DestTy, Instruction *InsertBefore,
Context &Ctx, const Twine &Name) {
return create(Src, DestTy, InsertBefore->getIterator(),
InsertBefore->getParent(), Ctx, Name);
}
Value *FPToUIInst::create(Value *Src, Type *DestTy, BasicBlock *InsertAtEnd,
Context &Ctx, const Twine &Name) {
return create(Src, DestTy, InsertAtEnd->end(), InsertAtEnd, Ctx, Name);
}

#ifndef NDEBUG
void FPToUIInst::dump(raw_ostream &OS) const {
dumpCommonPrefix(OS);
dumpCommonSuffix(OS);
}

void FPToUIInst::dump() const {
dump(dbgs());
dbgs() << "\n";
}
#endif // NDEBUG

Value *FPToSIInst::create(Value *Src, Type *DestTy, BBIterator WhereIt,
BasicBlock *WhereBB, Context &Ctx,
const Twine &Name) {
Expand Down
70 changes: 70 additions & 0 deletions llvm/unittests/SandboxIR/SandboxIRTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1499,6 +1499,7 @@ define void @foo(i32 %arg, float %farg, double %darg, ptr %ptr) {
EXPECT_EQ(SExt->getDestTy(), Ti64);

auto *FPToUI = cast<sandboxir::CastInst>(&*It++);
EXPECT_TRUE(isa<sandboxir::FPToUIInst>(FPToUI));
EXPECT_EQ(FPToUI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
EXPECT_EQ(FPToUI->getSrcTy(), Tfloat);
EXPECT_EQ(FPToUI->getDestTy(), Ti32);
Expand Down Expand Up @@ -1618,6 +1619,75 @@ define void @foo(i32 %arg, float %farg, double %darg, ptr %ptr) {
}
}

TEST_F(SandboxIRTest, FPToUIInst) {
parseIR(C, R"IR(
define void @foo(float %arg) {
%fptoui = fptoui float %arg to i32
ret void
}
)IR");
Function &LLVMF = *M->getFunction("foo");
sandboxir::Context Ctx(C);
sandboxir::Function *F = Ctx.createFunction(&LLVMF);
unsigned ArgIdx = 0;
auto *Arg = F->getArg(ArgIdx++);
auto *BB = &*F->begin();
auto It = BB->begin();
Type *Ti32 = Type::getInt32Ty(C);
Type *Tfloat = Type::getFloatTy(C);

auto *FPToUI = cast<sandboxir::FPToUIInst>(&*It++);
EXPECT_EQ(FPToUI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
EXPECT_EQ(FPToUI->getSrcTy(), Tfloat);
EXPECT_EQ(FPToUI->getDestTy(), Ti32);
auto *Ret = cast<sandboxir::ReturnInst>(&*It++);

{
// Check create() WhereIt, WhereBB
auto *NewI = cast<sandboxir::FPToUIInst>(
sandboxir::FPToUIInst::create(Arg, Ti32, /*WhereIt=*/BB->end(),
/*WhereBB=*/BB, Ctx, "FPToUI"));
// Check getOpcode().
EXPECT_EQ(NewI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
// Check getSrcTy().
EXPECT_EQ(NewI->getSrcTy(), Arg->getType());
// Check getDestTy().
EXPECT_EQ(NewI->getDestTy(), Ti32);
// Check instr position.
EXPECT_EQ(NewI->getNextNode(), nullptr);
EXPECT_EQ(NewI->getPrevNode(), Ret);
}
{
// Check create() InsertBefore.
auto *NewI = cast<sandboxir::FPToUIInst>(
sandboxir::FPToUIInst::create(Arg, Ti32,
/*InsertBefore=*/Ret, Ctx, "FPToUI"));
// Check getOpcode().
EXPECT_EQ(NewI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
// Check getSrcTy().
EXPECT_EQ(NewI->getSrcTy(), Arg->getType());
// Check getDestTy().
EXPECT_EQ(NewI->getDestTy(), Ti32);
// Check instr position.
EXPECT_EQ(NewI->getNextNode(), Ret);
}
{
// Check create() InsertAtEnd.
auto *NewI = cast<sandboxir::FPToUIInst>(
sandboxir::FPToUIInst::create(Arg, Ti32,
/*InsertAtEnd=*/BB, Ctx, "FPToUI"));
// Check getOpcode().
EXPECT_EQ(NewI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
// Check getSrcTy().
EXPECT_EQ(NewI->getSrcTy(), Arg->getType());
// Check getDestTy().
EXPECT_EQ(NewI->getDestTy(), Ti32);
// Check instr position.
EXPECT_EQ(NewI->getNextNode(), nullptr);
EXPECT_EQ(NewI->getParent(), BB);
}
}

TEST_F(SandboxIRTest, FPToSIInst) {
parseIR(C, R"IR(
define void @foo(float %arg) {
Expand Down
Loading