]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr.c (expand_expr, [...]): Optimize a reference to an element in a constant string.
authorJim Wilson <wilson@cygnus.com>
Sun, 26 Oct 1997 20:33:27 +0000 (20:33 +0000)
committerJeff Law <law@gcc.gnu.org>
Sun, 26 Oct 1997 20:33:27 +0000 (13:33 -0700)
        * expr.c (expand_expr, case INDIRECT_REF): Optimize a reference
        to an element in a constant string.

From-SVN: r16195

gcc/ChangeLog
gcc/expr.c

index 88005429c9c3bf36504b1feba26c1d2808680ea9..5cb05f8aaabad750cce25e25cea494699fbc7e3a 100644 (file)
@@ -1,3 +1,8 @@
+Sun Oct 26 13:31:47 1997  Jim Wilson  (wilson@cygnus.com)
+
+       * expr.c (expand_expr, case INDIRECT_REF): Optimize a reference
+       to an element in a constant string.
+
 Sun Oct 26 11:41:49 1997  Jason Merrill  <jason@yorick.cygnus.com>
 
        * dwarf2out.c (output_call_frame_info): The CIE pointer is now a 32
index 920ffbc2461650850f151730ef3a5ec00c30ec9e..5cd1b435780ea1460c1b452345cba5abca2ca5af 100644 (file)
@@ -5406,6 +5406,18 @@ expand_expr (exp, target, tmode, modifier)
       {
        tree exp1 = TREE_OPERAND (exp, 0);
        tree exp2;
+       tree index;
+       tree string = string_constant (exp1, &index);
+       int i;
+       if (string
+           && TREE_CODE (string) == STRING_CST
+           && TREE_CODE (index) == INTEGER_CST
+           && !TREE_INT_CST_HIGH (index)
+           && (i = TREE_INT_CST_LOW (index)) < TREE_STRING_LENGTH (string)
+           && GET_MODE_CLASS (mode) == MODE_INT
+           && GET_MODE_SIZE (mode) == 1)
+         return GEN_INT (TREE_STRING_POINTER (string)[i]);
 
        op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
        op0 = memory_address (mode, op0);