aboutsummaryrefslogtreecommitdiff
path: root/gcc/convert.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@nextmovesoftware.com>2020-07-13 09:49:34 +0100
committerRoger Sayle <roger@nextmovesoftware.com>2020-07-13 09:49:34 +0100
commitb8697d0cd06da3375063295fe7161671e0904459 (patch)
tree2f0cef4cf9cb0bcd555a34db38e759d880e75825 /gcc/convert.c
parent9a2ae08b02d185a11e3e525e100ba637ce81c7ff (diff)
downloadgcc-b8697d0cd06da3375063295fe7161671e0904459.zip
gcc-b8697d0cd06da3375063295fe7161671e0904459.tar.gz
gcc-b8697d0cd06da3375063295fe7161671e0904459.tar.bz2
middle-end: Remove truly_noop_truncation check from convert.c
This patch eliminates a check of targetm.truly_noop_truncation from the early middle-end, where the gimple/generic being generated by GCC's front-ends is being inappropriately influenced by the target's TRULY_NOOP_TRUNCATION. The (recent) intention of TRULY_NOOP_TRUNCATION is to indicate that a backend requires explicit truncation instructions rather than using SUBREGs to perform truncations. A long standing (and probably unintentional) side-effect has been that this setting also controls whether the middle-end narrows integer operations at the tree-level. Understandably, GCC and its testsuite assume that GIMPLE and GENERIC behave consistently across platforms, and alas defining TRULY_NOOP_TRUNCATION away from the default triggers several regressions (including gcc.dg/fold-rotate-1.c). 2020-07-13 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog * convert.c (convert_to_integer_1): Narrow integer operations even on targets that require explicit truncation instructions.
Diffstat (limited to 'gcc/convert.c')
-rw-r--r--gcc/convert.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/gcc/convert.c b/gcc/convert.c
index 42509c5..292c513 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -836,16 +836,10 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
&& POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0))))
break;
- if (outprec >= BITS_PER_WORD
- || targetm.truly_noop_truncation (outprec, inprec)
- || inprec > TYPE_PRECISION (TREE_TYPE (arg0))
- || inprec > TYPE_PRECISION (TREE_TYPE (arg1)))
- {
- tree tem = do_narrow (loc, ex_form, type, arg0, arg1,
- expr, inprec, outprec, dofold);
- if (tem)
- return tem;
- }
+ tree tem = do_narrow (loc, ex_form, type, arg0, arg1,
+ expr, inprec, outprec, dofold);
+ if (tem)
+ return tem;
}
break;