https://gcc.gnu.org/g:c9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b

commit r15-3137-gc9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b
Author: Manolis Tsamis <manolis.tsa...@vrull.eu>
Date:   Thu Aug 22 02:59:11 2024 -0700

    ifcvt: disallow call instructions in noce_convert_multiple_sets [PR116358]
    
    Similar to not allowing jump instructions in the generated code, we
    also shouldn't allow call instructions in noce_convert_multiple_sets.
    In the case of PR116358 a libcall was generated from force_operand.
    
            PR middle-end/116358
    
    gcc/ChangeLog:
    
            * ifcvt.cc (noce_convert_multiple_sets): Disallow call insns.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/aarch64/pr116358.c: New test.

Diff:
---
 gcc/ifcvt.cc                                |  2 +-
 gcc/testsuite/gcc.target/aarch64/pr116358.c | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
index da59c9078919..b136d7dbbba3 100644
--- a/gcc/ifcvt.cc
+++ b/gcc/ifcvt.cc
@@ -3550,7 +3550,7 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
     return false;
 
   for (insn = seq; insn; insn = NEXT_INSN (insn))
-    if (JUMP_P (insn)
+    if (JUMP_P (insn) || CALL_P (insn)
        || recog_memoized (insn) == -1)
       return false;
 
diff --git a/gcc/testsuite/gcc.target/aarch64/pr116358.c 
b/gcc/testsuite/gcc.target/aarch64/pr116358.c
new file mode 100644
index 000000000000..0a5fd9e02b92
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr116358.c
@@ -0,0 +1,15 @@
+/* PR middle-end/116358 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+long long f(int b, int c, long long d)
+{
+  if (c) {
+    long long bb = b;
+    long long t2 = (bb < 16 ? bb : 16);
+    d =  t2 - 16;
+  }
+  return d;
+}
+
+/* { dg-final { scan-assembler-not "bl" } } */

Reply via email to