]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
xtensa: Defer storing integer constants into litpool until reload
authorTakayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp>
Fri, 17 Jun 2022 13:47:49 +0000 (22:47 +0900)
committerMax Filippov <jcmvbkbc@gmail.com>
Sat, 18 Jun 2022 06:28:14 +0000 (23:28 -0700)
Storing integer constants into litpool in the early stage of compilation
hinders some integer optimizations.  In fact, such integer constants are
not subject to the constant folding process.

For example:

    extern unsigned short value;
    extern void foo(void);
    void test(void) {
      if (value == 30001)
        foo();
    }

.literal_position
.literal .LC0, value
.literal .LC1, 30001
    test:
l32r a3, .LC0
l32r a2, .LC1
l16ui a3, a3, 0
extui a2, a2, 0, 16  // runtime zero-extension despite constant
bne a3, a2, .L1
j.l foo, a9
    .L1:
ret.n

This patch defers the placement of integer constants into litpool until
the start of reload:

.literal_position
.literal .LC0, value
.literal .LC1, 30001
    test:
l32r a3, .LC0
l32r a2, .LC1
l16ui a3, a3, 0
bne a3, a2, .L1
j.l foo, a9
    .L1:
ret.n

gcc/ChangeLog:

* config/xtensa/constraints.md (Y):
Change to include integer constants until reload begins.
* config/xtensa/predicates.md (move_operand): Ditto.
* config/xtensa/xtensa.cc (xtensa_emit_move_sequence):
Change to allow storing integer constants into litpool only after
reload begins.

gcc/config/xtensa/constraints.md
gcc/config/xtensa/predicates.md
gcc/config/xtensa/xtensa.cc

index e7ac8dbfebf8a82b875fd7d497a8d6619a583832..0b7dcd1440e716d59fb1ca2231c10717e84964e9 100644 (file)
 
 (define_constraint "Y"
  "A constant that can be used in relaxed MOVI instructions."
- (and (match_code "const_int,const_double,const,symbol_ref,label_ref")
-      (match_test "TARGET_AUTO_LITPOOLS")))
+ (ior (and (match_code "const_int,const_double,const,symbol_ref,label_ref")
+          (match_test "TARGET_AUTO_LITPOOLS"))
+      (and (match_code "const_int")
+          (match_test "can_create_pseudo_p ()"))))
 
 ;; Memory constraints.  Do not use define_memory_constraint here.  Doing so
 ;; causes reload to force some constants into the constant pool, but since
index edd13ae41b96ab3d57abfdfe6bdbbda276250ad2..0590c0f81a99c616eaf19bbe28aa9ca47ebe158f 100644 (file)
               (match_test "!constantpool_mem_p (op)
                            || GET_MODE_SIZE (mode) % UNITS_PER_WORD == 0")))
      (ior (and (match_code "const_int")
-              (match_test "GET_MODE_CLASS (mode) == MODE_INT
-                           && xtensa_simm12b (INTVAL (op))"))
+              (match_test "(GET_MODE_CLASS (mode) == MODE_INT
+                            && xtensa_simm12b (INTVAL (op)))
+                           || can_create_pseudo_p ()"))
          (and (match_code "const_int,const_double,const,symbol_ref,label_ref")
               (match_test "(TARGET_CONST16 || TARGET_AUTO_LITPOOLS)
                            && CONSTANT_P (op)
index d6f08b11648ca79008d815afd89f193585516558..c5d00acdf2cb2e3905a7f14bffc5c0fc2ae4d179 100644 (file)
@@ -1182,7 +1182,8 @@ xtensa_emit_move_sequence (rtx *operands, machine_mode mode)
          return 1;
        }
 
-      if (! TARGET_AUTO_LITPOOLS && ! TARGET_CONST16)
+      if (! TARGET_AUTO_LITPOOLS && ! TARGET_CONST16
+         && ! (CONST_INT_P (src) && can_create_pseudo_p ()))
        {
          src = force_const_mem (SImode, src);
          operands[1] = src;