From: Matt Arsenault Date: Wed, 26 Feb 2020 20:05:14 +0000 (-0500) Subject: GlobalISel: Add missing add/sub with carries to MachineIRBuilder X-Git-Tag: llvmorg-12-init~12441 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b17a81f8b23b8412c1fa663c9bbe60060a494503;p=platform%2Fupstream%2Fllvm.git GlobalISel: Add missing add/sub with carries to MachineIRBuilder --- diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index 2891637..da7258b 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -468,7 +468,27 @@ public: /// /// \return The newly created instruction. MachineInstrBuilder buildUAddo(const DstOp &Res, const DstOp &CarryOut, - const SrcOp &Op0, const SrcOp &Op1); + const SrcOp &Op0, const SrcOp &Op1) { + return buildInstr(TargetOpcode::G_UADDO, {Res, CarryOut}, {Op0, Op1}); + } + + /// Build and insert \p Res, \p CarryOut = G_USUBO \p Op0, \p Op1 + MachineInstrBuilder buildUSubo(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1) { + return buildInstr(TargetOpcode::G_USUBO, {Res, CarryOut}, {Op0, Op1}); + } + + /// Build and insert \p Res, \p CarryOut = G_SADDO \p Op0, \p Op1 + MachineInstrBuilder buildSAddo(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1) { + return buildInstr(TargetOpcode::G_SADDO, {Res, CarryOut}, {Op0, Op1}); + } + + /// Build and insert \p Res, \p CarryOut = G_SUBO \p Op0, \p Op1 + MachineInstrBuilder buildSSubo(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1) { + return buildInstr(TargetOpcode::G_SSUBO, {Res, CarryOut}, {Op0, Op1}); + } /// Build and insert \p Res, \p CarryOut = G_UADDE \p Op0, /// \p Op1, \p CarryIn @@ -486,7 +506,34 @@ public: /// \return The newly created instruction. MachineInstrBuilder buildUAdde(const DstOp &Res, const DstOp &CarryOut, const SrcOp &Op0, const SrcOp &Op1, - const SrcOp &CarryIn); + const SrcOp &CarryIn) { + return buildInstr(TargetOpcode::G_UADDE, {Res, CarryOut}, + {Op0, Op1, CarryIn}); + } + + /// Build and insert \p Res, \p CarryOut = G_USUBE \p Op0, \p Op1, \p CarryInp + MachineInstrBuilder buildUSube(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1, + const SrcOp &CarryIn) { + return buildInstr(TargetOpcode::G_USUBE, {Res, CarryOut}, + {Op0, Op1, CarryIn}); + } + + /// Build and insert \p Res, \p CarryOut = G_SADDE \p Op0, \p Op1, \p CarryInp + MachineInstrBuilder buildSAdde(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1, + const SrcOp &CarryIn) { + return buildInstr(TargetOpcode::G_SADDE, {Res, CarryOut}, + {Op0, Op1, CarryIn}); + } + + /// Build and insert \p Res, \p CarryOut = G_SSUBE \p Op0, \p Op1, \p CarryInp + MachineInstrBuilder buildSSube(const DstOp &Res, const DstOp &CarryOut, + const SrcOp &Op0, const SrcOp &Op1, + const SrcOp &CarryIn) { + return buildInstr(TargetOpcode::G_SSUBE, {Res, CarryOut}, + {Op0, Op1, CarryIn}); + } /// Build and insert \p Res = G_ANYEXT \p Op0 /// diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 04e6273..ebd43d2 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -390,22 +390,6 @@ MachineInstrBuilder MachineIRBuilder::buildStore(const SrcOp &Val, return MIB; } -MachineInstrBuilder MachineIRBuilder::buildUAddo(const DstOp &Res, - const DstOp &CarryOut, - const SrcOp &Op0, - const SrcOp &Op1) { - return buildInstr(TargetOpcode::G_UADDO, {Res, CarryOut}, {Op0, Op1}); -} - -MachineInstrBuilder MachineIRBuilder::buildUAdde(const DstOp &Res, - const DstOp &CarryOut, - const SrcOp &Op0, - const SrcOp &Op1, - const SrcOp &CarryIn) { - return buildInstr(TargetOpcode::G_UADDE, {Res, CarryOut}, - {Op0, Op1, CarryIn}); -} - MachineInstrBuilder MachineIRBuilder::buildAnyExt(const DstOp &Res, const SrcOp &Op) { return buildInstr(TargetOpcode::G_ANYEXT, Res, Op); diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp index b743873..f6fed8e 100644 --- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp @@ -362,3 +362,39 @@ TEST_F(GISelMITest, BuildMerge) { EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } + +TEST_F(GISelMITest, BuildAddoSubo) { + setUp(); + if (!TM) + return; + + LLT S1 = LLT::scalar(1); + LLT S64 = LLT::scalar(64); + SmallVector Copies; + collectCopies(Copies, MF); + + auto UAddo = B.buildUAddo(S64, S1, Copies[0], Copies[1]); + auto USubo = B.buildUSubo(S64, S1, Copies[0], Copies[1]); + auto SAddo = B.buildSAddo(S64, S1, Copies[0], Copies[1]); + auto SSubo = B.buildSSubo(S64, S1, Copies[0], Copies[1]); + + B.buildUAdde(S64, S1, Copies[0], Copies[1], UAddo.getReg(1)); + B.buildUSube(S64, S1, Copies[0], Copies[1], USubo.getReg(1)); + B.buildSAdde(S64, S1, Copies[0], Copies[1], SAddo.getReg(1)); + B.buildSSube(S64, S1, Copies[0], Copies[1], SSubo.getReg(1)); + + auto CheckStr = R"( + ; CHECK: [[COPY0:%[0-9]+]]:_(s64) = COPY $x0 + ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 + ; CHECK: [[UADDO:%[0-9]+]]:_(s64), [[UADDO_FLAG:%[0-9]+]]:_(s1) = G_UADDO [[COPY0]]:_, [[COPY1]]:_ + ; CHECK: [[USUBO:%[0-9]+]]:_(s64), [[USUBO_FLAG:%[0-9]+]]:_(s1) = G_USUBO [[COPY0]]:_, [[COPY1]]:_ + ; CHECK: [[SADDO:%[0-9]+]]:_(s64), [[SADDO_FLAG:%[0-9]+]]:_(s1) = G_SADDO [[COPY0]]:_, [[COPY1]]:_ + ; CHECK: [[SSUBO:%[0-9]+]]:_(s64), [[SSUBO_FLAG:%[0-9]+]]:_(s1) = G_SSUBO [[COPY0]]:_, [[COPY1]]:_ + ; CHECK: [[UADDE:%[0-9]+]]:_(s64), [[UADDE_FLAG:%[0-9]+]]:_(s1) = G_UADDE [[COPY0]]:_, [[COPY1]]:_, [[UADDO_FLAG]] + ; CHECK: [[USUBE:%[0-9]+]]:_(s64), [[USUBE_FLAG:%[0-9]+]]:_(s1) = G_USUBE [[COPY0]]:_, [[COPY1]]:_, [[USUBO_FLAG]] + ; CHECK: [[SADDE:%[0-9]+]]:_(s64), [[SADDE_FLAG:%[0-9]+]]:_(s1) = G_SADDE [[COPY0]]:_, [[COPY1]]:_, [[SADDO_FLAG]] + ; CHECK: [[SSUBE:%[0-9]+]]:_(s64), [[SSUBE_FLAG:%[0-9]+]]:_(s1) = G_SSUBE [[COPY0]]:_, [[COPY1]]:_, [[SSUBO_FLAG]] + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +}