aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-11-17 00:22:16 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-11-17 00:22:16 +0100
commitfb324f02097cf4175df7834104162199bddc4269 (patch)
tree72f534b97622655d109468e279fca8aefac13b32 /gcc
parent8972f7e90b58d35906601e67c9c5e4b04f1a880e (diff)
downloadgcc-fb324f02097cf4175df7834104162199bddc4269.zip
gcc-fb324f02097cf4175df7834104162199bddc4269.tar.gz
gcc-fb324f02097cf4175df7834104162199bddc4269.tar.bz2
re PR rtl-optimization/78378 (wrong code when combining shift + mult + zero_extend)
PR rtl-optimization/78378 * combine.c (make_extraction): Use force_to_mode for non-{REG,MEM} inner only if pos is 0. Fix up formatting. * gcc.c-torture/execute/pr78378.c: New test. From-SVN: r242526
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr78378.c18
4 files changed, 33 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e5e55c..f712199 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/78378
+ * combine.c (make_extraction): Use force_to_mode for non-{REG,MEM}
+ inner only if pos is 0. Fix up formatting.
+
2016-11-17 Alan Modra <amodra@gmail.com>
PR rtl-optimization/78325
diff --git a/gcc/combine.c b/gcc/combine.c
index ca5ddae..5f920c4 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7382,6 +7382,7 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
if (tmode != BLKmode
&& ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
&& !MEM_P (inner)
+ && (pos == 0 || REG_P (inner))
&& (inner_mode == tmode
|| !REG_P (inner)
|| TRULY_NOOP_TRUNCATION_MODES_P (tmode, inner_mode)
@@ -7458,10 +7459,9 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
}
else
new_rtx = force_to_mode (inner, tmode,
- len >= HOST_BITS_PER_WIDE_INT
- ? HOST_WIDE_INT_M1U
- : (HOST_WIDE_INT_1U << len) - 1,
- 0);
+ len >= HOST_BITS_PER_WIDE_INT
+ ? HOST_WIDE_INT_M1U
+ : (HOST_WIDE_INT_1U << len) - 1, 0);
/* If this extraction is going into the destination of a SET,
make a STRICT_LOW_PART unless we made a MEM. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8958f86..20fcf38 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/78378
+ * gcc.c-torture/execute/pr78378.c: New test.
+
2016-11-16 Andrew Burgess <andrew.burgess@embecosm.com>
* gcc.dg/tree-prof/section-attr-1.c: New file.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr78378.c b/gcc/testsuite/gcc.c-torture/execute/pr78378.c
new file mode 100644
index 0000000..05c1f9c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr78378.c
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/78378 */
+
+unsigned long long __attribute__ ((noinline, noclone))
+foo (unsigned long long x)
+{
+ x <<= 41;
+ x /= 232;
+ return 1 + (unsigned short) x;
+}
+
+int
+main ()
+{
+ unsigned long long x = foo (1);
+ if (x != 0x2c24)
+ __builtin_abort();
+ return 0;
+}