tree-optimization/110506 - bogus non-zero mask in CCP for vector types

Message ID 20230703072307.9E9D73858438@sourceware.org
State Accepted
Headers
Series tree-optimization/110506 - bogus non-zero mask in CCP for vector types |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Richard Biener July 3, 2023, 7:22 a.m. UTC
  get_value_for_expr was blindlessly using TYPE_PRECISION to produce
a mask for vector typed entities which the new tree checking now
catches.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	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.
---
 gcc/testsuite/gcc.dg/pr110506.c | 24 ++++++++++++++++++++++++
 gcc/tree-ssa-ccp.cc             |  1 +
 2 files changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr110506.c
  

Patch

diff --git a/gcc/testsuite/gcc.dg/pr110506.c b/gcc/testsuite/gcc.dg/pr110506.c
new file mode 100644
index 00000000000..10dbd4e6ce6
--- /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 26d5e445abd..0d0f02a8442 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)));