After this change: msp430-elf, rl78-elf and xstormy16-elf are all getting an ICE on gcc.c-torture/execute/ From the msp430-elf gcc.log file: /home/jlaw/jenkins/workspace/msp430-elf/gcc/gcc/testsuite/gcc.c-torture/execute/20100827-1.c: In function 'foo':^M /home/jlaw/jenkins/workspace/msp430-elf/gcc/gcc/testsuite/gcc.c-torture/execute/20100827-1.c:3:1: internal compiler error: tree check: expected class 'type', have 'exceptional' (ssa_name) in transform_reduction_loop, at tree-loop-distribution.c:3684^M 0x1532ceb tree_class_check_failed(tree_node const*, tree_code_class, char const*, int, char const*)^M ../../..//gcc/gcc/tree.c:8739^M 0x861c29 tree_class_check(tree_node*, tree_code_class, char const*, int, char const*)^M ../../..//gcc/gcc/tree.h:3556^M 0x12006d9 loop_distribution::transform_reduction_loop(loop*)^M ../../..//gcc/gcc/tree-loop-distribution.c:3684^M 0x1200d92 loop_distribution::execute(function*)^M ../../..//gcc/gcc/tree-loop-distribution.c:3776^M 0x12012bd execute^M ../../..//gcc/gcc/tree-loop-distribution.c:3901^M Please submit a full bug report,^M You should be able to reproduce this with just a cross compiler. No assembler or target libraries should be needed.
gcc.dg/tree-ssa/pr45427.c shows the same issue.
It looks like I missed to take the TREE_TYPE of reduction_var. I just did a quick test with diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index fb9250031b5..0559b9c47d7 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -3430,7 +3430,7 @@ generate_strlen_builtin_using_rawmemchr (loop_p loop, tree reduction_var, static bool reduction_var_overflows_first (tree reduction_var, tree load_type) { - widest_int n2 = wi::lshift (1, TYPE_PRECISION (reduction_var));; + widest_int n2 = wi::lshift (1, TYPE_PRECISION (TREE_TYPE (reduction_var)));; widest_int m2 = wi::lshift (1, TYPE_PRECISION (ptrdiff_type_node) - 1); widest_int s = wi::to_widest (TYPE_SIZE_UNIT (load_type)); return wi::ltu_p (n2, wi::udiv_trunc (m2, s)); @@ -3681,7 +3681,7 @@ loop_distribution::transform_reduction_loop (loop_p loop) && ((TYPE_PRECISION (sizetype) >= TYPE_PRECISION (ptr_type_node) - 1 && TYPE_PRECISION (ptr_type_node) >= 32) || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (reduction_var)) - && TYPE_PRECISION (reduction_var) <= TYPE_PRECISION (sizetype))) + && TYPE_PRECISION (TREE_TYPE (reduction_var)) <= TYPE_PRECISION (sizetype))) && builtin_decl_implicit (BUILT_IN_STRLEN)) generate_strlen_builtin (loop, reduction_var, load_iv.base, reduction_iv.base, loc); successfully. It's getting late here. I will come back to this tomorrow morning. Sorry for the inconvenience.
No worries. This is why we have testing systems.
And just an FYI. That patch fixes the problem on all three affected platforms. Assuming it bootstraps and regression tests, consider it pre-approved for the trunk. Thanks
Created attachment 51606 [details] Fix determining precission of reduction_var
Thanks for confirmation! Bootstrap and regtest are still running on x86 as well as IBM Z. I will commit the attached patch assuming successful runs.
Fixed on the trunk.