]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Check for IR_HREF vs. IR_HREFK aliasing in non-nil store check.
authorMike Pall <mike>
Sat, 23 Dec 2023 18:43:03 +0000 (19:43 +0100)
committerMike Pall <mike>
Sat, 23 Dec 2023 18:43:03 +0000 (19:43 +0100)
Thanks to Peter Cawley. #1133

src/lj_ir.h
src/lj_opt_mem.c

index 9fd4e275ea9208c043a48b3dead3245c9870a041..6d974ed2f003db1611c2d9414f6221327b8e31f4 100644 (file)
@@ -346,6 +346,7 @@ typedef struct IRType1 { uint8_t irt; } IRType1;
 #define irt_isu32(t)           (irt_type(t) == IRT_U32)
 #define irt_isi64(t)           (irt_type(t) == IRT_I64)
 #define irt_isu64(t)           (irt_type(t) == IRT_U64)
+#define irt_isp32(t)           (irt_type(t) == IRT_P32)
 
 #define irt_isfp(t)            (irt_isnum(t) || irt_isfloat(t))
 #define irt_isinteger(t)       (irt_typerange((t), IRT_I8, IRT_INT))
index 04b95a6f6ae3c223c3562cad70fdde867a17874e..214fb63244fc3ce998ed72719e7afbd2b41fb56a 100644 (file)
@@ -879,6 +879,8 @@ int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref)
        if (skref == xkref || !irref_isk(skref) || !irref_isk(xkref))
          return 0;  /* A nil store with same const key or var key MAY alias. */
        /* Different const keys CANNOT alias. */
+      } else if (irt_isp32(IR(skref)->t) != irt_isp32(IR(xkref)->t)) {
+       return 0;  /* HREF and HREFK MAY alias. */
       }  /* Different key types CANNOT alias. */
     }  /* Other non-nil stores MAY alias. */
     ref = store->prev;