Skip to content

Commit ef66212

Browse files
committed
varasm: Fix up ICE in narrowing_initializer_constant_valid_p [PR105998]
The following testcase ICEs because there is NON_LVALUE_EXPR (location wrapper) around a VAR_DECL and has TYPE_MODE V2SImode and SCALAR_INT_TYPE_MODE on that ICEs. Or for -m32 -march=i386 TYPE_MODE is DImode, but SCALAR_INT_TYPE_MODE still uses the raw V2SImode and ICEs too. 2022-06-18 Jakub Jelinek <[email protected]> PR middle-end/105998 * varasm.cc (narrowing_initializer_constant_valid_p): Check SCALAR_INT_MODE_P instead of INTEGRAL_MODE_P, also break on ! INTEGRAL_TYPE_P and do the same check also on op{0,1}'s type. * c-c++-common/pr105998.c: New test.
1 parent 9991d84 commit ef66212

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* PR middle-end/105998 */
2+
3+
typedef int __attribute__((__vector_size__ (sizeof (long long)))) V;
4+
5+
V v;
6+
7+
long long
8+
foo (void)
9+
{
10+
long long l = (long long) ((0 | v) - ((V) { } == 0));
11+
return l;
12+
}

gcc/varasm.cc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4716,7 +4716,10 @@ narrowing_initializer_constant_valid_p (tree value, tree endtype, tree *cache)
47164716
{
47174717
tree inner = TREE_OPERAND (op0, 0);
47184718
if (inner == error_mark_node
4719-
|| ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4719+
|| ! INTEGRAL_TYPE_P (TREE_TYPE (op0))
4720+
|| ! SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (op0)))
4721+
|| ! INTEGRAL_TYPE_P (TREE_TYPE (inner))
4722+
|| ! SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
47204723
|| (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (op0)))
47214724
> GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (inner)))))
47224725
break;
@@ -4728,7 +4731,10 @@ narrowing_initializer_constant_valid_p (tree value, tree endtype, tree *cache)
47284731
{
47294732
tree inner = TREE_OPERAND (op1, 0);
47304733
if (inner == error_mark_node
4731-
|| ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
4734+
|| ! INTEGRAL_TYPE_P (TREE_TYPE (op1))
4735+
|| ! SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (op1)))
4736+
|| ! INTEGRAL_TYPE_P (TREE_TYPE (inner))
4737+
|| ! SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
47324738
|| (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (op1)))
47334739
> GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (inner)))))
47344740
break;

0 commit comments

Comments
 (0)