The following makes analysis and transform agree on constraints.
PR tree-optimization/115646
* tree-call-cdce.cc (check_pow): Check for bit_sz values
as allowed by transform.
* gcc.dg/pr115646.c: New testcase.
(cherry picked from commit
453b1d291d1a0f89087ad91cf6b1bed1ec68eff3)
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-require-effective-target int32plus } */
+
+extern double pow(double x, double y);
+
+struct S {
+ unsigned int a : 3, b : 8, c : 21;
+};
+
+void foo (struct S *p)
+{
+ pow (p->c, 42);
+}
/* If the type of the base is too wide,
the resulting shrink wrapping condition
will be too conservative. */
- if (bit_sz > MAX_BASE_INT_BIT_SIZE)
+ if (bit_sz != 8 && bit_sz != 16 && bit_sz != MAX_BASE_INT_BIT_SIZE)
return false;
return true;