[llvm] [ARM] Replace AddLikeOrOp with add_like (PR #195573)

via llvm-commits llvm-commits at lists.llvm.org
Sun May 3 19:43:39 PDT 2026


https://github.com/LumioseSil updated https://github.com/llvm/llvm-project/pull/195573

>From d37a88f22e5bcf2bba4759296b22f3b037dcbe53 Mon Sep 17 00:00:00 2001
From: AZero13 <gfunni234 at gmail.com>
Date: Sun, 3 May 2026 21:38:33 -0400
Subject: [PATCH] [ARM] Replace AddLikeOrOp with add_like

AddLikeOrOp is redundant now that we have add_like for the patterns.
---
 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp       | 16 ++-------
 llvm/lib/Target/ARM/ARMInstrThumb.td          | 25 +++-----------
 llvm/lib/Target/ARM/ARMInstrThumb2.td         | 33 ++++++++-----------
 llvm/test/CodeGen/ARM/add-like-or.ll          |  4 +--
 llvm/test/CodeGen/ARM/combine-vmovdrr.ll      |  4 +--
 llvm/test/CodeGen/ARM/shift-combine.ll        |  8 ++---
 llvm/test/CodeGen/Thumb2/bf16-instructions.ll |  4 +--
 llvm/test/CodeGen/Thumb2/mve-vcreate.ll       |  4 +--
 llvm/test/CodeGen/Thumb2/thumb2-rev16.ll      |  8 ++---
 llvm/test/CodeGen/Thumb2/thumb2-uxtb.ll       |  4 +--
 10 files changed, 39 insertions(+), 71 deletions(-)

diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 61b679d55fb47..44f1758721a2a 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -60,13 +60,12 @@ class ARMDAGToDAGISel : public SelectionDAGISel {
   ARMDAGToDAGISel() = delete;
 
   explicit ARMDAGToDAGISel(ARMBaseTargetMachine &tm, CodeGenOptLevel OptLevel)
-      : SelectionDAGISel(tm, OptLevel) {}
+      : SelectionDAGISel(tm, OptLevel), Subtarget(nullptr) {}
 
   bool runOnMachineFunction(MachineFunction &MF) override {
     // Reset the subtarget each time through.
     Subtarget = &MF.getSubtarget<ARMSubtarget>();
-    SelectionDAGISel::runOnMachineFunction(MF);
-    return true;
+    return SelectionDAGISel::runOnMachineFunction(MF);
   }
 
   void PreprocessISelDAG() override;
@@ -106,8 +105,6 @@ class ARMDAGToDAGISel : public SelectionDAGISel {
     return SelectImmShifterOperand(N, A, B, false);
   }
 
-  bool SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out);
-
   bool SelectAddrModeImm12(SDValue N, SDValue &Base, SDValue &OffImm);
   bool SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
 
@@ -653,15 +650,6 @@ bool ARMDAGToDAGISel::SelectRegShifterOperand(SDValue N,
   return true;
 }
 
-// Determine whether an ISD::OR's operands are suitable to turn the operation
-// into an addition, which often has more compact encodings.
-bool ARMDAGToDAGISel::SelectAddLikeOr(SDNode *Parent, SDValue N, SDValue &Out) {
-  assert(Parent->getOpcode() == ISD::OR && "unexpected parent");
-  Out = N;
-  return CurDAG->haveNoCommonBitsSet(N, Parent->getOperand(1));
-}
-
-
 bool ARMDAGToDAGISel::SelectAddrModeImm12(SDValue N,
                                           SDValue &Base,
                                           SDValue &OffImm) {
diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td
index 1e2e3c30a78f7..8eb8b09ccc285 100644
--- a/llvm/lib/Target/ARM/ARMInstrThumb.td
+++ b/llvm/lib/Target/ARM/ARMInstrThumb.td
@@ -286,11 +286,6 @@ def t_addrmode_sp : MemOperand,
   let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
 }
 
-// Inspects parent to determine whether an or instruction can be implemented as
-// an add (i.e. whether we know overflow won't occur in the add).
-let WantsParent = true in
-def AddLikeOrOp : ComplexPattern<i32, 1, "SelectAddLikeOr">;
-
 // Pattern to exclude immediates from matching
 def non_imm32 : PatLeaf<(i32 GPR), [{ return !isa<ConstantSDNode>(N); }]>;
 
@@ -988,7 +983,7 @@ let isAdd = 1, hasSideEffects = 0 in {
     T1sIGenEncodeImm<0b01110, (outs tGPR:$Rd), (ins tGPR:$Rm, imm0_7:$imm3),
                      IIC_iALUi,
                      "add", "\t$Rd, $Rm, $imm3",
-                     [(set tGPR:$Rd, (add tGPR:$Rm, imm0_7:$imm3))]>,
+                     [(set tGPR:$Rd, (add_like tGPR:$Rm, imm0_7:$imm3))]>,
                      Sched<[WriteALU]> {
     bits<3> imm3;
     let Inst{8-6} = imm3;
@@ -998,16 +993,17 @@ let isAdd = 1, hasSideEffects = 0 in {
     T1sItGenEncodeImm<{1,1,0,?,?}, (outs tGPR:$Rdn),
                       (ins tGPR:$Rn, imm0_255_expr:$imm8), IIC_iALUi,
                       "add", "\t$Rdn, $imm8",
-                      [(set tGPR:$Rdn, (add tGPR:$Rn, imm0_255_expr:$imm8))]>,
+                      [(set tGPR:$Rdn, (add_like tGPR:$Rn, imm0_255_expr:$imm8))]>,
                       Sched<[WriteALU]>;
 
-  // Add register
+  // Like t2ADD ri/ri12 vs rr/rs in ARMInstrThumb2.td: Thumb1 OR is 2-address (tORR)
+  // but T1 ADD is 3-register, so keep add_like here for or_disjoint -> adds.
   let isCommutable = 1 in
   def tADDrr :                    // A8.6.6 T1
     T1sIGenEncode<0b01100, (outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm),
                   IIC_iALUr,
                   "add", "\t$Rd, $Rn, $Rm",
-                  [(set tGPR:$Rd, (add tGPR:$Rn, tGPR:$Rm))]>,
+                  [(set tGPR:$Rd, (add_like tGPR:$Rn, tGPR:$Rm))]>,
                   Sched<[WriteALU]>;
 
   /// Similar to the above except these set the 's' bit so the
@@ -1060,24 +1056,13 @@ let isAdd = 1, hasSideEffects = 0 in {
   }
 }
 
-// Thumb has more flexible short encodings for ADD than ORR, so use those where
-// possible.
-def : T1Pat<(or AddLikeOrOp:$Rn, imm0_7:$imm), (tADDi3 $Rn, imm0_7:$imm)>;
-
-def : T1Pat<(or AddLikeOrOp:$Rn, imm8_255:$imm), (tADDi8 $Rn, imm8_255:$imm)>;
-
-def : T1Pat<(or AddLikeOrOp:$Rn, tGPR:$Rm), (tADDrr $Rn, $Rm)>;
-
-
 def : tInstAlias <"add${s}${p} $Rdn, $Rm",
                  (tADDrr tGPR:$Rdn,s_cc_out:$s, tGPR:$Rdn, tGPR:$Rm, pred:$p)>;
-
 def : tInstSubst<"sub${s}${p} $rd, $rn, $imm",
                  (tADDi3 tGPR:$rd, s_cc_out:$s, tGPR:$rn, mod_imm1_7_neg:$imm, pred:$p)>;
 def : tInstSubst<"sub${s}${p} $rdn, $imm",
                  (tADDi8 tGPR:$rdn, s_cc_out:$s, mod_imm8_255_neg:$imm, pred:$p)>;
 
-
 // AND register
 let isCommutable = 1 in
 def tAND :                      // A8.6.12
diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td
index e79adb370798e..6824e4a89bce8 100644
--- a/llvm/lib/Target/ARM/ARMInstrThumb2.td
+++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td
@@ -919,7 +919,13 @@ multiclass T2I_rbin_s_is<SDNode opnode> {
 
 /// T2I_bin_ii12rs - Defines a set of (op reg, {so_imm|imm0_4095|r|so_reg})
 /// patterns for a binary operation that produces a value.
-multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, SDNode opnode,
+/// opnodeImm patterns ri / ri12 (e.g. add_like for t2ADD). opnodeReg patterns
+/// rr / rs only (typically plain add/sub): add_like on rr/rs folds disjoint or
+/// into t2ADDrr/rs and loses to cheaper lsl+add / orr+shift sequences for many
+/// shapes.
+multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc,
+                          SDPatternOperator opnodeImm,
+                          SDPatternOperator opnodeReg,
                           bit Commutable = 0> {
    // shifted imm
    // The register-immediate version is re-materializable. This is useful
@@ -945,7 +951,7 @@ multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, SDNode opnode,
    def ri : T2sTwoRegImm<
                (outs rGPR:$Rd), (ins GPRnopc:$Rn, t2_so_imm:$imm), IIC_iALUi,
                opc, ".w\t$Rd, $Rn, $imm",
-               [(set rGPR:$Rd, (opnode GPRnopc:$Rn, t2_so_imm:$imm))]>,
+               [(set rGPR:$Rd, (opnodeImm GPRnopc:$Rn, t2_so_imm:$imm))]>,
                Sched<[WriteALU, ReadALU]> {
      let Inst{31-27} = 0b11110;
      let Inst{25} = 0;
@@ -958,7 +964,7 @@ multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, SDNode opnode,
    def ri12 : T2I<
                   (outs rGPR:$Rd), (ins GPR:$Rn, imm0_4095:$imm), IIC_iALUi,
                   !strconcat(opc, "w"), "\t$Rd, $Rn, $imm",
-                  [(set rGPR:$Rd, (opnode GPR:$Rn, imm0_4095:$imm))]>,
+                  [(set rGPR:$Rd, (opnodeImm GPR:$Rn, imm0_4095:$imm))]>,
                   Sched<[WriteALU, ReadALU]> {
      bits<4> Rd;
      bits<4> Rn;
@@ -998,7 +1004,7 @@ multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, SDNode opnode,
    // register
    def rr : T2sThreeReg<(outs GPRnopc:$Rd), (ins GPRnopc:$Rn, rGPR:$Rm),
                  IIC_iALUr, opc, ".w\t$Rd, $Rn, $Rm",
-                 [(set GPRnopc:$Rd, (opnode GPRnopc:$Rn, rGPR:$Rm))]>,
+                 [(set GPRnopc:$Rd, (opnodeReg GPRnopc:$Rn, rGPR:$Rm))]>,
                  Sched<[WriteALU, ReadALU, ReadALU]> {
      let isCommutable = Commutable;
      let Inst{31-27} = 0b11101;
@@ -1013,7 +1019,7 @@ multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, SDNode opnode,
    def rs : T2sTwoRegShiftedReg<
                  (outs GPRnopc:$Rd), (ins GPRnopc:$Rn, t2_so_reg:$ShiftedRm),
                  IIC_iALUsi, opc, ".w\t$Rd, $Rn, $ShiftedRm",
-              [(set GPRnopc:$Rd, (opnode GPRnopc:$Rn, t2_so_reg:$ShiftedRm))]>,
+              [(set GPRnopc:$Rd, (opnodeReg GPRnopc:$Rn, t2_so_reg:$ShiftedRm))]>,
               Sched<[WriteALUsi, ReadALU]> {
      let Inst{31-27} = 0b11101;
      let Inst{26-25} = 0b01;
@@ -2440,8 +2446,9 @@ def : Thumb2DSPPat<(int_arm_uxtab16 rGPR:$Rn, (rotr rGPR:$Rm, rot_imm:$rot)),
 //
 
 let isAdd = 1 in
-defm t2ADD  : T2I_bin_ii12rs<0b000, "add", add, 1>;
-defm t2SUB  : T2I_bin_ii12rs<0b101, "sub", sub>;
+// ri/ri12: add_like (add | or_disjoint). rr/rs: plain add — see T2I_bin_ii12rs.
+defm t2ADD  : T2I_bin_ii12rs<0b000, "add", add_like, add, 1>;
+defm t2SUB  : T2I_bin_ii12rs<0b101, "sub", sub, sub>;
 
 // ADD and SUB with 's' bit set. No 12-bit immediate (T4) variants.
 //
@@ -3037,18 +3044,6 @@ def : T2Pat<(or      rGPR:$src, t2_so_imm_not:$imm),
 def : T2Pat<(t2_so_imm_not:$src),
             (t2MVNi t2_so_imm_not:$src)>;
 
-// There are shorter Thumb encodings for ADD than ORR, so to increase
-// Thumb2SizeReduction's chances later on we select a t2ADD for an or where
-// possible.
-def : T2Pat<(or AddLikeOrOp:$Rn, t2_so_imm:$imm),
-            (t2ADDri rGPR:$Rn, t2_so_imm:$imm)>;
-
-def : T2Pat<(or AddLikeOrOp:$Rn, imm0_4095:$Rm),
-            (t2ADDri12 rGPR:$Rn, imm0_4095:$Rm)>;
-
-def : T2Pat<(or AddLikeOrOp:$Rn, non_imm32:$Rm),
-            (t2ADDrr $Rn, $Rm)>;
-
 //===----------------------------------------------------------------------===//
 //  Multiply Instructions.
 //
diff --git a/llvm/test/CodeGen/ARM/add-like-or.ll b/llvm/test/CodeGen/ARM/add-like-or.ll
index c0ddee8388041..c99400c47ba76 100644
--- a/llvm/test/CodeGen/ARM/add-like-or.ll
+++ b/llvm/test/CodeGen/ARM/add-like-or.ll
@@ -258,8 +258,8 @@ define i32 @multiuse(i32 %i, ptr %x, ptr %y) {
 ;
 ; CHECK-T2-LABEL: multiuse:
 ; CHECK-T2:       @ %bb.0: @ %entry
-; CHECK-T2-NEXT:    lsls r0, r0, #1
-; CHECK-T2-NEXT:    adds r0, #1
+; CHECK-T2-NEXT:    movs r2, #1
+; CHECK-T2-NEXT:    orr.w r0, r2, r0, lsl #1
 ; CHECK-T2-NEXT:    ldr.w r1, [r1, r0, lsl #2]
 ; CHECK-T2-NEXT:    add r0, r1
 ; CHECK-T2-NEXT:    bx lr
diff --git a/llvm/test/CodeGen/ARM/combine-vmovdrr.ll b/llvm/test/CodeGen/ARM/combine-vmovdrr.ll
index 83cbd5902f210..8bc2d5f91b971 100644
--- a/llvm/test/CodeGen/ARM/combine-vmovdrr.ll
+++ b/llvm/test/CodeGen/ARM/combine-vmovdrr.ll
@@ -47,8 +47,8 @@ define void @dynamicIndex(ptr %addr, ptr %addr2, i32 %index) {
 ; CHECK-NEXT:    sub.w r4, r7, #8
 ; CHECK-NEXT:    lsls r0, r0, #2
 ; CHECK-NEXT:    vst1.64 {d16, d17}, [r3:128], r0
-; CHECK-NEXT:    lsls r0, r2, #1
-; CHECK-NEXT:    adds r0, #1
+; CHECK-NEXT:    movs r0, #1
+; CHECK-NEXT:    orr.w r0, r0, r2, lsl #1
 ; CHECK-NEXT:    and r0, r0, #3
 ; CHECK-NEXT:    ldr r2, [r3]
 ; CHECK-NEXT:    vldr d18, [r1]
diff --git a/llvm/test/CodeGen/ARM/shift-combine.ll b/llvm/test/CodeGen/ARM/shift-combine.ll
index 6566707b23b7a..0726dfebcf82e 100644
--- a/llvm/test/CodeGen/ARM/shift-combine.ll
+++ b/llvm/test/CodeGen/ARM/shift-combine.ll
@@ -2228,18 +2228,18 @@ define <2 x i64> @lshr_into_vsri_shift1_i64(<2 x i64> %a, <2 x i64> %b) {
 ; CHECK-V6M-NEXT:    ldr r7, [sp, #24]
 ; CHECK-V6M-NEXT:    lsrs r7, r7, #1
 ; CHECK-V6M-NEXT:    adds r6, r7, r6
-; CHECK-V6M-NEXT:    orrs r0, r6
+; CHECK-V6M-NEXT:    adds r0, r6, r0
 ; CHECK-V6M-NEXT:    ands r2, r4
 ; CHECK-V6M-NEXT:    ldr r4, [sp, #36]
 ; CHECK-V6M-NEXT:    lsls r6, r4, #31
 ; CHECK-V6M-NEXT:    ldr r7, [sp, #32]
 ; CHECK-V6M-NEXT:    lsrs r7, r7, #1
 ; CHECK-V6M-NEXT:    adds r6, r7, r6
-; CHECK-V6M-NEXT:    orrs r2, r6
+; CHECK-V6M-NEXT:    adds r2, r6, r2
 ; CHECK-V6M-NEXT:    lsrs r5, r5, #1
-; CHECK-V6M-NEXT:    orrs r1, r5
+; CHECK-V6M-NEXT:    adds r1, r5, r1
 ; CHECK-V6M-NEXT:    lsrs r4, r4, #1
-; CHECK-V6M-NEXT:    orrs r3, r4
+; CHECK-V6M-NEXT:    adds r3, r4, r3
 ; CHECK-V6M-NEXT:    add sp, #4
 ; CHECK-V6M-NEXT:    pop {r4, r5, r6, r7, pc}
 bb1:
diff --git a/llvm/test/CodeGen/Thumb2/bf16-instructions.ll b/llvm/test/CodeGen/Thumb2/bf16-instructions.ll
index de4c1bce22bcd..c6895238b37ca 100644
--- a/llvm/test/CodeGen/Thumb2/bf16-instructions.ll
+++ b/llvm/test/CodeGen/Thumb2/bf16-instructions.ll
@@ -2076,7 +2076,7 @@ define bfloat @test_copysign(bfloat %a, bfloat %b) {
 ; CHECK-FP-NEXT:    vmov r1, s1
 ; CHECK-FP-NEXT:    and r1, r1, #32768
 ; CHECK-FP-NEXT:    bfc r0, #15, #17
-; CHECK-FP-NEXT:    add r0, r1
+; CHECK-FP-NEXT:    orrs r0, r1
 ; CHECK-FP-NEXT:    vmov.f16 s0, r0
 ; CHECK-FP-NEXT:    vmov.f16 r0, s0
 ; CHECK-FP-NEXT:    vmov s0, r0
@@ -2152,7 +2152,7 @@ define float @test_copysign_extended(bfloat %a, bfloat %b) {
 ; CHECK-FP-NEXT:    vmov r1, s1
 ; CHECK-FP-NEXT:    and r1, r1, #32768
 ; CHECK-FP-NEXT:    bfc r0, #15, #17
-; CHECK-FP-NEXT:    add r0, r1
+; CHECK-FP-NEXT:    orrs r0, r1
 ; CHECK-FP-NEXT:    lsls r0, r0, #16
 ; CHECK-FP-NEXT:    vmov s0, r0
 ; CHECK-FP-NEXT:    bx lr
diff --git a/llvm/test/CodeGen/Thumb2/mve-vcreate.ll b/llvm/test/CodeGen/Thumb2/mve-vcreate.ll
index 7e68cea23e949..457da520f0f41 100644
--- a/llvm/test/CodeGen/Thumb2/mve-vcreate.ll
+++ b/llvm/test/CodeGen/Thumb2/mve-vcreate.ll
@@ -338,7 +338,7 @@ define hidden <16 x i8> @create_i8(i8 zeroext %a1, i8 zeroext %b1, i8 zeroext %c
 ; CHECK-NEXT:    lsl.w r4, r10, #16
 ; CHECK-NEXT:    orr.w r0, r4, r0, lsl #22
 ; CHECK-NEXT:    orr.w r0, r0, r2, lsl #8
-; CHECK-NEXT:    add r0, r8
+; CHECK-NEXT:    orr.w r0, r0, r8
 ; CHECK-NEXT:    orrs r0, r7
 ; CHECK-NEXT:    orr.w r0, r0, r11
 ; CHECK-NEXT:    orr.w r2, r0, r3
@@ -349,7 +349,7 @@ define hidden <16 x i8> @create_i8(i8 zeroext %a1, i8 zeroext %b1, i8 zeroext %c
 ; CHECK-NEXT:    ldr r3, [sp, #60]
 ; CHECK-NEXT:    orr.w r0, r0, r3, lsl #8
 ; CHECK-NEXT:    ldr r3, [sp, #64]
-; CHECK-NEXT:    add r0, r3
+; CHECK-NEXT:    orrs r0, r3
 ; CHECK-NEXT:    orrs r0, r1
 ; CHECK-NEXT:    mov r1, r2
 ; CHECK-NEXT:    orrs r0, r5
diff --git a/llvm/test/CodeGen/Thumb2/thumb2-rev16.ll b/llvm/test/CodeGen/Thumb2/thumb2-rev16.ll
index 59d5e5489015e..c7cc9935b8259 100644
--- a/llvm/test/CodeGen/Thumb2/thumb2-rev16.ll
+++ b/llvm/test/CodeGen/Thumb2/thumb2-rev16.ll
@@ -39,7 +39,7 @@ define i32 @extra_maskop_uses2(i32 %a) {
 ; CHECK-NEXT:    mov.w r2, #16711935
 ; CHECK-NEXT:    and.w r1, r1, r0, lsl #8
 ; CHECK-NEXT:    and.w r0, r2, r0, lsr #8
-; CHECK-NEXT:    adds r2, r0, r1
+; CHECK-NEXT:    orr.w r2, r0, r1
 ; CHECK-NEXT:    muls r0, r1, r0
 ; CHECK-NEXT:    muls r0, r2, r0
 ; CHECK-NEXT:    bx lr
@@ -75,7 +75,7 @@ define i32 @different_shift_amount(i32 %a) {
 ; CHECK-NEXT:    and.w r1, r1, r0, lsr #8
 ; CHECK-NEXT:    movt r2, #65280
 ; CHECK-NEXT:    and.w r0, r2, r0, lsl #9
-; CHECK-NEXT:    add r0, r1
+; CHECK-NEXT:    orrs r0, r1
 ; CHECK-NEXT:    bx lr
     %l8 = shl i32 %a, 9
     %r8 = lshr i32 %a, 8
@@ -124,7 +124,7 @@ define i32 @different_vars(i32 %a, i32 %b) {
 ; CHECK-NEXT:    and.w r1, r2, r1, lsr #8
 ; CHECK-NEXT:    mov.w r2, #-16711936
 ; CHECK-NEXT:    and.w r0, r2, r0, lsl #8
-; CHECK-NEXT:    add r0, r1
+; CHECK-NEXT:    orrs r0, r1
 ; CHECK-NEXT:    bx lr
     %l8 = shl i32 %a, 8
     %r8 = lshr i32 %b, 8
@@ -150,7 +150,7 @@ define i32 @f2(i32 %a) {
 ; CHECK-NEXT:    orr.w r1, r1, r2, lsl #8
 ; CHECK-NEXT:    ubfx r2, r0, #8, #8
 ; CHECK-NEXT:    bfi r2, r0, #8, #8
-; CHECK-NEXT:    adds r0, r2, r1
+; CHECK-NEXT:    orr.w r0, r2, r1
 ; CHECK-NEXT:    bx lr
     %l8 = shl i32 %a, 8
     %r8 = lshr i32 %a, 8
diff --git a/llvm/test/CodeGen/Thumb2/thumb2-uxtb.ll b/llvm/test/CodeGen/Thumb2/thumb2-uxtb.ll
index 40ef3f6565838..90dcd8c303aba 100644
--- a/llvm/test/CodeGen/Thumb2/thumb2-uxtb.ll
+++ b/llvm/test/CodeGen/Thumb2/thumb2-uxtb.ll
@@ -166,7 +166,7 @@ define i32 @test10(i32 %p0) {
 ; CHECK-DSP-NEXT:    mov.w r2, #458759
 ; CHECK-DSP-NEXT:    and.w r1, r1, r0, lsr #7
 ; CHECK-DSP-NEXT:    and.w r0, r2, r0, lsr #12
-; CHECK-DSP-NEXT:    add r0, r1
+; CHECK-DSP-NEXT:    orrs r0, r1
 ; CHECK-DSP-NEXT:    bx lr
 ;
 ; CHECK-NO-DSP-LABEL: test10:
@@ -175,7 +175,7 @@ define i32 @test10(i32 %p0) {
 ; CHECK-NO-DSP-NEXT:    mov.w r2, #458759
 ; CHECK-NO-DSP-NEXT:    and.w r1, r1, r0, lsr #7
 ; CHECK-NO-DSP-NEXT:    and.w r0, r2, r0, lsr #12
-; CHECK-NO-DSP-NEXT:    add r0, r1
+; CHECK-NO-DSP-NEXT:    orrs r0, r1
 ; CHECK-NO-DSP-NEXT:    bx lr
 	%tmp1 = lshr i32 %p0, 7
 	%tmp2 = and i32 %tmp1, 16253176



More information about the llvm-commits mailing list