<p dir="ltr">Ouch! Good catch! :-)</p>
<div class="gmail_quote">On 14 Jun 2016 2:39 p.m., "James Molloy via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jamesm<br>
Date: Tue Jun 14 08:33:07 2016<br>
New Revision: 272665<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=272665&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=272665&view=rev</a><br>
Log:<br>
[Thumb] Fix off-by-one error in r272007<br>
<br>
We can only generate immediates up to #510 with a MOV+ADD, not #511, because there's no such instruction as add #256.<br>
<br>
Found by Oliver Stannard and csmith!<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp<br>
    llvm/trunk/lib/Target/ARM/ARMInstrThumb.td<br>
    llvm/trunk/test/CodeGen/Thumb/constants.ll<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=272665&r1=272664&r2=272665&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=272665&r1=272664&r2=272665&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original)<br>
+++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Jun 14 08:33:07 2016<br>
@@ -485,7 +485,7 @@ unsigned ARMDAGToDAGISel::ConstantMateri<br>
   if (Subtarget->isThumb()) {<br>
     if (Val <= 255) return 1;                               // MOV<br>
     if (Subtarget->hasV6T2Ops() && Val <= 0xffff) return 1; // MOVW<br>
-    if (Val <= 511) return 2;                               // MOV + ADDi8<br>
+    if (Val <= 510) return 2;                               // MOV + ADDi8<br>
     if (~Val <= 255) return 2;                              // MOV + MVN<br>
     if (ARM_AM::isThumbImmShiftedVal(Val)) return 2;        // MOV + LSL<br>
   } else {<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=272665&r1=272664&r2=272665&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=272665&r1=272664&r2=272665&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original)<br>
+++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Jun 14 08:33:07 2016<br>
@@ -66,11 +66,11 @@ def thumb_immshifted_shamt : SDNodeXForm<br>
   return CurDAG->getTargetConstant(V, SDLoc(N), MVT::i32);<br>
 }]>;<br>
<br>
-def imm256_511 : ImmLeaf<i32, [{<br>
-  return Imm >= 256 && Imm < 512;<br>
+def imm256_510 : ImmLeaf<i32, [{<br>
+  return Imm >= 256 && Imm < 511;<br>
 }]>;<br>
<br>
-def thumb_imm256_511_addend : SDNodeXForm<imm, [{<br>
+def thumb_imm256_510_addend : SDNodeXForm<imm, [{<br>
   return CurDAG->getTargetConstant(N->getZExtValue() - 255, SDLoc(N), MVT::i32);<br>
 }]>;<br>
<br>
@@ -1497,9 +1497,9 @@ def : T1Pat<(i32 thumb_immshifted:$src),<br>
 def : T1Pat<(i32 imm0_255_comp:$src),<br>
             (tMVN (tMOVi8 (imm_comp_XFORM imm:$src)))>;<br>
<br>
-def : T1Pat<(i32 imm256_511:$src),<br>
+def : T1Pat<(i32 imm256_510:$src),<br>
             (tADDi8 (tMOVi8 255),<br>
-                    (thumb_imm256_511_addend imm:$src))>;<br>
+                    (thumb_imm256_510_addend imm:$src))>;<br>
<br>
 // Pseudo instruction that combines ldr from constpool and add pc. This should<br>
 // be expanded into two instructions late to allow if-conversion and<br>
<br>
Modified: llvm/trunk/test/CodeGen/Thumb/constants.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/constants.ll?rev=272665&r1=272664&r2=272665&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb/constants.ll?rev=272665&r1=272664&r2=272665&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/Thumb/constants.ll (original)<br>
+++ llvm/trunk/test/CodeGen/Thumb/constants.ll Tue Jun 14 08:33:07 2016<br>
@@ -9,3 +9,11 @@<br>
 define i32 @mov_and_add() {<br>
   ret i32 267<br>
 }<br>
+<br>
+; CHECK-T1-LABEL: @mov_and_add2<br>
+; CHECK-T2-LABEL: @mov_and_add2<br>
+; CHECK-T1: ldr r0,<br>
+; CHECK-T2: movw r0, #511<br>
+define i32 @mov_and_add2() {<br>
+  ret i32 511<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>