mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
vec-lowering: Fix ABSU lowering [PR111285]
ABSU_EXPR lowering incorrectly used the resulting type for the new expression but in the case of ABSU the resulting type is an unsigned type and with ABSU is folded away. The fix is to use a signed type for the expression instead. Bootstrapped and tested on x86_64-linux-gnu. PR middle-end/111285 gcc/ChangeLog: * tree-vect-generic.cc (do_unop): Use a signed type for the operand if the operation was ABSU_EXPR. gcc/testsuite/ChangeLog: * g++.dg/torture/vect-absu-1.C: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
This commit is contained in:
parent
3f2739e466
commit
ad0084337e
29
gcc/testsuite/g++.dg/torture/vect-absu-1.C
Normal file
29
gcc/testsuite/g++.dg/torture/vect-absu-1.C
Normal file
@ -0,0 +1,29 @@
|
||||
// { dg-do run }
|
||||
// PR middle-end/111285
|
||||
|
||||
// The lowering of vect absu was done incorrectly
|
||||
|
||||
#define vect1 __attribute__((vector_size(sizeof(int))))
|
||||
|
||||
#define negabs(a) a < 0 ? a : -a
|
||||
|
||||
__attribute__((noinline))
|
||||
int s(int a)
|
||||
{
|
||||
return negabs(a);
|
||||
}
|
||||
__attribute__((noinline))
|
||||
vect1 int v(vect1 int a)
|
||||
{
|
||||
return negabs(a);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
for(int i = -10; i < 10; i++)
|
||||
{
|
||||
vect1 int t = {i};
|
||||
if (v(t)[0] != s(i))
|
||||
__builtin_abort();
|
||||
}
|
||||
}
|
@ -168,7 +168,15 @@ do_unop (gimple_stmt_iterator *gsi, tree inner_type, tree a,
|
||||
tree b ATTRIBUTE_UNUSED, tree bitpos, tree bitsize,
|
||||
enum tree_code code, tree type ATTRIBUTE_UNUSED)
|
||||
{
|
||||
a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
|
||||
tree rhs_type = inner_type;
|
||||
|
||||
/* For ABSU_EXPR, use the signed type for the rhs if the rhs was signed. */
|
||||
if (code == ABSU_EXPR
|
||||
&& ANY_INTEGRAL_TYPE_P (TREE_TYPE (a))
|
||||
&& !TYPE_UNSIGNED (TREE_TYPE (a)))
|
||||
rhs_type = signed_type_for (rhs_type);
|
||||
|
||||
a = tree_vec_extract (gsi, rhs_type, a, bitsize, bitpos);
|
||||
return gimplify_build1 (gsi, code, inner_type, a);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user