From: Simon Dardis Date: Tue, 16 Aug 2016 17:16:11 +0000 (+0000) Subject: [mips] Enforce compact branch restrictions X-Git-Tag: llvmorg-4.0.0-rc1~12310 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4893aff94ed2acbef2ff91592a423195baee47dc;p=platform%2Fupstream%2Fllvm.git [mips] Enforce compact branch restrictions Check both operands for use of the $zero register which cannot be used with a compact branch instruction. Reviewers: dsanders, vkalintris Differential Review: https://reviews.llvm.org/D23547 llvm-svn: 278824 --- diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.cpp b/llvm/lib/Target/Mips/MipsInstrInfo.cpp index c317ecb..aedb8a4 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.cpp +++ b/llvm/lib/Target/Mips/MipsInstrInfo.cpp @@ -426,14 +426,19 @@ MipsInstrInfo::genInstrWithNewOpc(unsigned NewOpc, // Certain branches have two forms: e.g beq $1, $zero, dest vs beqz $1, dest // Pick the zero form of the branch for readable assembly and for greater // branch distance in non-microMIPS mode. + // Additional MIPSR6 does not permit the use of register $zero for compact + // branches. // FIXME: Certain atomic sequences on mips64 generate 32bit references to // Mips::ZERO, which is incorrect. This test should be updated to use // Subtarget.getABI().GetZeroReg() when those atomic sequences and others // are fixed. - bool BranchWithZeroOperand = - (I->isBranch() && !I->isPseudo() && I->getOperand(1).isReg() && - (I->getOperand(1).getReg() == Mips::ZERO || - I->getOperand(1).getReg() == Mips::ZERO_64)); + int ZeroOperandPosition = -1; + bool BranchWithZeroOperand = false; + if (I->isBranch() && !I->isPseudo()) { + auto TRI = I->getParent()->getParent()->getSubtarget().getRegisterInfo(); + ZeroOperandPosition = I->findRegisterUseOperandIdx(Mips::ZERO, false, TRI); + BranchWithZeroOperand = ZeroOperandPosition != -1; + } if (BranchWithZeroOperand) { switch (NewOpc) { @@ -476,17 +481,11 @@ MipsInstrInfo::genInstrWithNewOpc(unsigned NewOpc, MIB.addImm(0); - } else if (BranchWithZeroOperand) { - // For MIPSR6 and microMIPS branches with an explicit zero operand, copy - // everything after the zero. - MIB.addOperand(I->getOperand(0)); - - for (unsigned J = 2, E = I->getDesc().getNumOperands(); J < E; ++J) { - MIB.addOperand(I->getOperand(J)); - } } else { - // All other cases copy all other operands. for (unsigned J = 0, E = I->getDesc().getNumOperands(); J < E; ++J) { + if (BranchWithZeroOperand && (unsigned)ZeroOperandPosition == J) + continue; + MIB.addOperand(I->getOperand(J)); } } diff --git a/llvm/test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll b/llvm/test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll index 969e3cb..7a9f287 100644 --- a/llvm/test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll +++ b/llvm/test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll @@ -100,3 +100,31 @@ define i64 @f5(i64 %a, i64 %b) { if.end: ret i64 0 } + +define i32 @f6(i32 %a) { +; CHECK-LABEL: f6: +; CHECK: beqzc ${{[0-9]+}}, $BB + + %cmp = icmp eq i32 %a, 0 + br i1 %cmp, label %if.then, label %if.end + + if.then: + ret i32 1 + + if.end: + ret i32 0 +} + +define i32 @f7(i32 %a) { +; CHECK-LABEL: f7: +; CHECK: bnezc ${{[0-9]+}}, $BB + + %cmp = icmp eq i32 0, %a + br i1 %cmp, label %if.then, label %if.end + + if.then: + ret i32 1 + + if.end: + ret i32 0 +}