Skip to content

Commit f9392fc

Browse files
authored
[SandboxIR] Implement UnaryInstruction class (#101541)
This patch implements sandboxir::UnaryInstruction class and updates sandboxir::LoadInst and sandboxir::CastInst to inherit from it instead of sandboxir::Instruction.
1 parent 7f19686 commit f9392fc

File tree

2 files changed

+67
-20
lines changed

2 files changed

+67
-20
lines changed

llvm/include/llvm/SandboxIR/SandboxIR.h

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@
6464
// |
6565
// +- InsertElementInst
6666
// |
67-
// +- LoadInst
68-
// |
6967
// +- OpaqueInst
7068
// |
7169
// +- PHINode
@@ -78,6 +76,10 @@
7876
// |
7977
// +- StoreInst
8078
// |
79+
// +- UnaryInstruction -+- LoadInst
80+
// | |
81+
// | +- CastInst
82+
// |
8183
// +- UnaryOperator
8284
//
8385
// Use
@@ -108,6 +110,7 @@ class Function;
108110
class Instruction;
109111
class SelectInst;
110112
class BranchInst;
113+
class UnaryInstruction;
111114
class LoadInst;
112115
class ReturnInst;
113116
class StoreInst;
@@ -836,10 +839,26 @@ class BranchInst : public Instruction {
836839
#endif
837840
};
838841

839-
class LoadInst final : public Instruction {
842+
/// An abstract class, parent of unary instructions.
843+
class UnaryInstruction : public Instruction {
844+
protected:
845+
UnaryInstruction(ClassID ID, Opcode Opc, llvm::Instruction *LLVMI,
846+
Context &Ctx)
847+
: Instruction(ID, Opc, LLVMI, Ctx) {}
848+
849+
public:
850+
static bool classof(const Instruction *I) {
851+
return isa<LoadInst>(I) || isa<CastInst>(I);
852+
}
853+
static bool classof(const Value *V) {
854+
return isa<Instruction>(V) && classof(cast<Instruction>(V));
855+
}
856+
};
857+
858+
class LoadInst final : public UnaryInstruction {
840859
/// Use LoadInst::create() instead of calling the constructor.
841860
LoadInst(llvm::LoadInst *LI, Context &Ctx)
842-
: Instruction(ClassID::Load, Opcode::Load, LI, Ctx) {}
861+
: UnaryInstruction(ClassID::Load, Opcode::Load, LI, Ctx) {}
843862
friend Context; // for LoadInst()
844863
Use getOperandUseInternal(unsigned OpIdx, bool Verify) const final {
845864
return getOperandUseDefault(OpIdx, Verify);
@@ -1371,7 +1390,7 @@ class GetElementPtrInst final : public Instruction {
13711390
#endif
13721391
};
13731392

1374-
class CastInst : public Instruction {
1393+
class CastInst : public UnaryInstruction {
13751394
static Opcode getCastOpcode(llvm::Instruction::CastOps CastOp) {
13761395
switch (CastOp) {
13771396
case llvm::Instruction::ZExt:
@@ -1408,8 +1427,9 @@ class CastInst : public Instruction {
14081427
/// Use Context::createCastInst(). Don't call the
14091428
/// constructor directly.
14101429
CastInst(llvm::CastInst *CI, Context &Ctx)
1411-
: Instruction(ClassID::Cast, getCastOpcode(CI->getOpcode()), CI, Ctx) {}
1412-
friend Context; // for SBCastInstruction()
1430+
: UnaryInstruction(ClassID::Cast, getCastOpcode(CI->getOpcode()), CI,
1431+
Ctx) {}
1432+
friend Context; // for SBCastInstruction()
14131433
friend class PtrToInt; // For constructor.
14141434
Use getOperandUseInternal(unsigned OpIdx, bool Verify) const final {
14151435
return getOperandUseDefault(OpIdx, Verify);

llvm/unittests/SandboxIR/SandboxIRTest.cpp

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ define void @foo(ptr %arg0, ptr %arg1) {
751751
auto *BB = &*F->begin();
752752
auto It = BB->begin();
753753
auto *Ld = cast<sandboxir::LoadInst>(&*It++);
754+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(Ld));
754755
auto *VLd = cast<sandboxir::LoadInst>(&*It++);
755756
auto *Ret = cast<sandboxir::ReturnInst>(&*It++);
756757

@@ -1489,79 +1490,105 @@ define void @foo(i32 %arg, float %farg, double %darg, ptr %ptr) {
14891490

14901491
// Check classof(), getOpcode(), getSrcTy(), getDstTy()
14911492
auto *ZExt = cast<sandboxir::CastInst>(&*It++);
1492-
EXPECT_TRUE(isa<sandboxir::ZExtInst>(ZExt));
1493+
auto *ZExtI = cast<sandboxir::ZExtInst>(ZExt);
1494+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(ZExtI));
1495+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(ZExtI));
14931496
EXPECT_EQ(ZExt->getOpcode(), sandboxir::Instruction::Opcode::ZExt);
14941497
EXPECT_EQ(ZExt->getSrcTy(), Ti32);
14951498
EXPECT_EQ(ZExt->getDestTy(), Ti64);
14961499

14971500
auto *SExt = cast<sandboxir::CastInst>(&*It++);
1498-
EXPECT_TRUE(isa<sandboxir::SExtInst>(SExt));
1501+
auto *SExtI = cast<sandboxir::SExtInst>(SExt);
1502+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(SExt));
1503+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(SExtI));
14991504
EXPECT_EQ(SExt->getOpcode(), sandboxir::Instruction::Opcode::SExt);
15001505
EXPECT_EQ(SExt->getSrcTy(), Ti32);
15011506
EXPECT_EQ(SExt->getDestTy(), Ti64);
15021507

15031508
auto *FPToUI = cast<sandboxir::CastInst>(&*It++);
1504-
EXPECT_TRUE(isa<sandboxir::FPToUIInst>(FPToUI));
1509+
auto *FPToUII = cast<sandboxir::FPToUIInst>(FPToUI);
1510+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPToUI));
1511+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPToUII));
15051512
EXPECT_EQ(FPToUI->getOpcode(), sandboxir::Instruction::Opcode::FPToUI);
15061513
EXPECT_EQ(FPToUI->getSrcTy(), Tfloat);
15071514
EXPECT_EQ(FPToUI->getDestTy(), Ti32);
15081515

15091516
auto *FPToSI = cast<sandboxir::CastInst>(&*It++);
1510-
EXPECT_TRUE(isa<sandboxir::FPToSIInst>(FPToSI));
1517+
auto *FPToSII = cast<sandboxir::FPToSIInst>(FPToSI);
1518+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPToSI));
1519+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPToSII));
15111520
EXPECT_EQ(FPToSI->getOpcode(), sandboxir::Instruction::Opcode::FPToSI);
15121521
EXPECT_EQ(FPToSI->getSrcTy(), Tfloat);
15131522
EXPECT_EQ(FPToSI->getDestTy(), Ti32);
15141523

15151524
auto *FPExt = cast<sandboxir::CastInst>(&*It++);
1516-
EXPECT_TRUE(isa<sandboxir::FPExtInst>(FPExt));
1525+
auto *FPExtI = cast<sandboxir::FPExtInst>(FPExt);
1526+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPExt));
1527+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPExtI));
15171528
EXPECT_EQ(FPExt->getOpcode(), sandboxir::Instruction::Opcode::FPExt);
15181529
EXPECT_EQ(FPExt->getSrcTy(), Tfloat);
15191530
EXPECT_EQ(FPExt->getDestTy(), Tdouble);
15201531

15211532
auto *PtrToInt = cast<sandboxir::CastInst>(&*It++);
1522-
EXPECT_TRUE(isa<sandboxir::PtrToIntInst>(PtrToInt));
1533+
auto *PtrToIntI = cast<sandboxir::PtrToIntInst>(PtrToInt);
1534+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(PtrToInt));
1535+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(PtrToIntI));
15231536
EXPECT_EQ(PtrToInt->getOpcode(), sandboxir::Instruction::Opcode::PtrToInt);
15241537
EXPECT_EQ(PtrToInt->getSrcTy(), Tptr);
15251538
EXPECT_EQ(PtrToInt->getDestTy(), Ti32);
15261539

15271540
auto *IntToPtr = cast<sandboxir::CastInst>(&*It++);
1528-
EXPECT_TRUE(isa<sandboxir::IntToPtrInst>(IntToPtr));
1541+
auto *IntToPtrI = cast<sandboxir::IntToPtrInst>(IntToPtr);
1542+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(IntToPtr));
1543+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(IntToPtrI));
15291544
EXPECT_EQ(IntToPtr->getOpcode(), sandboxir::Instruction::Opcode::IntToPtr);
15301545
EXPECT_EQ(IntToPtr->getSrcTy(), Ti32);
15311546
EXPECT_EQ(IntToPtr->getDestTy(), Tptr);
15321547

15331548
auto *SIToFP = cast<sandboxir::CastInst>(&*It++);
1534-
EXPECT_TRUE(isa<sandboxir::SIToFPInst>(SIToFP));
1549+
auto *SIToFPI = cast<sandboxir::SIToFPInst>(SIToFP);
1550+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(SIToFP));
1551+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(SIToFPI));
15351552
EXPECT_EQ(SIToFP->getOpcode(), sandboxir::Instruction::Opcode::SIToFP);
15361553
EXPECT_EQ(SIToFP->getSrcTy(), Ti32);
15371554
EXPECT_EQ(SIToFP->getDestTy(), Tfloat);
15381555

15391556
auto *UIToFP = cast<sandboxir::CastInst>(&*It++);
1540-
EXPECT_TRUE(isa<sandboxir::UIToFPInst>(UIToFP));
1557+
auto *UIToFPI = cast<sandboxir::UIToFPInst>(UIToFP);
1558+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(UIToFP));
1559+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(UIToFPI));
15411560
EXPECT_EQ(UIToFP->getOpcode(), sandboxir::Instruction::Opcode::UIToFP);
15421561
EXPECT_EQ(UIToFP->getSrcTy(), Ti32);
15431562
EXPECT_EQ(UIToFP->getDestTy(), Tfloat);
15441563

15451564
auto *Trunc = cast<sandboxir::CastInst>(&*It++);
1546-
EXPECT_TRUE(isa<sandboxir::TruncInst>(Trunc));
1565+
auto *TruncI = cast<sandboxir::TruncInst>(Trunc);
1566+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(Trunc));
1567+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(TruncI));
15471568
EXPECT_EQ(Trunc->getOpcode(), sandboxir::Instruction::Opcode::Trunc);
15481569
EXPECT_EQ(Trunc->getSrcTy(), Ti32);
15491570
EXPECT_EQ(Trunc->getDestTy(), Ti16);
15501571

15511572
auto *FPTrunc = cast<sandboxir::CastInst>(&*It++);
1552-
EXPECT_TRUE(isa<sandboxir::FPTruncInst>(FPTrunc));
1573+
auto *FPTruncI = cast<sandboxir::FPTruncInst>(FPTrunc);
1574+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPTrunc));
1575+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(FPTruncI));
15531576
EXPECT_EQ(FPTrunc->getOpcode(), sandboxir::Instruction::Opcode::FPTrunc);
15541577
EXPECT_EQ(FPTrunc->getSrcTy(), Tdouble);
15551578
EXPECT_EQ(FPTrunc->getDestTy(), Tfloat);
15561579

15571580
auto *BitCast = cast<sandboxir::CastInst>(&*It++);
1558-
EXPECT_TRUE(isa<sandboxir::BitCastInst>(BitCast));
1581+
auto *BitCastI = cast<sandboxir::BitCastInst>(BitCast);
1582+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(BitCast));
1583+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(BitCastI));
15591584
EXPECT_EQ(BitCast->getOpcode(), sandboxir::Instruction::Opcode::BitCast);
15601585
EXPECT_EQ(BitCast->getSrcTy(), Ti32);
15611586
EXPECT_EQ(BitCast->getDestTy(), Tfloat);
15621587

15631588
auto *AddrSpaceCast = cast<sandboxir::CastInst>(&*It++);
1564-
EXPECT_TRUE(isa<sandboxir::AddrSpaceCastInst>(AddrSpaceCast));
1589+
auto *AddrSpaceCastI = cast<sandboxir::AddrSpaceCastInst>(AddrSpaceCast);
1590+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(AddrSpaceCast));
1591+
EXPECT_TRUE(isa<sandboxir::UnaryInstruction>(AddrSpaceCastI));
15651592
EXPECT_EQ(AddrSpaceCast->getOpcode(),
15661593
sandboxir::Instruction::Opcode::AddrSpaceCast);
15671594
EXPECT_EQ(AddrSpaceCast->getSrcTy(), Tptr);

0 commit comments

Comments
 (0)