]> gcc.gnu.org Git - gcc.git/commitdiff
tree-optimization/113126 - vector extension compare optimization
authorRichard Biener <rguenther@suse.de>
Thu, 11 Jan 2024 11:02:43 +0000 (12:02 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 11 Jan 2024 14:08:02 +0000 (15:08 +0100)
The following makes sure the resulting boolean type is the same
when eliding a float extension.

PR tree-optimization/113126
* match.pd ((double)float CMP (double)float -> float CMP float):
Make sure the boolean type is the same.
* fold-const.cc (fold_binary_loc): Likewise.

* gcc.dg/torture/pr113126.c: New testcase.

gcc/fold-const.cc
gcc/match.pd
gcc/testsuite/gcc.dg/torture/pr113126.c [new file with mode: 0644]

index 3a9d78b0c119762117e8d0a46fc0405c7fd02213..585c5099a37a01220f2fec52d2708db1a55078b9 100644 (file)
@@ -12900,7 +12900,8 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
        if (element_precision (TREE_TYPE (targ1)) > element_precision (newtype))
          newtype = TREE_TYPE (targ1);
 
-       if (element_precision (newtype) < element_precision (TREE_TYPE (arg0)))
+       if (element_precision (newtype) < element_precision (TREE_TYPE (arg0))
+           && is_truth_type_for (newtype, type))
          return fold_build2_loc (loc, code, type,
                              fold_convert_loc (loc, newtype, targ0),
                              fold_convert_loc (loc, newtype, targ1));
index 876a9d1c06ed3fe7b7ecb6546b695ba6eb2fbb77..abbd03742f9932c6ddb44a188a71006aba1f7561 100644 (file)
@@ -6792,11 +6792,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
               && exact_real_truncate (TYPE_MODE (double_type_node), &orig))
             type1 = double_type_node;
         }
-      tree newtype
-        = (element_precision (TREE_TYPE (@00)) > element_precision (type1)
-          ? TREE_TYPE (@00) : type1);
+       tree newtype
+        = (element_precision (TREE_TYPE (@00)) > element_precision (type1)
+           ? TREE_TYPE (@00) : type1);
      }
-     (if (element_precision (TREE_TYPE (@0)) > element_precision (newtype))
+     (if (element_precision (TREE_TYPE (@0)) > element_precision (newtype)
+         && is_truth_type_for (newtype, type))
       (cmp (convert:newtype @00) (convert:newtype @10))))))))
 
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr113126.c b/gcc/testsuite/gcc.dg/torture/pr113126.c
new file mode 100644 (file)
index 0000000..4aa38e0
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+typedef float __attribute__((__vector_size__ (8))) F;
+typedef double __attribute__((__vector_size__ (16))) G;
+
+F f;
+G g;
+
+F
+foo (void)
+{
+  G h = __builtin_convertvector (f, G);
+  g = h <= h;
+  return f;
+}
This page took 0.105413 seconds and 5 git commands to generate.