Bug 86096 - [8 Regression] ICE: qsort checking failed (error: qsort comparator non-negative on sorted output: 0)
Summary: [8 Regression] ICE: qsort checking failed (error: qsort comparator non-negati...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 9.0
: P2 normal
Target Milestone: 9.0
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-checking, ice-on-valid-code
: 89436 (view as bug list)
Depends on:
Blocks: qsort_chk
  Show dependency treegraph
 
Reported: 2018-06-09 03:06 UTC by Arseny Solokha
Modified: 2021-05-14 10:47 UTC (History)
3 users (show)

See Also:
Host:
Target: powerpc-*-linux-gnu*
Build:
Known to work:
Known to fail:
Last reconfirmed: 2018-06-09 00:00:00


Attachments
Reduced testcase (285 bytes, text/plain)
2018-06-09 03:06 UTC, Arseny Solokha
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Arseny Solokha 2018-06-09 03:06:18 UTC
Created attachment 44254 [details]
Reduced testcase

gcc-9.0.0-alpha20180603 snapshot (r261132) ICEs when compiling the attached snippet w/ -misel -Os -floop-parallelize-all -frename-registers -fno-caller-saves -fno-gcse -fno-isolate-erroneous-paths-dereference -fno-split-wide-types -fno-tree-dominator-opts -fno-tree-vrp -g:

% powerpc-e300c3-linux-gnu-gcc-9.0.0-alpha20180603 -misel -Os -floop-parallelize-all -frename-registers -fno-caller-saves -fno-gcse -fno-isolate-erroneous-paths-dereference -fno-split-wide-types -fno-tree-dominator-opts -fno-tree-vrp -g -c layafnq7.c                        
layafnq7.c: In function 'os':
layafnq7.c:43:1: error: qsort comparator non-negative on sorted output: 0
 }
 ^
during RTL pass: rnreg
layafnq7.c:43:1: internal compiler error: qsort checking failed
0x58cb34 qsort_chk_error
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/vec.c:201
0x15576f9 qsort_chk(void*, unsigned long, unsigned long, int (*)(void const*, void const*))
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/vec.c:253
0x7b406a vec<df_mw_hardreg*, va_heap, vl_embed>::qsort(int (*)(void const*, void const*))
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/vec.h:1099
0x7b406a vec<df_mw_hardreg*, va_heap, vl_ptr>::qsort(int (*)(void const*, void const*))
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/vec.h:1862
0x7b406a df_sort_and_compress_mws
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:2252
0x7b406a df_canonize_collection_rec
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:2281
0x7b65cd df_insn_refs_collect
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:3223
0x7b6a2f df_insn_refs_verify
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:4082
0x7b892f df_insn_rescan(rtx_insn*)
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:1065
0x7bad9c df_process_deferred_rescans()
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-scan.c:1246
0x7a175f df_finish_pass(bool)
	/var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20180603/work/gcc-9-20180603/gcc/df-core.c:651
Comment 1 Alexander Monakov 2018-06-09 10:59:44 UTC
df_mw_compare has:

   if (mw1->mw_reg != mw2->mw_reg)
     return mw1->mw_order - mw2->mw_order;

Note mw_reg in the 'if' vs mw_order in the 'return'. This is invalid.

It's simpler and more efficient to just use mw_order as the last tie-breaker regardless of mw_reg value.
Comment 2 Richard Biener 2019-02-22 09:25:22 UTC
*** Bug 89436 has been marked as a duplicate of this bug. ***
Comment 3 Richard Biener 2019-02-22 09:35:34 UTC
(In reply to Alexander Monakov from comment #1)
> df_mw_compare has:
> 
>    if (mw1->mw_reg != mw2->mw_reg)
>      return mw1->mw_order - mw2->mw_order;
> 
> Note mw_reg in the 'if' vs mw_order in the 'return'. This is invalid.
> 
> It's simpler and more efficient to just use mw_order as the last tie-breaker
> regardless of mw_reg value.

patch is pre-approved
Comment 4 Jakub Jelinek 2019-02-22 15:20:08 UTC
GCC 8.3 has been released.
Comment 5 Alexander Monakov 2019-02-25 15:15:25 UTC
Author: amonakov
Date: Mon Feb 25 15:14:39 2019
New Revision: 269189

URL: https://gcc.gnu.org/viewcvs?rev=269189&root=gcc&view=rev
Log:
df-scan: fix use of mw_order in df_mw_compare (PR 86096)

	PR rtl-optimization/86096
	* df-scan.c (df_mw_compare): Do not check mw_reg fields when
	comparing mw_order values.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/df-scan.c
Comment 6 Jakub Jelinek 2020-03-04 09:36:25 UTC
GCC 8.4.0 has been released, adjusting target milestone.
Comment 7 seurer 2021-02-16 17:04:53 UTC
I tried this on power LE and BE machines with gcc 9, 10, and trunk (11) and was unable to duplicate.  It looks from above like it was fixed.  Should it be closed?
Comment 8 Alexander Monakov 2021-02-16 17:36:05 UTC
It was fixed on the trunk only, so as the title says it remains an issue on the gcc-8 branch (which is still open). Bugzilla doesn't have separate resolutions for different branches, we cannot have this "RESOLVED" on the gcc-9/10/trunk and "WONTFIX" on gcc-8 branch.
Comment 9 Jakub Jelinek 2021-05-14 10:47:42 UTC
The GCC 8 branch is being closed, fixed in GCC 9.1.