offsetof(struct pedit_headers, field) + (off), \
                 MLX5_BYTE_OFF(fte_match_set_lyr_2_4, match_field)}
 
+/* masked values are the same and there are no rewrites that do not have a
+ * match.
+ */
+#define SAME_VAL_MASK(type, valp, maskp, matchvalp, matchmaskp) ({ \
+       type matchmaskx = *(type *)(matchmaskp); \
+       type matchvalx = *(type *)(matchvalp); \
+       type maskx = *(type *)(maskp); \
+       type valx = *(type *)(valp); \
+       \
+       (valx & maskx) == (matchvalx & matchmaskx) && !(maskx & (maskx ^ \
+                                                                matchmaskx)); \
+})
+
 static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
                         void *matchmaskp, int size)
 {
 
        switch (size) {
        case sizeof(u8):
-               same = ((*(u8 *)valp) & (*(u8 *)maskp)) ==
-                      ((*(u8 *)matchvalp) & (*(u8 *)matchmaskp));
+               same = SAME_VAL_MASK(u8, valp, maskp, matchvalp, matchmaskp);
                break;
        case sizeof(u16):
-               same = ((*(u16 *)valp) & (*(u16 *)maskp)) ==
-                      ((*(u16 *)matchvalp) & (*(u16 *)matchmaskp));
+               same = SAME_VAL_MASK(u16, valp, maskp, matchvalp, matchmaskp);
                break;
        case sizeof(u32):
-               same = ((*(u32 *)valp) & (*(u32 *)maskp)) ==
-                      ((*(u32 *)matchvalp) & (*(u32 *)matchmaskp));
+               same = SAME_VAL_MASK(u32, valp, maskp, matchvalp, matchmaskp);
                break;
        }