https://gcc.gnu.org/g:68b740f9e3112f7c0778bcb9dfd10b23cd1df1c0
commit r13-9516-g68b740f9e3112f7c0778bcb9dfd10b23cd1df1c0 Author: Richard Biener <rguent...@suse.de> Date: Fri Mar 7 10:15:20 2025 +0100 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. (cherry picked from commit 7950d4cceb9fc7559b1343c95fc651cefbe287a0) Diff: --- gcc/testsuite/gcc.dg/vect/pr119145.c | 35 +++++++++++++++++++++++++++++++++++ gcc/tree-vectorizer.cc | 4 +++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr119145.c b/gcc/testsuite/gcc.dg/vect/pr119145.c new file mode 100644 index 000000000000..55a84a603c49 --- /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 89cd0b88b611..33022217afb7 100644 --- a/gcc/tree-vectorizer.cc +++ b/gcc/tree-vectorizer.cc @@ -1103,7 +1103,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)