You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.0 KiB
43 lines
1.0 KiB
2017-05-30 Jakub Jelinek <jakub@redhat.com> |
|
|
|
Backported from mainline |
|
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. |
|
|
|
* gcc.c-torture/execute/pr78378.c: New test. |
|
|
|
--- gcc/combine.c |
|
+++ gcc/combine.c |
|
@@ -7342,6 +7342,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) |
|
--- /dev/null |
|
+++ 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; |
|
+} |
|
|
|
|