Ensure toupper and tolower follow the expected pattern.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 9 Aug 2021 19:53:42 +0000 (15:53 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Mon, 9 Aug 2021 20:24:05 +0000 (16:24 -0400)
If the parameter is not compatible with the LHS, assume this is not really a
builtin function to avoid a trap.

gcc/
PR tree-optimization/101741
* gimple-range-fold.cc (fold_using_range::range_of_builtin_call): Check
type of parameter for toupper/tolower.

gcc/testsuite/
* gcc.dg/pr101741.c: New.

gcc/gimple-range-fold.cc
gcc/testsuite/gcc.dg/pr101741.c [new file with mode: 0644]

index 410bc4d..d3e3e14 100644 (file)
@@ -894,6 +894,9 @@ fold_using_range::range_of_builtin_call (irange &r, gcall *call,
     case CFN_BUILT_IN_TOUPPER:
       {
        arg = gimple_call_arg (call, 0);
+       // If the argument isn't compatible with the LHS, do nothing.
+       if (!range_compatible_p (type, TREE_TYPE (arg)))
+         return false;
        if (!src.get_operand (r, arg))
          return false;
 
@@ -913,6 +916,9 @@ fold_using_range::range_of_builtin_call (irange &r, gcall *call,
      case CFN_BUILT_IN_TOLOWER:
       {
        arg = gimple_call_arg (call, 0);
+       // If the argument isn't compatible with the LHS, do nothing.
+       if (!range_compatible_p (type, TREE_TYPE (arg)))
+         return false;
        if (!src.get_operand (r, arg))
          return false;
 
diff --git a/gcc/testsuite/gcc.dg/pr101741.c b/gcc/testsuite/gcc.dg/pr101741.c
new file mode 100644 (file)
index 0000000..6587dca
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR tree-optimization/101741 */
+/* { dg-do compile } */
+/* { dg-options "-O2 " } */
+
+int
+foo (void);
+
+unsigned int
+toupper (int c)
+{
+  c = foo ();
+  while (c)
+    c = toupper (c);
+
+  return c;
+}