aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManolis Tsamis <manolis.tsamis@vrull.eu>2024-08-22 02:59:11 -0700
committerPhilipp Tomsich <philipp.tomsich@vrull.eu>2024-08-23 20:09:34 +0200
commitc9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b (patch)
tree24877f51d2059f98c96f5df91bb15e2df46a7ca2 /gcc
parent6e68c3df1540c5bafbb47343698bf4e270333fdb (diff)
downloadgcc-c9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b.zip
gcc-c9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b.tar.gz
gcc-c9e2d0ec6eabc2a6b8c00984b2b2bc48565bb99b.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ifcvt.cc2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr116358.c15
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
index da59c90..b136d7d 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 0000000..0a5fd9e
--- /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" } } */