aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-03-07 10:15:20 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-03-07 12:16:48 +0100
commit7950d4cceb9fc7559b1343c95fc651cefbe287a0 (patch)
tree9130722522de7cc86c289584ea8357a4d14285e0
parentb1d0ac28de643e7c810e407a0668737131cdcc00 (diff)
downloadgcc-7950d4cceb9fc7559b1343c95fc651cefbe287a0.zip
gcc-7950d4cceb9fc7559b1343c95fc651cefbe287a0.tar.gz
gcc-7950d4cceb9fc7559b1343c95fc651cefbe287a0.tar.bz2
tree-optimization/119145 - avoid stray .MASK_CALL after vectorization
When we BB vectorize an if-converted loop body we make sure to not leave around .MASK_LOAD or .MASK_STORE created by if-conversion but we failed to check for .MASK_CALL. PR tree-optimization/119145 * tree-vectorizer.cc (try_vectorize_loop_1): Avoid BB vectorizing an if-converted loop body when there's a .MASK_CALL in the loop body. * gcc.dg/vect/pr119145.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr119145.c35
-rw-r--r--gcc/tree-vectorizer.cc4
2 files changed, 38 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr119145.c b/gcc/testsuite/gcc.dg/vect/pr119145.c
new file mode 100644
index 0000000..55a84a6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr119145.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+
+typedef short Quantum;
+Quantum ComplexImages_Bi_0, ComplexImages_Ai_0, ComplexImages_Ai_1;
+long ComplexImages_x;
+__attribute__((__simd__)) double atan2(double, double);
+typedef enum { MagickFalse } MagickBooleanType;
+
+struct {
+ MagickBooleanType matte;
+} *ComplexImages_images;
+
+typedef struct {
+ Quantum blue, opacity;
+} PixelPacket;
+
+typedef enum { MagnitudePhaseComplexOperator } ComplexOperator;
+PixelPacket ComplexImages_Ar, ComplexImages_Br;
+PixelPacket *ComplexImages_Ci;
+ComplexOperator ComplexImages_op;
+
+void ComplexImages()
+{
+ for (; ComplexImages_x; ComplexImages_x++)
+ switch (ComplexImages_op)
+ {
+ case MagnitudePhaseComplexOperator:
+ if (ComplexImages_images->matte)
+ ComplexImages_Ci->opacity
+ = atan2(ComplexImages_Ai_1, ComplexImages_Ar.opacity);
+ ComplexImages_Ci->blue
+ = 1.0 / (ComplexImages_Ai_0 * ComplexImages_Br.blue
+ + ComplexImages_Ar.blue * ComplexImages_Bi_0);
+ }
+}
diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc
index f38c8d2..447f882 100644
--- a/gcc/tree-vectorizer.cc
+++ b/gcc/tree-vectorizer.cc
@@ -1132,7 +1132,9 @@ try_vectorize_loop_1 (hash_table<simduid_to_vf> *&simduid_to_vf_htab,
if (call && gimple_call_internal_p (call))
{
internal_fn ifn = gimple_call_internal_fn (call);
- if (ifn == IFN_MASK_LOAD || ifn == IFN_MASK_STORE
+ if (ifn == IFN_MASK_LOAD
+ || ifn == IFN_MASK_STORE
+ || ifn == IFN_MASK_CALL
/* Don't keep the if-converted parts when the ifn with
specifc type is not supported by the backend. */
|| (direct_internal_fn_p (ifn)