A collection of test cases, capturing the state of various functions at various places within the pass list, and verifying that we can restart at various passes.
gcc/testsuite/ChangeLog: * gcc.dg/rtl/x86_64/dfinit.c: New test case. * gcc.dg/rtl/x86_64/different-structs.c: New test case. * gcc.dg/rtl/x86_64/final.c: New test case. * gcc.dg/rtl/x86_64/into-cfglayout.c: New test case. * gcc.dg/rtl/x86_64/ira.c: New test case. * gcc.dg/rtl/x86_64/pro_and_epilogue.c: New test case. * gcc.dg/rtl/x86_64/test-multiple-fns.c: New test case. * gcc.dg/rtl/x86_64/test-return-const.c.after-expand.c: New test case. * gcc.dg/rtl/x86_64/test-return-const.c.before-fwprop.c: New test case. * gcc.dg/rtl/x86_64/test-rtl.c: New test case. * gcc.dg/rtl/x86_64/test_1.h: New file. * gcc.dg/rtl/x86_64/times-two.c.after-expand.c: New test case. * gcc.dg/rtl/x86_64/times-two.c.before-df.c: New test case. * gcc.dg/rtl/x86_64/times-two.h: New file. * gcc.dg/rtl/x86_64/vregs.c: New test case. --- gcc/testsuite/gcc.dg/rtl/x86_64/dfinit.c | 116 ++++++++++++++++++ .../gcc.dg/rtl/x86_64/different-structs.c | 81 +++++++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/final.c | 133 +++++++++++++++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/into-cfglayout.c | 117 ++++++++++++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/ira.c | 111 +++++++++++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/pro_and_epilogue.c | 110 +++++++++++++++++ .../gcc.dg/rtl/x86_64/test-multiple-fns.c | 105 ++++++++++++++++ .../rtl/x86_64/test-return-const.c.after-expand.c | 39 ++++++ .../rtl/x86_64/test-return-const.c.before-fwprop.c | 42 +++++++ gcc/testsuite/gcc.dg/rtl/x86_64/test-rtl.c | 101 ++++++++++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/test_1.h | 16 +++ .../gcc.dg/rtl/x86_64/times-two.c.after-expand.c | 70 +++++++++++ .../gcc.dg/rtl/x86_64/times-two.c.before-df.c | 54 +++++++++ gcc/testsuite/gcc.dg/rtl/x86_64/times-two.h | 22 ++++ gcc/testsuite/gcc.dg/rtl/x86_64/vregs.c | 112 +++++++++++++++++ 15 files changed, 1229 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/dfinit.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/final.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/into-cfglayout.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/ira.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/pro_and_epilogue.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/test-multiple-fns.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.after-expand.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.before-fwprop.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/test-rtl.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/test_1.h create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.after-expand.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.before-df.c create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/times-two.h create mode 100644 gcc/testsuite/gcc.dg/rtl/x86_64/vregs.c diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/dfinit.c b/gcc/testsuite/gcc.dg/rtl/x86_64/dfinit.c new file mode 100644 index 0000000..3425b97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/dfinit.c @@ -0,0 +1,116 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-dfinit" } */ + +#include "test_1.h" + +/* Lightly-modified dump of test.c.261r.split1 for x86_64. */ + +int __RTL (startwith ("no-opt dfinit")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 3 (flags "FALLTHRU")) + (edge-to 4) + ) ;; block 2 + (block 3 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 3] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI <3>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI <0> [ _1 ]) + (plus:SI (reg:SI <3>) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 29 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 5) + ) ;; block 3 + (cbarrier 30) + (block 4 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI <4>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI <0> [ _1 ]) + (neg:SI (reg:SI <4>))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 5 (flags "FALLTHRU")) + ) ;; block 4 + (block 5 + (edge-from 4 (flags "FALLTHRU")) + (edge-from 3) + (clabel 20 3) + (cnote 21 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 22 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ]))) + (cinsn 26 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 5 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* Verify that the dataflow information matches what cc1 would normally + have generated. In particular, in earlier versions of the RTL + frontend, the exit block use of reg 0 (ax) wasn't picked up + on, due to not setting up crtl->return_rtx based on + DECL_RESULT (fndecl). */ +/* { dg-final { scan-rtl-dump ";; exit block uses.*0 .ax. 6 .bp. 7 .sp. 20 .frame." "dfinit" } } */ +/* { dg-final { scan-rtl-dump ";; regs ever live.*0 .ax. 1 .dx. 4 .si. 5 .di. 17 .flags." "dfinit" } } */ diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c b/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c new file mode 100644 index 0000000..90efaa7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c @@ -0,0 +1,81 @@ +/* { dg-do compile { target x86_64-*-* } } */ + +extern double sqrt(double x); + +struct foo +{ + double x; + double y; +}; + +struct bar +{ + double x; + double y; +}; + +double __RTL test (struct foo *f, const struct bar *b) +{ +#if 0 + /* Result of "expand" on this C code, compiled for x86_64 with -Os. */ + f->x += b->x; + f->y += b->y; + return sqrt (f->x * f->x + f->y * f->y); +#endif +(function "test" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 5 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (reg/v/f:DI <10> [ f ]) + (reg:DI di [ f ])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":18) + (cinsn 3 (set (reg/v/f:DI <11> [ b ]) + (reg:DI si [ b ])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":18) + (cnote 4 NOTE_INSN_FUNCTION_BEG) + (cinsn 7 (set (reg:DF <12>) + (mem:DF (reg/v/f:DI <10> [ f ]) [2 f_11(D)->x+0 S8 A64])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":21) + (cinsn 8 (set (reg:DF <2> [ _3 ]) + (plus:DF (reg:DF <12>) + (mem:DF (reg/v/f:DI <11> [ b ]) [2 b_12(D)->x+0 S8 A64]))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":21) + (cinsn 9 (set (mem:DF (reg/v/f:DI <10> [ f ]) [2 f_11(D)->x+0 S8 A64]) + (reg:DF <2> [ _3 ])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":21) + (cinsn 10 (set (reg:DF <13>) + (mem:DF (plus:DI (reg/v/f:DI <10> [ f ]) + (const_int 8)) [2 f_11(D)->y+0 S8 A64])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":22) + (cinsn 11 (set (reg:DF <5> [ _6 ]) + (plus:DF (reg:DF <13>) + (mem:DF (plus:DI (reg/v/f:DI <11> [ b ]) + (const_int 8)) [2 b_12(D)->y+0 S8 A64]))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":22) + (cinsn 12 (set (mem:DF (plus:DI (reg/v/f:DI <10> [ f ]) + (const_int 8)) [2 f_11(D)->y+0 S8 A64]) + (reg:DF <5> [ _6 ])) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":22) + (cinsn 13 (set (reg:DF <14>) + (mult:DF (reg:DF <2> [ _3 ]) + (reg:DF <2> [ _3 ]))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":23) + (cinsn 14 (set (reg:DF <15>) + (mult:DF (reg:DF <5> [ _6 ]) + (reg:DF <5> [ _6 ]))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":23) + (cinsn 15 (set (reg:DF <16>) + (plus:DF (reg:DF <14>) + (reg:DF <15>))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":23) + (cinsn 16 (set (reg:DF xmm0) + (reg:DF <16>)) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":23) + (ccall_insn/j 17 (set (reg:DF xmm0) + (call (mem:QI (symbol_ref:DI ("sqrt") [flags 0x41] <function_decl 0x7fa24e331d00 sqrt>) [0 __builtin_sqrt S1 A8]) + (const_int 0))) "../../src/gcc/testsuite/gcc.dg/rtl/x86_64/different-structs.c":23 + (expr_list:REG_CALL_DECL (symbol_ref:DI ("sqrt") [flags 0x41] <function_decl 0x7fa24e331d00 sqrt>) + (expr_list:REG_EH_REGION (const_int 0))) + (expr_list:DF (use (reg:DF xmm0)))) + (edge-to exit (flags "ABNORMAL | SIBCALL")) + ) ;; block 2 + (cbarrier 18) + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:DF xmm0) + ) ;; return_rtx + ) ;; crtl +) ;; function "test" + +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/final.c b/gcc/testsuite/gcc.dg/rtl/x86_64/final.c new file mode 100644 index 0000000..ff84c68 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/final.c @@ -0,0 +1,133 @@ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-final" } */ + +/* Lightly-modified dump of test.c.304r.dwarf2 for x86_64 target, + with various NOTE_INSN_CFI deleted by hand for now. */ + +int __RTL (startwith ("final")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn/f 32 (set (mem:DI (pre_dec:DI (reg/f:DI sp)) [0 S8 A8]) + (reg/f:DI bp)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn/f 33 (set (reg/f:DI bp) + (reg/f:DI sp)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 34 (set (mem/v:BLK (0|scratch:DI) [0 A8]) + (unspec:BLK [ + (mem/v:BLK (reuse_rtx 0) [0 A8]) + ] UNSPEC_MEMORY_BLOCKAGE)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 35 NOTE_INSN_PROLOGUE_END) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI ax [89]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI ax [89]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 3 (flags "FALLTHRU")) + (edge-to 4) + ) ;; block 2 + (block 3 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 3] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI ax [90]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI ax [orig:87 _1 ] [87]) + (plus:SI (reg:SI ax [90]) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 29 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 5) + ) ;; block 3 + (cbarrier 30) + (block 4 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI ax [91]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI ax [orig:87 _1 ] [87]) + (neg:SI (reg:SI ax [91]))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 5 (flags "FALLTHRU")) + ) ;; block 4 + (block 5 + (edge-from 4 (flags "FALLTHRU")) + (edge-from 3) + (clabel 20 3) + (cnote 21 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cnote 36 NOTE_INSN_EPILOGUE_BEG) + (cinsn 37 (set (mem/v:BLK (1|scratch:DI) [0 A8]) + (unspec:BLK [ + (mem/v:BLK (reuse_rtx 1) [0 A8]) + ] UNSPEC_MEMORY_BLOCKAGE)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn/f 38 (set (reg/f:DI bp) + (mem:DI (post_inc:DI (reg/f:DI sp)) [0 S8 A8])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7 + (expr_list:REG_CFA_DEF_CFA (plus:DI (reg/f:DI sp) + (const_int 8)))) + (cjump_insn 39 (simple_return) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit) + ) ;; block 5 + (cbarrier 40) + (cnote 31 NOTE_INSN_DELETED) + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* Verify that asm was emitted. */ +/* { dg-final { scan-assembler "test_1:" } } */ +/* { dg-final { scan-assembler ".cfi_startproc" } } */ +/* { dg-final { scan-assembler ".cfi_endproc" } } */ + +/* Verify that the "simple_return" was recognized. + FIXME: this assumes i386.md. */ +/* { dg-final { scan-assembler "ret" } } */ diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/into-cfglayout.c b/gcc/testsuite/gcc.dg/rtl/x86_64/into-cfglayout.c new file mode 100644 index 0000000..4a82e80 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/into-cfglayout.c @@ -0,0 +1,117 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-into_cfglayout" } */ + +/* Lightly-modified dump of test.c.226r.vregs for x86_64. */ + +#include "test_1.h" + +int __RTL (startwith ("into_cfglayout")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 4 (flags "FALLTHRU")) + (edge-to 5) + ) ;; block 2 + (block 4 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI <3>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI <0> [ _1 ]) + (plus:SI (reg:SI <3>) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 14 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 6) + ) ;; block 4 + (cbarrier 15) + (block 5 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI <4>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI <0> [ _1 ]) + (neg:SI (reg:SI <4>))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 6 (flags "FALLTHRU")) + ) ;; block 5 + (block 6 + (edge-from 4) + (edge-from 5 (flags "FALLTHRU")) + (clabel 20 3) + (cnote 21 [bb 6] NOTE_INSN_BASIC_BLOCK) + (cinsn 22 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ]))) + (cinsn 26 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 6 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* The conversion to cfglayout should eliminate unconditional jump + instructions... */ +/* { dg-final { scan-rtl-dump "Removing jump 14." "into_cfglayout" } } */ +/* { dg-final { scan-rtl-dump-not "jump_insn 14" "into_cfglayout" } } */ +/* { dg-final { scan-rtl-dump-not "barrier" "into_cfglayout" } } */ + +/* ...but conditional jumps should be preserved. */ +/* { dg-final { scan-rtl-dump "jump_insn 10" "into_cfglayout" } } */ diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/ira.c b/gcc/testsuite/gcc.dg/rtl/x86_64/ira.c new file mode 100644 index 0000000..a86a846 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/ira.c @@ -0,0 +1,111 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-ira" } */ + +/* Lightly-modified dump of test.c.265r.asmcons for x86_64. */ + +#include "test_1.h" + +int __RTL (startwith ("ira")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 3 (flags "FALLTHRU")) + (edge-to 4) + ) ;; block 2 + (block 3 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 3] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI <3>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI <0> [ _1 ]) + (plus:SI (reg:SI <3>) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 29 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 5) + ) ;; block 3 + (cbarrier 30) + (block 4 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI <4>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI <0> [ _1 ]) + (neg:SI (reg:SI <4>))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 5 (flags "FALLTHRU")) + ) ;; block 4 + (block 5 + (edge-from 4 (flags "FALLTHRU")) + (edge-from 3) + (clabel 20 3) + (cnote 21 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 22 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ]))) + (cinsn 26 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 5 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* Verify that IRA was run. */ +/* { dg-final { scan-rtl-dump "Building IRA IR" "ira" } } */ diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/pro_and_epilogue.c b/gcc/testsuite/gcc.dg/rtl/x86_64/pro_and_epilogue.c new file mode 100644 index 0000000..4ba3d6e --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/pro_and_epilogue.c @@ -0,0 +1,110 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-pro_and_epilogue" } */ + +/* Lightly-modified dump of test.c.274r.split2 for x86_64. */ + +int __RTL (startwith ("pro_and_epilogue")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI ax [89]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI ax [89]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 3 (flags "FALLTHRU")) + (edge-to 4) + ) ;; block 2 + (block 3 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 3] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI ax [90]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI ax [orig:87 _1 ] [87]) + (plus:SI (reg:SI ax [90]) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 29 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 5) + ) ;; block 3 + (cbarrier 30) + (block 4 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI ax [91]) + (mem/c:SI (plus:DI (reg/f:DI bp) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI ax [orig:87 _1 ] [87]) + (neg:SI (reg:SI ax [91]))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 5 (flags "FALLTHRU")) + ) ;; block 4 + (block 5 + (edge-from 4 (flags "FALLTHRU")) + (edge-from 3) + (clabel 20 3) + (cnote 21 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 5 + (cnote 31 NOTE_INSN_DELETED) + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* Verify that the prologue and epilogue were added. */ +/* { dg-final { scan-rtl-dump-times "NOTE_INSN_PROLOGUE_END" 1 "pro_and_epilogue" } } */ + +/* We expect a jump_insn to "simple_return". */ +/* { dg-final { scan-rtl-dump-times "simple_return" 2 "pro_and_epilogue" } } */ + diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/test-multiple-fns.c b/gcc/testsuite/gcc.dg/rtl/x86_64/test-multiple-fns.c new file mode 100644 index 0000000..dff4a1b --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/test-multiple-fns.c @@ -0,0 +1,105 @@ +/* { dg-do run { target x86_64-*-* } } */ + +/* Verify that we can have multiple __RTL functions in one test case. + Each of these __RTL functions returns a const, dumped immediately after + expand. */ + +extern void abort (void); + +int __RTL (startwith ("vregs")) test_return_42 (void) +{ + /* C code: + return 42; */ +(function "test_return_42" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cnote 2 NOTE_INSN_FUNCTION_BEG) + (cinsn 5 (set (reg:SI <0> [ _1 ]) + (const_int 42)) "../../src/test-return-const.c":3) + (cinsn 8 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ])) "../../src/test-return-const.c":3) + (cinsn 12 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/test-return-const.c":4) + (cinsn 13 (use (reg/i:SI ax)) "../../src/test-return-const.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_return_42" +} + +int __RTL (startwith ("vregs")) test_return_43 (void) +{ + /* C code: + return 43; */ +(function "test_return_43" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cnote 2 NOTE_INSN_FUNCTION_BEG) + (cinsn 5 (set (reg:SI <0> [ _1 ]) + (const_int 43)) "../../src/test-return-const.c":3) + (cinsn 8 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ])) "../../src/test-return-const.c":3) + (cinsn 12 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/test-return-const.c":4) + (cinsn 13 (use (reg/i:SI ax)) "../../src/test-return-const.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_return_43" +} + +int __RTL (startwith ("vregs")) test_return_44 (void) +{ + /* C code: + return 44; */ +(function "test_return_44" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cnote 2 NOTE_INSN_FUNCTION_BEG) + (cinsn 5 (set (reg:SI <0> [ _1 ]) + (const_int 44)) "../../src/test-return-const.c":3) + (cinsn 8 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ])) "../../src/test-return-const.c":3) + (cinsn 12 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/test-return-const.c":4) + (cinsn 13 (use (reg/i:SI ax)) "../../src/test-return-const.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_return_44" +} + +int main (void) +{ + if (test_return_42 () != 42) + abort (); + if (test_return_43 () != 43) + abort (); + if (test_return_44 () != 44) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.after-expand.c b/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.after-expand.c new file mode 100644 index 0000000..6c1202d --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.after-expand.c @@ -0,0 +1,39 @@ +/* { dg-do run { target x86_64-*-* } } */ + +extern void abort (void); + +int __RTL (startwith ("vregs")) test_returning_constant (void) +{ + /* C code: + return 42; */ +(function "test_returning_constant" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cnote 2 NOTE_INSN_FUNCTION_BEG) + (cinsn 5 (set (reg:SI <0> [ _1 ]) + (const_int 42)) "../../src/test-return-const.c":3) + (cinsn 8 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ])) "../../src/test-return-const.c":3) + (cinsn 12 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/test-return-const.c":4) + (cinsn 13 (use (reg/i:SI ax)) "../../src/test-return-const.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_returning_constant" +} + +int main (void) +{ + if (test_returning_constant () != 42) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.before-fwprop.c b/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.before-fwprop.c new file mode 100644 index 0000000..d83029e --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/test-return-const.c.before-fwprop.c @@ -0,0 +1,42 @@ +/* { dg-do run { target x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-fwprop1 -O2" } */ + +extern void abort (void); + +int __RTL (startwith ("fwprop1")) test_returning_constant (void) +{ + /* C code: + return 42; */ +(function "test_returning_constant" + (insn-chain + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cnote 2 NOTE_INSN_FUNCTION_BEG) + (cinsn 5 (set (reg:SI <0> [ <retval> ]) + (const_int 42)) "../../src/test-return-const.c":3) + (cinsn 9 (set (reg/i:SI ax) + (const_int 42)) "../../src/test-return-const.c":4 + (expr_list:REG_DEAD (reg:SI <0> [ <retval> ]))) + (cinsn 10 (use (reg/i:SI ax)) "../../src/test-return-const.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_returning_constant" +} + +/* Verify that insn 5 is eliminated. */ +/* { dg-final { scan-rtl-dump "deferring deletion of insn with uid = 5" "fwprop1" } } */ +/* { dg-final { scan-rtl-dump "Deleted 1 trivially dead insns" "fwprop1" } } */ + +int main (void) +{ + if (test_returning_constant () != 42) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/test-rtl.c b/gcc/testsuite/gcc.dg/rtl/x86_64/test-rtl.c new file mode 100644 index 0000000..4496868 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/test-rtl.c @@ -0,0 +1,101 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ + +/* Test of embedding RTL dump in a C function, tagged with "__RTL". + + This is a dump of test.c from immediately after "expand", for x86_64. */ + +int __RTL test_1 (int i, int j, int k) +{ + /* + if (i < j) + return k + 4; + else + return -k; + */ +(function "test_1" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 4 (flags "FALLTHRU")) + (edge-to 5) + ) ;; block 2 + (block 4 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI <3>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI <0> [ _1 ]) + (plus:SI (reg:SI <3>) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 14 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 6) + ) ;; block 4 + (cbarrier 15) + (block 5 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI <4>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI <0> [ _1 ]) + (neg:SI (reg:SI <4>))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 6 (flags "FALLTHRU")) + ) ;; block 5 + (block 6 + (edge-from 4) + (edge-from 5 (flags "FALLTHRU")) + (clabel 20 3) + (cnote 21 [bb 6] NOTE_INSN_BASIC_BLOCK) + (cinsn 22 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ]))) + (cinsn 26 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 6 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/test_1.h b/gcc/testsuite/gcc.dg/rtl/x86_64/test_1.h new file mode 100644 index 0000000..a783ea8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/test_1.h @@ -0,0 +1,16 @@ +/* Shared test code for the various __RTL tests of test_1 that + start at different passes. */ + +extern void abort (void); +extern int test_1 (int i, int j, int k); + +int main (void) +{ + if (test_1 (0, 0, 3) != -3) + abort (); + + if (test_1 (0, 1, 3) != 7) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.after-expand.c b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.after-expand.c new file mode 100644 index 0000000..a922c62 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.after-expand.c @@ -0,0 +1,70 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ + +extern void abort (void); + +int __RTL (startwith ("vregs")) times_two (int i) +{ + /* C function: + return i * 2; */ +(function "times_two" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ])) + ) ;; param "i" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 4 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/times-two.c":2 + (nil)) + (cnote 3 NOTE_INSN_FUNCTION_BEG) + (cinsn 6 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32])) "../../src/times-two.c":3 + (nil)) + (cinsn 7 (parallel [ + (set (reg:SI <0> [ _2 ]) + (ashift:SI (reg:SI <2>) + (const_int 1))) + (clobber (reg:CC flags)) + ]) "../../src/times-two.c":3 + (expr_list:REG_EQUAL (ashift:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32]) + (const_int 1)) + (nil))) + (cinsn 10 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _2 ])) "../../src/times-two.c":3 + (nil)) + (cinsn 14 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/times-two.c":4 + (nil)) + (cinsn 15 (use (reg/i:SI ax)) "../../src/times-two.c":4 + (nil)) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "times_two" +} + +int main (void) +{ + if (times_two (0) != 0) + abort (); + + if (times_two (1) != 2) + abort (); + + if (times_two (100) != 200) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.before-df.c b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.before-df.c new file mode 100644 index 0000000..45f4961 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.c.before-df.c @@ -0,0 +1,54 @@ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-dfinit" } */ + +int __RTL (startwith ("rtl-dfinit")) times_two (int i) +{ + /* C function: + return i * 2; */ +(function "times_two" + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 4 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/times-two.c":2) + (cnote 3 NOTE_INSN_FUNCTION_BEG) + (cinsn 6 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) "../../src/times-two.c":3) + (cinsn 7 (parallel [ + (set (reg:SI <0> [ _2 ]) + (ashift:SI (reg:SI <2>) + (const_int 1))) + (clobber (reg:CC flags)) + ]) "../../src/times-two.c":3 + (expr_list:REG_EQUAL (ashift:SI (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32]) + (const_int 1)))) + (cinsn 10 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _2 ])) "../../src/times-two.c":3) + (cinsn 14 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/times-two.c":4) + (cinsn 15 (use (reg/i:SI ax)) "../../src/times-two.c":4) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 2 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "times_two" +} + +/* Verify that the dataflow information matches what cc1 would have + generated. In particular, in earlier versions of the RTL + frontend, the exit block use of reg 0 (ax) wasn't picked up + on, due to not setting up crtl->return_rtx based on + DECL_RESULT (fndecl). */ + +/* { dg-final { scan-rtl-dump ";; exit block uses.*0 .ax. 6 .bp. 7 .sp. 20 .frame." "dfinit" } } */ + +/* { dg-final { scan-rtl-dump ";; regs ever live.*0 .ax. 5 .di. 17 .flags." "dfinit" } } */ diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.h b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.h new file mode 100644 index 0000000..3b89cb9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/times-two.h @@ -0,0 +1,22 @@ +/* Shared test code for the various __RTL tests of times_two that + start at different passes. */ + +extern void abort (void); +int times_two (int i); + +int main (void) +{ + if (times_two (0) != 0) + abort (); + + if (times_two (1) != 2) + abort (); + + if (times_two (100) != 200) + abort (); + + if (times_two (-20) != -40) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/rtl/x86_64/vregs.c b/gcc/testsuite/gcc.dg/rtl/x86_64/vregs.c new file mode 100644 index 0000000..0a3b57a --- /dev/null +++ b/gcc/testsuite/gcc.dg/rtl/x86_64/vregs.c @@ -0,0 +1,112 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-fdump-rtl-vregs" } */ + +/* Lightly-modified dump of test.c.225r.expand for x86_64. */ + +#include "test_1.h" + +int __RTL (startwith ("vregs")) test_1 (int i, int j, int k) +{ +(function "test_1" + (param "i" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -4)) [1 i+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI di [ i ]))) + (param "j" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -8)) [1 j+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI si [ j ]))) + (param "k" + (DECL_RTL (mem/c:SI (plus:DI (reg/f:DI frame) + (const_int -12)) [1 k+0 S4 A32])) + (DECL_RTL_INCOMING (reg:SI dx [ k ]))) + (insn-chain + (cnote 1 NOTE_INSN_DELETED) + (block 2 + (edge-from entry (flags "FALLTHRU")) + (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK) + (cinsn 2 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32]) + (reg:SI di [ i ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 3 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -8)) [1 j+0 S4 A32]) + (reg:SI si [ j ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cinsn 4 (set (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32]) + (reg:SI dx [ k ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":2) + (cnote 5 NOTE_INSN_FUNCTION_BEG) + (cinsn 8 (set (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -4)) [1 i+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cinsn 9 (set (reg:CCGC flags) + (compare:CCGC (reg:SI <2>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -8)) [1 j+0 S4 A32]))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (cjump_insn 10 (set (pc) + (if_then_else (ge (reg:CCGC flags) + (const_int 0)) + (label_ref 16) + (pc))) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":3) + (edge-to 4 (flags "FALLTHRU")) + (edge-to 5) + ) ;; block 2 + (block 4 + (edge-from 2 (flags "FALLTHRU")) + (cnote 11 [bb 4] NOTE_INSN_BASIC_BLOCK) + (cinsn 12 (set (reg:SI <3>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (cinsn 13 (parallel [ + (set (reg:SI <0> [ _1 ]) + (plus:SI (reg:SI <3>) + (const_int 4))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4 + (expr_list:REG_EQUAL (plus:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32]) + (const_int 4)))) + (cjump_insn 14 (set (pc) + (label_ref 20)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":4) + (edge-to 6) + ) ;; block 4 + (cbarrier 15) + (block 5 + (edge-from 2) + (clabel 16 2) + (cnote 17 [bb 5] NOTE_INSN_BASIC_BLOCK) + (cinsn 18 (set (reg:SI <4>) + (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6) + (cinsn 19 (parallel [ + (set (reg:SI <0> [ _1 ]) + (neg:SI (reg:SI <4>))) + (clobber (reg:CC flags)) + ]) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":6 + (expr_list:REG_EQUAL (neg:SI (mem/c:SI (plus:DI (reg/f:DI virtual-stack-vars) + (const_int -12)) [1 k+0 S4 A32])))) + (edge-to 6 (flags "FALLTHRU")) + ) ;; block 5 + (block 6 + (edge-from 4) + (edge-from 5 (flags "FALLTHRU")) + (clabel 20 3) + (cnote 21 [bb 6] NOTE_INSN_BASIC_BLOCK) + (cinsn 22 (set (reg:SI <1> [ <retval> ]) + (reg:SI <0> [ _1 ]))) + (cinsn 26 (set (reg/i:SI ax) + (reg:SI <1> [ <retval> ])) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (cinsn 27 (use (reg/i:SI ax)) "../../src/gcc/testsuite/gcc.dg/rtl/test.c":7) + (edge-to exit (flags "FALLTHRU")) + ) ;; block 6 + ) ;; insn-chain + (crtl + (return_rtx + (reg/i:SI ax) + ) ;; return_rtx + ) ;; crtl +) ;; function "test_1" +} + +/* The 9 instances of "virtual-stack-vars" should now all be "frame". */ +/* { dg-final { scan-rtl-dump-times "frame" 9 "vregs" } } */ +/* { dg-final { scan-rtl-dump-not "virtual-stack-vars" "vregs" } } */ -- 1.8.5.3