aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-01-11 12:02:43 +0100
committerRichard Biener <rguenther@suse.de>2024-01-11 15:08:02 +0100
commit897b95a12b7fe549ec2cb8ef3a3f0e4fbabf9737 (patch)
tree34ff55139b9f706253c684745d9d954e4abf0e3c /gcc
parent05e8ef2a05b477589cae25af3311bad0f68a90fe (diff)
downloadgcc-897b95a12b7fe549ec2cb8ef3a3f0e4fbabf9737.zip
gcc-897b95a12b7fe549ec2cb8ef3a3f0e4fbabf9737.tar.gz
gcc-897b95a12b7fe549ec2cb8ef3a3f0e4fbabf9737.tar.bz2
tree-optimization/113126 - vector extension compare optimization
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-const.cc3
-rw-r--r--gcc/match.pd9
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr113126.c15
3 files changed, 22 insertions, 5 deletions
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 3a9d78b..585c509 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -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));
diff --git a/gcc/match.pd b/gcc/match.pd
index 876a9d1..abbd037 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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
index 0000000..4aa38e0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr113126.c
@@ -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;
+}