dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] libjit ChangeLog tools/gen-rules-parser.y jit/j...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ChangeLog tools/gen-rules-parser.y jit/j...
Date: Sun, 10 Jun 2007 16:26:22 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   07/06/10 16:26:22

Modified files:
        .              : ChangeLog 
        tools          : gen-rules-parser.y 
        jit            : jit-live.c jit-rules-x86.ins 

Log message:
        disable copy propagation if JIT_OP_COPY_INT is applied to bytes and 
shorts;
        some tweaks for better code generation of copy instructions

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.316&r2=1.317
http://cvs.savannah.gnu.org/viewcvs/libjit/tools/gen-rules-parser.y?cvsroot=dotgnu-pnet&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-live.c?cvsroot=dotgnu-pnet&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.29&r2=1.30

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.316
retrieving revision 1.317
diff -u -b -r1.316 -r1.317
--- ChangeLog   28 May 2007 09:00:54 -0000      1.316
+++ ChangeLog   10 Jun 2007 16:26:22 -0000      1.317
@@ -1,3 +1,16 @@
+2007-06-10  Aleksey Demakov  <address@hidden>
+
+       * tools/gen-rules-parser.y (gensel_output_clauses): alter selection
+       logic so that "reg" rules are chosen over "local" in case the value
+       is used again in the same basic block.
+
+       * jit/jit-rules-x86.ins: tweak COPY rules for bytes, shorts, and
+       ints.
+
+       * jit/jit-live.c (forward_propagation, backward_propagation)
+       (is_copy_insn): do not perform copy propagation if JIT_OP_COPY_INT
+       is used for byte and short values.
+
 2007-05-28  Aleksey Demakov  <address@hidden>
 
        * jit/jit-live.c (forward_propagation, backward_propagation): do not

Index: tools/gen-rules-parser.y
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/tools/gen-rules-parser.y,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- tools/gen-rules-parser.y    12 Feb 2007 00:18:27 -0000      1.15
+++ tools/gen-rules-parser.y    10 Jun 2007 16:26:22 -0000      1.16
@@ -21,6 +21,7 @@
 
 #include <config.h>
 #include <stdio.h>
+#include <ctype.h>
 #ifdef HAVE_STRING_H
        #include <string.h>
 #elif defined(HAVE_STRINGS_H)
@@ -283,7 +284,7 @@
 }
 
 /*
- * Create string value.
+ * Create literal string value.
  */
 static gensel_value_t
 gensel_create_string_value(char *value)
@@ -297,7 +298,7 @@
 }
 
 /*
- * Create string value.
+ * Create register class value.
  */
 static gensel_value_t
 gensel_create_regclass_value(char *value)
@@ -939,6 +940,24 @@
 }
 
 /*
+ * Create an upper-case copy of a string.
+ */
+static char *
+gensel_string_upper(char *string)
+{
+       char *cp;
+       if(string)
+       {
+               string = strdup(string);
+               for(cp = string; *cp; cp++)
+               {
+                       *cp = toupper(*cp);
+               }
+       }
+       return string;
+}
+
+/*
  * Output the clauses for a rule.
  */
 static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t 
options)
@@ -956,6 +975,7 @@
        int ternary, free_dest;
        int contains_registers;
        gensel_regclass_t regclass;
+       char *uc_arg;
 
        /* If the clause is manual, then output it as-is */
        if(gensel_search_option(options, GENSEL_OPT_MANUAL))
@@ -1107,6 +1127,14 @@
                                        printf("!insn->%s->is_constant && ", 
args[index]);
                                        printf("!insn->%s->in_register && ", 
args[index]);
                                        
printf("!insn->%s->has_global_register", args[index]);
+                                       /* If the value is used again in the 
same basic block
+                                          it is highly likely that using a 
register instead
+                                          of the stack will be a win. Assume 
that if the
+                                          "local" pattern is not the last one 
then it must
+                                          be followed by a "reg" pattern. */
+                                       uc_arg = 
gensel_string_upper(args[index]);
+                                       printf("&& (insn->flags & 
JIT_INSN_%s_NEXT_USE) == 0", uc_arg);
+                                       free(uc_arg);
                                        seen_option = 1;
                                        ++index;
                                        break;

Index: jit/jit-live.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-live.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- jit/jit-live.c      28 May 2007 09:00:54 -0000      1.5
+++ jit/jit-live.c      10 Jun 2007 16:26:22 -0000      1.6
@@ -170,19 +170,55 @@
 }
 
 #if defined(USE_FORWARD_PROPAGATION) || defined(USE_BACKWARD_PROPAGATION)
+/*
+ * Check if the instruction is eligible for copy propagation.
+ */
 static int
-is_copy_opcode(int opcode)
+is_copy_insn(jit_insn_t insn)
 {
-       switch(opcode)
+       jit_type_t dtype;
+       jit_type_t vtype;
+
+       if (!insn || !insn->dest || !insn->value1)
+       {
+               return 0;
+       }
+
+       switch(insn->opcode)
        {
        case JIT_OP_COPY_INT:
+               /* Currently JIT_INSN_COPY_INT is used not only for int-to-int
+                  copying but for byte-to-int and short-to-int copying too
+                  (see jit_insn_convert). Propagation of byte and short values
+                  to instructions that expect ints might confuse them. */
+               dtype = jit_type_normalize(insn->dest->type);
+               vtype = jit_type_normalize(insn->value1->type);
+               if(dtype != vtype)
+               {
+                       /* signed/unsigned int conversion should be safe */
+                       if((dtype->kind == JIT_TYPE_INT || dtype->kind == 
JIT_TYPE_UINT)
+                          && (vtype->kind == JIT_TYPE_INT || vtype->kind == 
JIT_TYPE_UINT))
+                       {
+                               return 1;
+                       }
+                       return 0;
+               }
+               return 1;
+
+       case JIT_OP_COPY_LOAD_SBYTE:
+       case JIT_OP_COPY_LOAD_UBYTE:
+       case JIT_OP_COPY_LOAD_SHORT:
+       case JIT_OP_COPY_LOAD_USHORT:
        case JIT_OP_COPY_LONG:
        case JIT_OP_COPY_FLOAT32:
        case JIT_OP_COPY_FLOAT64:
        case JIT_OP_COPY_NFLOAT:
-       /*case JIT_OP_STRUCT:*/
+       case JIT_OP_COPY_STRUCT:
+       case JIT_OP_COPY_STORE_BYTE:
+       case JIT_OP_COPY_STORE_SHORT:
                return 1;
        }
+
        return 0;
 }
 #endif
@@ -226,22 +262,13 @@
        jit_insn_iter_init(&iter, block);
        while((insn = jit_insn_iter_next(&iter)) != 0)
        {
-               if(!is_copy_opcode(insn->opcode))
+               if(!is_copy_insn(insn))
                {
                        continue;
                }
 
                dest = insn->dest;
-               if(dest == 0 || dest->is_constant)
-               {
-                       continue;
-               }
-
                value = insn->value1;
-               if(value == 0)
-               {
-                       continue;
-               }
 
                /* Discard copy to itself */
                if(dest == value)
@@ -267,6 +294,10 @@
                {
                        continue;
                }
+               if(value->is_addressable || value->is_volatile)
+               {
+                       continue;
+               }
 
                iter2 = iter;
                while((insn2 = jit_insn_iter_next(&iter2)) != 0)
@@ -378,30 +409,13 @@
        jit_insn_iter_init_last(&iter, block);
        while((insn = jit_insn_iter_previous(&iter)) != 0)
        {
-               if(!is_copy_opcode(insn->opcode))
+               if(!is_copy_insn(insn))
                {
                        continue;
                }
 
                dest = insn->dest;
-               if(dest == 0 || dest->is_constant)
-               {
-                       continue;
-               }
-               if(dest->is_addressable || dest->is_volatile)
-               {
-                       continue;
-               }
-
                value = insn->value1;
-               if(value == 0)
-               {
-                       continue;
-               }
-               if(value->is_addressable || value->is_volatile)
-               {
-                       continue;
-               }
 
                /* Discard copy to itself */
                if(dest == value)
@@ -422,6 +436,15 @@
                        continue;
                }
 
+               if(dest->is_addressable || dest->is_volatile)
+               {
+                       continue;
+               }
+               if(value->is_addressable || value->is_volatile)
+               {
+                       continue;
+               }
+
                iter2 = iter;
                while((insn2 = jit_insn_iter_previous(&iter2)) != 0)
                {

Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- jit/jit-rules-x86.ins       23 Jan 2007 06:42:33 -0000      1.29
+++ jit/jit-rules-x86.ins       10 Jun 2007 16:26:22 -0000      1.30
@@ -1863,19 +1863,28 @@
  * Data manipulation.
  */
 
-JIT_OP_COPY_LOAD_SBYTE: copy
-       [reg] -> {}
-
-JIT_OP_COPY_LOAD_UBYTE: copy
-       [reg] -> {}
-
-JIT_OP_COPY_LOAD_SHORT: copy
+JIT_OP_COPY_LOAD_SBYTE, JIT_OP_COPY_LOAD_UBYTE, JIT_OP_COPY_STORE_BYTE: copy
+       [=local, imm] -> {
+               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 1);
+       }
+       [=local, breg] -> {
+               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 1);
+       }
        [reg] -> {}
 
-JIT_OP_COPY_LOAD_USHORT: copy
+JIT_OP_COPY_LOAD_SHORT, JIT_OP_COPY_LOAD_USHORT, JIT_OP_COPY_STORE_SHORT: copy
+       [=local, imm] -> {
+               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 2);
+       }
+       [=local, reg] -> {
+               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 2);
+       }
        [reg] -> {}
 
 JIT_OP_COPY_INT: copy
+       [=local, imm] -> {
+               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 4);
+       }
        [reg] -> {}
 
 JIT_OP_COPY_LONG: copy
@@ -1896,22 +1905,6 @@
                                   
jit_type_get_size(jit_value_get_type(insn->dest)));
        }
 
-JIT_OP_COPY_STORE_BYTE:
-       [=frame, imm] -> {
-               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 1);
-       }
-       [=frame, breg] -> {
-               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 1);
-       }
-
-JIT_OP_COPY_STORE_SHORT:
-       [=frame, imm] -> {
-               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 2);
-       }
-       [=frame, reg] -> {
-               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 2);
-       }
-
 JIT_OP_ADDRESS_OF:
        [=reg, frame] -> {
                x86_lea_membase(inst, $1, X86_EBP, $2);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]