From 2252440b81a7917543dfc08d30eee0250f62a987 Mon Sep 17 00:00:00 2001 From: Kristof Beyls Date: Thu, 5 Jan 2017 10:16:08 +0000 Subject: [PATCH] [GlobalISel] Fix AArch64 ICMP instruction selection Differential Revision: https://reviews.llvm.org/D28175 llvm-svn: 291097 --- llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp | 10 +++++++--- .../AArch64/GlobalISel/arm64-instructionselect.mir | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp index 20de07424c53..b51473524c72 100644 --- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -1071,8 +1071,12 @@ bool AArch64InstructionSelector::select(MachineInstr &I) const { return false; } - const AArch64CC::CondCode CC = changeICMPPredToAArch64CC( - (CmpInst::Predicate)I.getOperand(1).getPredicate()); + // CSINC increments the result by one when the condition code is false. + // Therefore, we have to invert the predicate to get an increment by 1 when + // the predicate is true. + const AArch64CC::CondCode invCC = + changeICMPPredToAArch64CC(CmpInst::getInversePredicate( + (CmpInst::Predicate)I.getOperand(1).getPredicate())); MachineInstr &CmpMI = *BuildMI(MBB, I, I.getDebugLoc(), TII.get(CmpOpc)) .addDef(ZReg) @@ -1084,7 +1088,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) const { .addDef(I.getOperand(0).getReg()) .addUse(AArch64::WZR) .addUse(AArch64::WZR) - .addImm(CC); + .addImm(invCC); constrainSelectedInstRegOperands(CmpMI, TII, TRI, RBI); constrainSelectedInstRegOperands(CSetMI, TII, TRI, RBI); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir index 22210e49bd77..ece5a858b49c 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir @@ -2836,13 +2836,13 @@ registers: # CHECK: body: # CHECK: %wzr = SUBSWrr %0, %0, implicit-def %nzcv -# CHECK: %1 = CSINCWr %wzr, %wzr, 0, implicit %nzcv +# CHECK: %1 = CSINCWr %wzr, %wzr, 1, implicit %nzcv # CHECK: %xzr = SUBSXrr %2, %2, implicit-def %nzcv -# CHECK: %3 = CSINCWr %wzr, %wzr, 2, implicit %nzcv +# CHECK: %3 = CSINCWr %wzr, %wzr, 3, implicit %nzcv # CHECK: %xzr = SUBSXrr %4, %4, implicit-def %nzcv -# CHECK: %5 = CSINCWr %wzr, %wzr, 1, implicit %nzcv +# CHECK: %5 = CSINCWr %wzr, %wzr, 0, implicit %nzcv body: | bb.0: