From: Nico Weber Date: Wed, 29 Jun 2016 17:33:41 +0000 (+0000) Subject: Revert r272251, it caused PR28348. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7925338a8e28852078d69aee8e01bf2b5c5cc54e;p=llvm Revert r272251, it caused PR28348. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274141 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index 7360210ff99..a7871ea8db5 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -2820,45 +2820,6 @@ void ARMDAGToDAGISel::Select(SDNode *N) { if (tryV6T2BitfieldExtractOp(N, false)) return; - // If an immediate is used in an AND node, it is possible that the immediate - // can be more optimally materialized when negated. If this is the case we - // can negate the immediate and use a BIC instead. - auto *N1C = dyn_cast(N->getOperand(1)); - if (N1C && N1C->hasOneUse() && Subtarget->isThumb()) { - uint32_t Imm = (uint32_t) N1C->getZExtValue(); - - // In Thumb2 mode, an AND can take a 12-bit immediate. If this - // immediate can be negated and fit in the immediate operand of - // a t2BIC, don't do any manual transform here as this can be - // handled by the generic ISel machinery. - bool PreferImmediateEncoding = - Subtarget->hasThumb2() && !is_t2_so_imm(Imm) && is_t2_so_imm_not(Imm); - if (!PreferImmediateEncoding && - ConstantMaterializationCost(Imm) > - ConstantMaterializationCost(~Imm)) { - // The current immediate costs more to materialize than a negated - // immediate, so negate the immediate and use a BIC. - SDValue NewImm = - CurDAG->getConstant(~N1C->getZExtValue(), dl, MVT::i32); - CurDAG->RepositionNode(N->getIterator(), NewImm.getNode()); - - if (!Subtarget->hasThumb2()) { - SDValue Ops[] = {CurDAG->getRegister(ARM::CPSR, MVT::i32), - N->getOperand(0), NewImm, getAL(CurDAG, dl), - CurDAG->getRegister(0, MVT::i32)}; - ReplaceNode(N, CurDAG->getMachineNode(ARM::tBIC, dl, MVT::i32, Ops)); - return; - } else { - SDValue Ops[] = {N->getOperand(0), NewImm, getAL(CurDAG, dl), - CurDAG->getRegister(0, MVT::i32), - CurDAG->getRegister(0, MVT::i32)}; - ReplaceNode(N, - CurDAG->getMachineNode(ARM::t2BICrr, dl, MVT::i32, Ops)); - return; - } - } - } - // (and (or x, c2), c1) and top 16-bits of c1 and c2 match, lower 16-bits // of c1 are 0xffff, and lower 16-bit of c2 are 0. That is, the top 16-bits // are entirely contributed by c2 and lower 16-bits are entirely contributed @@ -2873,7 +2834,7 @@ void ARMDAGToDAGISel::Select(SDNode *N) { if (!Opc) break; SDValue N0 = N->getOperand(0), N1 = N->getOperand(1); - N1C = dyn_cast(N1); + ConstantSDNode *N1C = dyn_cast(N1); if (!N1C) break; if (N0.getOpcode() == ISD::OR && N0.getNode()->hasOneUse()) { diff --git a/test/CodeGen/Thumb/bic_imm.ll b/test/CodeGen/Thumb/bic_imm.ll deleted file mode 100644 index 6a48cb6f63b..00000000000 --- a/test/CodeGen/Thumb/bic_imm.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=cortex-m0 -verify-machineinstrs | FileCheck --check-prefix CHECK-T1 %s -; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -mcpu=cortex-m3 -verify-machineinstrs | FileCheck --check-prefix CHECK-T2 %s - -; CHECK-T1-LABEL: @i -; CHECK-T2-LABEL: @i -; CHECK-T1: movs r1, #255 -; CHECK-T1: adds r1, #20 -; CHECK-T1: bics r0, r1 -; CHECK-T2: movw r1, #275 -; CHECK-T2: bics r0, r1 -define i32 @i(i32 %a) { -entry: - %and = and i32 %a, -276 - ret i32 %and -}