[Bug target/96814] [11 Regression] wrong code with -march=cascadelake since r11-1445-g502d63b6d6141597
marxin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Sep 22 11:58:45 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96814
--- Comment #4 from Martin Liška <marxin at gcc dot gnu.org> ---
>
> diff --git a/gcc/fold-const.c b/gcc/fold-const.c
> index 1f861630225..0cc80adf632 100644
> --- a/gcc/fold-const.c
> +++ b/gcc/fold-const.c
> @@ -12581,7 +12581,9 @@ fold_ternary_loc (location_t loc, enum tree_code
> code, t
> ree type,
> && tree_fits_uhwi_p (op2))
> {
> tree eltype = TREE_TYPE (TREE_TYPE (arg0));
> - unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));
> + unsigned HOST_WIDE_INT width
> + = (TREE_CODE (eltype) == BOOLEAN_TYPE
> + ? TYPE_PRECISION (eltype) : tree_to_uhwi (TYPE_SIZE
> (eltype)));
> unsigned HOST_WIDE_INT n = tree_to_uhwi (arg1);
> unsigned HOST_WIDE_INT idx = tree_to_uhwi (op2);
>
> diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
> index 6d5d65195ae..e9dbe07dccc 100644
> --- a/gcc/tree-vect-generic.c
> +++ b/gcc/tree-vect-generic.c
> @@ -137,7 +137,7 @@ tree_vec_extract (gimple_stmt_iterator *gsi, tree type,
> }
> if (bitpos)
> {
> - if (TREE_CODE (type) == BOOLEAN_TYPE)
> + if (0 && TREE_CODE (type) == BOOLEAN_TYPE)
> {
> tree itype
> = build_nonstandard_integer_type (tree_to_uhwi (bitsize), 0);
>
>
> makes the generated code a bit easier to follow but I guess still ends up
> miscompiling things?
Ok, so apparently you installed already the patch. And yes, we still miscompile
it :(
>
> Note if I add -fdisable-tree-veclower ISEL ICEs.
>
> So I'd see where this VEC_COND_EXPR comes from.
The vector<char> is already build in C FE:
#0 build_opaque_vector_type (innertype=<integer_type 0x7ffff75ec2a0 signed
char>, nunits=...) at /home/marxin/Programming/gcc/gcc/tree.c:10964
#1 0x000000000082368e in build_binary_op (location=271264, code=GT_EXPR,
orig_op0=<compound_literal_expr 0x7ffff741d260>, orig_op1=<integer_cst
0x7ffff75f1078>, convert_p=true) at
/home/marxin/Programming/gcc/gcc/c/c-typeck.c:12164
#2 0x00000000008028e3 in parser_build_binary_op (location=271264,
code=GT_EXPR, arg1=..., arg2=...) at
/home/marxin/Programming/gcc/gcc/c/c-typeck.c:3755
#3 0x000000000084dcfd in c_parser_binary_expression (parser=0x7ffff7fc4ab0,
after=<optimized out>, omp_atomic_lhs=<tree 0x0>) at
/home/marxin/Programming/gcc/gcc/c/c-parser.c:8087
#4 0x000000000084e9b6 in c_parser_conditional_expression
(parser=0x7ffff7fc4ab0, after=<optimized out>, omp_atomic_lhs=<optimized out>)
at /home/marxin/Programming/gcc/gcc/c/c-parser.c:7691
#5 0x000000000084efe1 in c_parser_expr_no_commas (parser=0x7ffff7fc4ab0,
after=<optimized out>, omp_atomic_lhs=<optimized out>) at
/home/marxin/Programming/gcc/gcc/c/c-parser.c:7606
for
(gdb) p debug_tree(orig_op0)
<compound_literal_expr 0x7ffff741d260
type <vector_type 0x7ffff740ed20 V
type <integer_type 0x7ffff75ec348 unsigned char public unsigned QI
size <integer_cst 0x7ffff75d3dc8 constant 8>
unit-size <integer_cst 0x7ffff75d3de0 constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff75ec348 precision:8 min <integer_cst 0x7ffff75d3df8 0> max <integer_cst
0x7ffff75d3d98 255>>
unsigned V16QI
size <integer_cst 0x7ffff75d3d20 constant 128>
unit-size <integer_cst 0x7ffff75d3d38 constant 16>
align:128 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff740ec78 nunits:16>
side-effects
arg:0 <decl_expr 0x7ffff741d240
type <void_type 0x7ffff75ecf18 void VOID
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7ffff75ecf18
pointer_to_this <pointer_type 0x7ffff75f4000>>
side-effects
arg:0 <var_decl 0x7ffff7fc4bd0 D.4011 type <vector_type 0x7ffff740ed20
V>
used unsigned ignored read decl_5 V16QI
/home/marxin/Programming/testcases/pr96814.c:8:12 size <integer_cst
0x7ffff75d3d20 128> unit-size <integer_cst 0x7ffff75d3d38 16>
align:128 warn_if_not_align:0 context <function_decl 0x7ffff7410200
main> initial <vector_cst 0x7ffff741d220>>
/home/marxin/Programming/testcases/pr96814.c:8:12 start:
/home/marxin/Programming/testcases/pr96814.c:8:12 finish:
/home/marxin/Programming/testcases/pr96814.c:8:12>>
$10 = void
(gdb) p debug_tree(orig_op1)
<integer_cst 0x7ffff75f1078 type <integer_type 0x7ffff75ec5e8 int> constant 0>
So the '(V){8} > 0' if I see correctly. I tried to manually change 'intt' in
parser_build_binary_op to boolean_type_node, but
it leads to:
/home/marxin/Programming/testcases/pr96814.c:8:21: error: invalid operands to
binary == (have ‘__vector(16) _Bool’ and ‘int’)
8 | x = ((V){8} > 0) == 0;
| ~~~~~~~~~~~~ ^~
| |
| __vector(16) _Bool
:/
Any hint how to resolve it?
More information about the Gcc-bugs
mailing list