Summary: | web can't handle AUTOINC correctly | ||
---|---|---|---|
Product: | gcc | Reporter: | Carrot <carrot> |
Component: | rtl-optimization | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | NEW --- | ||
Severity: | normal | CC: | bergner, dje, egallager, steven, zadeck |
Priority: | P3 | ||
Version: | 5.0 | ||
Target Milestone: | --- | ||
See Also: | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=32339 | ||
Host: | Target: | ||
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: | 2014-09-03 00:00:00 |
Description
Carrot
2014-09-03 17:06:01 UTC
Confirmed. I am unable to reproduce this: Test Run By stevenb on Wed Sep 3 14:56:17 2014 Target is arm-unknown-eabi Host is powerpc64-unknown-linux-gnu === gcc tests === Schedule of variations: arm-sim/-march=armv5te/-mthumb/-fweb Running target arm-sim/-march=armv5te/-mthumb/-fweb Running /home/stevenb/devel/combined/gcc/testsuite/gcc.c-torture/execute/execute.exp ... PASS: gcc.c-torture/execute/20000422-1.c -O0 (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O0 execution test PASS: gcc.c-torture/execute/20000422-1.c -O1 (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O1 execution test PASS: gcc.c-torture/execute/20000422-1.c -O2 (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O2 execution test PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer execution test PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer -funroll-loops (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer -funroll-loops execution test PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test PASS: gcc.c-torture/execute/20000422-1.c -O3 -g (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -O3 -g execution test PASS: gcc.c-torture/execute/20000422-1.c -Os (test for excess errors) PASS: gcc.c-torture/execute/20000422-1.c -Os execution test === gcc Summary === # of expected passes 16 /home/stevenb/devel/build-arm/gcc/xgcc version 5.0.0 20140903 (experimental) [trunk revision 214887] (GCC) What is your command line for configure? ../trunk3/configure '--build=x86_64-build_unknown-linux-gnu' '--host=x86_64-build_unknown-linux-gnu' '--target=arm-unknown-linux-gnueabi' '--prefix=/usr/local/google/home/carrot/x-tools/arm-unknown-linux-gnueabi' '--with-sysroot=/usr/local/google/home/carrot/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot' '--with-float=soft' '--with-pkgversion=crosstool-NG 1.19.0' '--disable-sjlj-exceptions' '--enable-__cxa_atexit' '--disable-libmudflap' '--disable-libgomp' '--disable-libssp' '--disable-libquadmath' '--disable-libquadmath-support' '--with-gmp=/usr/local/google/home/carrot/crosstool-ng/work1/.build/arm-unknown-linux-gnueabi/buildtools' '--with-mpfr=/usr/local/google/home/carrot/crosstool-ng/work1/.build/arm-unknown-linux-gnueabi/buildtools' '--with-mpc=/usr/local/google/home/carrot/crosstool-ng/work1/.build/arm-unknown-linux-gnueabi/buildtools' '--with-ppl=no' '--with-isl=no' '--with-cloog=no' '--with-libelf=no' '--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' '--enable-threads=posix' '--enable-target-optspace' '--disable-nls' '--disable-multilib' '--with-local-prefix=/usr/local/google/home/carrot/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot' '--enable-c99' '--enable-long-long' '--disable-libitm' 'build_alias=x86_64-build_unknown-linux-gnu' 'host_alias=x86_64-build_unknown-linux-gnu' 'target_alias=arm-unknown-linux-gnueabi' '--disable-libasan' '--disable-libsanitizer' '--enable-languages=c,c++,lto' In function df_uses_record, we have: ... case PRE_DEC: case POST_DEC: case PRE_INC: case POST_INC: case PRE_MODIFY: case POST_MODIFY: gcc_assert (!DEBUG_INSN_P (insn_info->insn)); /* Catch the def of the register being modified. */ df_ref_record (DF_REF_REGULAR, collection_rec, XEXP (x, 0), &XEXP (x, 0), bb, insn_info, DF_REF_REG_DEF, flags | DF_REF_READ_WRITE | DF_REF_PRE_POST_MODIFY); /* ... Fall through to handle uses ... */ default: break; } /* Recursively scan the operands of this expression. */ { const char *fmt = GET_RTX_FORMAT (code); int i; for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) { if (fmt[i] == 'e') { /* Tail recursive case: save a function call level. */ if (i == 0) { loc = &XEXP (x, 0); goto retry; } df_uses_record (collection_rec, &XEXP (x, i), ref_type, bb, insn_info, flags); } ... For a AUTOINC rtl expression, we create two refs, one def and one use, but only the def gets the flag DF_REF_READ_WRITE, the use doesn't have this flag. While in web_main, it checks only use refs, but the use ref doesn't have the flag DF_REF_READ_WRITE, so it can't actually catch the AUTOINC cases, and does wrong renaming. (In reply to Carrot from comment #4) > For a AUTOINC rtl expression, we create two refs, one def and one use, but > only the def gets the flag DF_REF_READ_WRITE, the use doesn't have this flag. Then this is fall-out of PR32339. (In reply to Steven Bosscher from comment #5) > (In reply to Carrot from comment #4) > > For a AUTOINC rtl expression, we create two refs, one def and one use, but > > only the def gets the flag DF_REF_READ_WRITE, the use doesn't have this flag. > > Then this is fall-out of PR32339. Since it is intentionally to remove flag DF_REF_READ_WRITE on use, in web_main we should also check all defs with flag DF_REF_READ_WRITE, union it with corresponding use. (In reply to Carrot from comment #6) > Since it is intentionally to remove flag DF_REF_READ_WRITE on use, Ah, but I don't think that was the correct fix. The DEF and USE refs should both have the flag set. (In reply to Steven Bosscher from comment #7) > (In reply to Carrot from comment #6) > > Since it is intentionally to remove flag DF_REF_READ_WRITE on use, > > Ah, but I don't think that was the correct fix. The DEF and USE refs should > both have the flag set. I agree it's more reasonable to set DF_REF_READ_WRITE flag on both use and def, it means we need to revert r125736 and reopen bug 32339. The original flag setting code is neither correct. Consider following pre_modify expression: (pre_modify (r1) // def1, use1 (plus (r1) // use2 (r2))) // use3 GCC will generate 4 df_ref information for this expression as noted, 1 def and 3 use. Current code only set DF_REF_READ_WRITE for def1, this causes web do wrong renaming. The original flag setting code will set DF_REF_READ_WRITE for all def/use in this expression, this is obviously wrong for r2. I don't know if this has any relations to bug 32339. (In reply to Carrot from comment #9) > > I don't know if this has any relations to bug 32339. Worth putting under "See Also" anyways just in case (In reply to Steven Bosscher from comment #7) > (In reply to Carrot from comment #6) > > Since it is intentionally to remove flag DF_REF_READ_WRITE on use, > > Ah, but I don't think that was the correct fix. The DEF and USE refs should > both have the flag set. Are you still working on this? (In reply to Eric Gallager from comment #11) > (In reply to Steven Bosscher from comment #7) > > (In reply to Carrot from comment #6) > > > Since it is intentionally to remove flag DF_REF_READ_WRITE on use, > > > > Ah, but I don't think that was the correct fix. The DEF and USE refs should > > both have the flag set. > > Are you still working on this? Guess not; unassigning and moving to cc |