Forbid lea without index and base. (#10771)
authorSergey Andreenko <seandree@microsoft.com>
Mon, 10 Apr 2017 16:41:49 +0000 (09:41 -0700)
committerGitHub <noreply@github.com>
Mon, 10 Apr 2017 16:41:49 +0000 (09:41 -0700)
src/jit/codegencommon.cpp
src/jit/gentree.h

index 29a76c4..89d6a4c 100644 (file)
@@ -1869,26 +1869,26 @@ bool CodeGen::genCreateAddrMode(GenTreePtr  addr,
         The following indirections are valid address modes on x86/x64:
 
             [                  icon]      * not handled here
-            [reg                   ]      * not handled here
+            [reg                   ]
             [reg             + icon]
-            [reg2 +     reg1       ]
-            [reg2 +     reg1 + icon]
-            [reg2 + 2 * reg1       ]
-            [reg2 + 4 * reg1       ]
-            [reg2 + 8 * reg1       ]
-            [       2 * reg1 + icon]
-            [       4 * reg1 + icon]
-            [       8 * reg1 + icon]
-            [reg2 + 2 * reg1 + icon]
-            [reg2 + 4 * reg1 + icon]
-            [reg2 + 8 * reg1 + icon]
+            [reg1 +     reg2       ]
+            [reg1 +     reg2 + icon]
+            [reg1 + 2 * reg2       ]
+            [reg1 + 4 * reg2       ]
+            [reg1 + 8 * reg2       ]
+            [       2 * reg2 + icon]
+            [       4 * reg2 + icon]
+            [       8 * reg2 + icon]
+            [reg1 + 2 * reg2 + icon]
+            [reg1 + 4 * reg2 + icon]
+            [reg1 + 8 * reg2 + icon]
 
         The following indirections are valid address modes on arm64:
 
             [reg]
             [reg  + icon]
-            [reg2 + reg1]
-            [reg2 + reg1 * natural-scale]
+            [reg1 + reg2]
+            [reg1 + reg2 * natural-scale]
 
      */
 
@@ -2448,6 +2448,11 @@ FOUND_AM:
 
     noway_assert(FitsIn<INT32>(cns));
 
+    if (rv1 == nullptr && rv2 == nullptr)
+    {
+        return false;
+    }
+
     /* Success - return the various components to the caller */
 
     *revPtr = rev;
index 5badd06..1d52248 100644 (file)
@@ -4165,6 +4165,7 @@ struct GenTreeAddrMode : public GenTreeOp
     GenTreeAddrMode(var_types type, GenTreePtr base, GenTreePtr index, unsigned scale, unsigned offset)
         : GenTreeOp(GT_LEA, type, base, index)
     {
+        assert(base != nullptr || index != nullptr);
         gtScale  = scale;
         gtOffset = offset;
     }