]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix wrong cost of MEM when addr is a lea.
authorliuhongt <hongtao.liu@intel.com>
Mon, 24 Jun 2024 09:53:22 +0000 (17:53 +0800)
committerliuhongt <hongtao.liu@intel.com>
Thu, 27 Jun 2024 06:14:22 +0000 (14:14 +0800)
416.gamess regressed 4-6% on x86_64 since my r15-882-g1d6199e5f8c1c0.
The commit adjust rtx_cost of mem to reduce cost of (add op0 disp).
But Cost of ADDR could be cheaper than XEXP (addr, 0) when it's a lea.
It is the case in the PR, the patch adjust rtx_cost to only handle reg
+ disp, for other forms, they're basically all LEA which doesn't have
additional cost of ADD.

gcc/ChangeLog:

PR target/115462
* config/i386/i386.cc (ix86_rtx_costs): Make cost of MEM (reg +
disp) just a little bit more than MEM (reg).

gcc/testsuite/ChangeLog:
* gcc.target/i386/pr115462.c: New test.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/pr115462.c [new file with mode: 0644]

index 1f71ed04be67d0fa1717a67e9528a3d064d5df5b..92e3c67112e27ac71f8e061fa90c20a6118087d2 100644 (file)
@@ -22154,7 +22154,10 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
             address_cost should be used, but it reduce cost too much.
             So current solution is make constant disp as cheap as possible.  */
          if (GET_CODE (addr) == PLUS
-             && x86_64_immediate_operand (XEXP (addr, 1), Pmode))
+             && x86_64_immediate_operand (XEXP (addr, 1), Pmode)
+             /* Only hanlde (reg + disp) since other forms of addr are mostly LEA,
+                there's no additional cost for the plus of disp.  */
+             && register_operand (XEXP (addr, 0), Pmode))
            {
              *total += 1;
              *total += rtx_cost (XEXP (addr, 0), Pmode, PLUS, 0, speed);
diff --git a/gcc/testsuite/gcc.target/i386/pr115462.c b/gcc/testsuite/gcc.target/i386/pr115462.c
new file mode 100644 (file)
index 0000000..ad50a63
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx2 -fno-tree-vectorize -fno-pic" } */
+/* { dg-final { scan-assembler-times {(?n)movl[ \t]+.*, p1\.0\+[0-9]*\(,} 3 } } */
+
+int
+foo (long indx, long indx2, long indx3, long indx4, long indx5, long indx6, long n, int* q)
+{
+  static int p1[10000];
+  int* p2 = p1 + 1000;
+  int* p3 = p1 + 4000;
+  int* p4 = p1 + 8000;
+
+  for (long i = 0; i != n; i++)
+    {
+      /* scan for      movl    %edi, p1.0+3996(,%rax,4),
+        p1.0+3996 should be propagted into the loop.  */
+      p2[indx++] = q[indx++];
+      p3[indx2++] = q[indx2++];
+      p4[indx3++] = q[indx3++];
+    }
+  return p1[indx6] + p1[indx5];
+}