Skip to content

Commit

Permalink
[ARM] Fix computeKnownBits for ARMISD::CMOV
Browse files Browse the repository at this point in the history
Summary:
The true and false operands for the CMOV are operands 0 and 1.
ARMISelLowering.cpp::computeKnownBits was looking at operands 1 and 2
instead.  This can cause CMOV instructions to be incorrectly folded into
BFI if value set by the CMOV is another CMOV, whose known bits are
computed incorrectly.

This patch fixes the issue and adds a test case.

Reviewers: kristof.beyls, jmolloy

Subscribers: llvm-commits, aemerson, srhines, rengolin

Differential Revision: https://reviews.llvm.org/D31265

llvm-svn: 298624
  • Loading branch information
pirama-arumuga-nainar committed Mar 23, 2017
1 parent 997a15c commit bc26482
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
4 changes: 2 additions & 2 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Expand Up @@ -11695,8 +11695,8 @@ static void computeKnownBits(SelectionDAG &DAG, SDValue Op, APInt &KnownZero,
if (Op.getOpcode() == ARMISD::CMOV) {
APInt KZ2(KnownZero.getBitWidth(), 0);
APInt KO2(KnownOne.getBitWidth(), 0);
computeKnownBits(DAG, Op.getOperand(1), KnownZero, KnownOne);
computeKnownBits(DAG, Op.getOperand(2), KZ2, KO2);
computeKnownBits(DAG, Op.getOperand(0), KnownZero, KnownOne);
computeKnownBits(DAG, Op.getOperand(1), KZ2, KO2);

KnownZero &= KZ2;
KnownOne &= KO2;
Expand Down
19 changes: 19 additions & 0 deletions llvm/test/CodeGen/ARM/no-cmov2bfi.ll
@@ -0,0 +1,19 @@
; RUN: llc < %s -mtriple=thumbv7 | FileCheck --check-prefix=CHECK-NOBFI %s

declare zeroext i1 @dummy()

define i8 @test(i8 %a1, i1 %c) {
; CHECK-NOBFI-NOT: bfi
; CHECK-NOBFI: bl dummy
; CHECK-NOBFI: cmp r0, #0
; CHECK-NOBFI: it ne
; CHECK-NOBFI: orrne [[REG:r[0-9]+]], [[REG]], #8
; CHECK-NOBFI: mov r0, [[REG]]

%1 = and i8 %a1, -9
%2 = select i1 %c, i8 %1, i8 %a1
%3 = tail call zeroext i1 @dummy()
%4 = or i8 %2, 8
%ret = select i1 %3, i8 %4, i8 %2
ret i8 %ret
}

0 comments on commit bc26482

Please sign in to comment.