aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-07-03 08:28:17 +0200
committerRichard Biener <rguenther@suse.de>2023-07-03 10:02:25 +0200
commitbd7e9856fe5bbeb487797476c4fffb660f63cf4f (patch)
treee6a722b0f7820e0cf70ceafe505a43aca3afce55
parent8cb087d869be698a86b082a7248d03e468ef1eb1 (diff)
downloadgcc-bd7e9856fe5bbeb487797476c4fffb660f63cf4f.zip
gcc-bd7e9856fe5bbeb487797476c4fffb660f63cf4f.tar.gz
gcc-bd7e9856fe5bbeb487797476c4fffb660f63cf4f.tar.bz2
tree-optimization/110506 - bogus non-zero mask in CCP for vector types
get_value_for_expr was blindlessly using TYPE_PRECISION to produce a mask for vector typed entities which the new tree checking now catches. PR tree-optimization/110506 * tree-ssa-ccp.cc (get_value_for_expr): Check for integral type before relying on TYPE_PRECISION to produce a nonzero mask. * gcc.dg/pr110506.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/pr110506.c24
-rw-r--r--gcc/tree-ssa-ccp.cc1
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr110506.c b/gcc/testsuite/gcc.dg/pr110506.c
new file mode 100644
index 0000000..10dbd4e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr110506.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct {
+ long *sp;
+ long *csp;
+} neko_interp_loop_vm;
+int neko_interp_loop_vm_2;
+void neko_interp_loop()
+{
+ void *pc[] = {&&LabelAccGlobal, &&LabelPhysCompare, &&LabelTailCall,
+ &&LabelLoop, &&LabelMakeArray2};
+ long *sp, *csp = neko_interp_loop_vm.csp;
+LabelAccGlobal:
+ neko_interp_loop_vm.sp = sp;
+ neko_interp_loop_vm.csp = csp;
+ goto * 0;
+LabelTailCall:
+ csp = sp -= neko_interp_loop_vm_2;
+LabelMakeArray2:
+LabelPhysCompare:
+LabelLoop:
+ goto * 0;
+}
diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc
index 26d5e44..0d0f02a 100644
--- a/gcc/tree-ssa-ccp.cc
+++ b/gcc/tree-ssa-ccp.cc
@@ -682,6 +682,7 @@ get_value_for_expr (tree expr, bool for_bits_p)
}
if (val.lattice_val == VARYING
+ && INTEGRAL_TYPE_P (TREE_TYPE (expr))
&& TYPE_UNSIGNED (TREE_TYPE (expr)))
val.mask = wi::zext (val.mask, TYPE_PRECISION (TREE_TYPE (expr)));