modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr23135.c (about) 1 /* Based on execute/simd-1.c, modified by joern.rennecke@st.com to 2 trigger a reload bug. Verified for gcc mainline from 20050722 13:00 UTC 3 for sh-elf -m4 -O2. */ 4 /* { dg-options "-Wno-psabi" } */ 5 /* { dg-add-options stack_size } */ 6 7 #ifndef STACK_SIZE 8 #define STACK_SIZE (256*1024) 9 #endif 10 11 extern void abort (void); 12 extern void exit (int); 13 14 typedef struct { char c[STACK_SIZE/2]; } big_t; 15 16 typedef int __attribute__((mode(SI))) __attribute__((vector_size (8))) vecint; 17 typedef int __attribute__((mode(SI))) siint; 18 19 vecint i = { 150, 100 }; 20 vecint j = { 10, 13 }; 21 vecint k; 22 23 union { 24 vecint v; 25 siint i[2]; 26 } res; 27 28 void 29 verify (siint a1, siint a2, siint b1, siint b2, big_t big) 30 { 31 if (a1 != b1 32 || a2 != b2) 33 abort (); 34 } 35 36 int 37 main () 38 { 39 big_t big; 40 vecint k0, k1, k2, k3, k4, k5, k6, k7; 41 42 k0 = i + j; 43 res.v = k0; 44 45 verify (res.i[0], res.i[1], 160, 113, big); 46 47 k1 = i * j; 48 res.v = k1; 49 50 verify (res.i[0], res.i[1], 1500, 1300, big); 51 52 k2 = i / j; 53 /* This is the observed failure - reload 0 has the wrong type and thus the 54 conflict with reload 1 is missed: 55 56 (insn:HI 94 92 96 1 pr23135.c:46 (parallel [ 57 (set (subreg:SI (reg:DI 253) 0) 58 (div:SI (reg:SI 4 r4) 59 (reg:SI 5 r5))) 60 (clobber (reg:SI 146 pr)) 61 (clobber (reg:DF 64 fr0)) 62 (clobber (reg:DF 66 fr2)) 63 (use (reg:PSI 151 )) 64 (use (reg/f:SI 256)) 65 ]) 60 {divsi3_i4} (insn_list:REG_DEP_TRUE 90 (insn_list:REG_DEP_TRUE 89 66 (insn_list:REG_DEP_TRUE 42 (insn_list:REG_DEP_TRUE 83 (insn_list:REG_DEP_TRUE 92 67 (insn_list:REG_DEP_TRUE 91 (nil))))))) 68 (expr_list:REG_DEAD (reg:SI 4 r4) 69 (expr_list:REG_DEAD (reg:SI 5 r5) 70 (expr_list:REG_UNUSED (reg:DF 66 fr2) 71 (expr_list:REG_UNUSED (reg:DF 64 fr0) 72 (expr_list:REG_UNUSED (reg:SI 146 pr) 73 (insn_list:REG_RETVAL 91 (nil)))))))) 74 75 Reloads for insn # 94 76 Reload 0: reload_in (SI) = (plus:SI (reg/f:SI 14 r14) 77 (const_int 64 [0x40])) 78 GENERAL_REGS, RELOAD_FOR_OUTADDR_ADDRESS (opnum = 0) 79 reload_in_reg: (plus:SI (reg/f:SI 14 r14) 80 (const_int 64 [0x40])) 81 reload_reg_rtx: (reg:SI 3 r3) 82 Reload 1: GENERAL_REGS, RELOAD_FOR_OUTPUT_ADDRESS (opnum = 0), can't combine, se 83 condary_reload_p 84 reload_reg_rtx: (reg:SI 3 r3) 85 Reload 2: reload_out (SI) = (mem:SI (plus:SI (plus:SI (reg/f:SI 14 r14) 86 (const_int 64 [0x40])) 87 (const_int 28 [0x1c])) [ 16 S8 A32]) 88 FPUL_REGS, RELOAD_FOR_OUTPUT (opnum = 0) 89 reload_out_reg: (subreg:SI (reg:DI 253) 0) 90 reload_reg_rtx: (reg:SI 150 fpul) 91 secondary_out_reload = 1 92 93 Reload 3: reload_in (SI) = (symbol_ref:SI ("__sdivsi3_i4") [flags 0x1]) 94 GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 1), can't combine 95 reload_in_reg: (reg/f:SI 256) 96 reload_reg_rtx: (reg:SI 3 r3) 97 */ 98 99 100 res.v = k2; 101 102 verify (res.i[0], res.i[1], 15, 7, big); 103 104 k3 = i & j; 105 res.v = k3; 106 107 verify (res.i[0], res.i[1], 2, 4, big); 108 109 k4 = i | j; 110 res.v = k4; 111 112 verify (res.i[0], res.i[1], 158, 109, big); 113 114 k5 = i ^ j; 115 res.v = k5; 116 117 verify (res.i[0], res.i[1], 156, 105, big); 118 119 k6 = -i; 120 res.v = k6; 121 verify (res.i[0], res.i[1], -150, -100, big); 122 123 k7 = ~i; 124 res.v = k7; 125 verify (res.i[0], res.i[1], -151, -101, big); 126 127 k = k0 + k1 + k3 + k4 + k5 + k6 + k7; 128 res.v = k; 129 verify (res.i[0], res.i[1], 1675, 1430, big); 130 131 k = k0 * k1 * k3 * k4 * k5 * k6 * k7; 132 res.v = k; 133 verify (res.i[0], res.i[1], 1456467968, -1579586240, big); 134 135 k = k0 / k1 / k2 / k3 / k4 / k5 / k6 / k7; 136 res.v = k; 137 verify (res.i[0], res.i[1], 0, 0, big); 138 139 exit (0); 140 }