mirror of git://gcc.gnu.org/git/gcc.git
[simplify-rtx] PR 65235: Calculate element size correctly when simplifying (vec_select (vec_concat (const_int) (...)) [...])
PR rtl-optimization 65235 * simplify-rtx.c (simplify_binary_operation_1, VEC_SELECT case): When first element of vec_concat is const_int, calculate its size using second element. PR rtl-optimization 65235 * gcc.target/aarch64/pr65235_1.c: New test. From-SVN: r221387
This commit is contained in:
parent
6899585abf
commit
644f6fd80a
|
|
@ -1,3 +1,10 @@
|
|||
2015-03-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
PR rtl-optimization 65235
|
||||
* simplify-rtx.c (simplify_binary_operation_1, VEC_SELECT case):
|
||||
When first element of vec_concat is const_int, calculate its size
|
||||
using second element.
|
||||
|
||||
2015-03-12 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/65270
|
||||
|
|
|
|||
|
|
@ -3555,7 +3555,21 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
|
|||
while (GET_MODE (vec) != mode
|
||||
&& GET_CODE (vec) == VEC_CONCAT)
|
||||
{
|
||||
HOST_WIDE_INT vec_size = GET_MODE_SIZE (GET_MODE (XEXP (vec, 0)));
|
||||
HOST_WIDE_INT vec_size;
|
||||
|
||||
if (CONST_INT_P (XEXP (vec, 0)))
|
||||
{
|
||||
/* vec_concat of two const_ints doesn't make sense with
|
||||
respect to modes. */
|
||||
if (CONST_INT_P (XEXP (vec, 1)))
|
||||
return 0;
|
||||
|
||||
vec_size = GET_MODE_SIZE (GET_MODE (trueop0))
|
||||
- GET_MODE_SIZE (GET_MODE (XEXP (vec, 1)));
|
||||
}
|
||||
else
|
||||
vec_size = GET_MODE_SIZE (GET_MODE (XEXP (vec, 0)));
|
||||
|
||||
if (offset < vec_size)
|
||||
vec = XEXP (vec, 0);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
2015-03-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
PR rtl-optimization 65235
|
||||
* gcc.target/aarch64/pr65235_1.c: New test.
|
||||
|
||||
2015-03-12 Dominik Vogt <vogt@linux.vnet.ibm.com>
|
||||
|
||||
* gcc.target/s390/hotpatch-21.c: New test for hotpatch alignment.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
#include "arm_neon.h"
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
int64x1_t val1;
|
||||
int64x1_t val2;
|
||||
int64x1_t val3;
|
||||
uint64x1_t val13;
|
||||
uint64x2_t val14;
|
||||
uint64_t got;
|
||||
uint64_t exp;
|
||||
val1 = vcreate_s64(UINT64_C(0xffffffff80008000));
|
||||
val2 = vcreate_s64(UINT64_C(0x0000f38d00000000));
|
||||
val3 = vcreate_s64(UINT64_C(0xffff7fff0000809b));
|
||||
/* Expect: "val13" = 8000000000001553. */
|
||||
val13 = vcreate_u64 (UINT64_C(0x8000000000001553));
|
||||
/* Expect: "val14" = 0010 0000 0000 0002 0000 0000 0000 0000. */
|
||||
val14 = vcombine_u64(vcgt_s64(vqrshl_s64(val1, val2),
|
||||
vshr_n_s64(val3, 18)),
|
||||
vshr_n_u64(val13, 11));
|
||||
/* Should be 0000000000000000. */
|
||||
got = vgetq_lane_u64(val14, 0);
|
||||
exp = 0;
|
||||
if(exp != got)
|
||||
__builtin_abort ();
|
||||
}
|
||||
Loading…
Reference in New Issue