@@ -5155,12 +5155,12 @@
(define_expand "casesi"
[(parallel [(set (match_dup 6)
- (minus:HI (subreg:HI (match_operand:SI 0 "register_operand" "") 0)
- (match_operand:HI 1 "register_operand" "")))
+ (minus:SI (match_operand:SI 0 "register_operand" "")
+ (match_operand:SI 1 "register_operand" "")))
(clobber (scratch:QI))])
(parallel [(set (cc0)
(compare (match_dup 6)
- (match_operand:HI 2 "register_operand" "")))
+ (match_operand:SI 2 "register_operand" "")))
(clobber (match_scratch:QI 9 ""))])
(set (pc)
@@ -5179,20 +5179,20 @@
(clobber (match_dup 8))])]
""
{
- operands[6] = gen_reg_rtx (HImode);
+ operands[6] = gen_reg_rtx (SImode);
if (AVR_HAVE_EIJMP_EICALL)
{
- operands[7] = operands[6];
+ operands[7] = simplify_gen_subreg (HImode, operands[6], SImode, 0);
operands[8] = all_regs_rtx[24];
operands[10] = gen_rtx_REG (HImode, REG_Z);
}
else
{
- operands[7] = gen_rtx_PLUS (HImode, operands[6],
+ operands[7] = gen_rtx_PLUS (HImode, simplify_gen_subreg (HImode, operands[6], SImode, 0),
gen_rtx_LABEL_REF (VOIDmode, operands[3]));
operands[8] = const0_rtx;
- operands[10] = operands[6];
+ operands[10] = simplify_gen_subreg (HImode, operands[6], SImode, 0);
}
})
new file mode 100644
@@ -0,0 +1,332 @@
+/* { dg-do run } */
+/* { dg-options "-Os -Wno-overflow" } */
+
+#include "exit-abort.h"
+volatile unsigned char y;
+
+unsigned char __attribute__((noinline)) foo1 (char x)
+{
+ switch (x)
+ {
+ case (char)0x11: y = 7; break;
+ case (char)0x12: y = 4; break;
+ case (char)0x13: y = 8; break;
+ case (char)0x14: y = 21; break;
+ case (char)0x15: y = 65; break;
+ case (char)0x16: y = 27; break;
+ case (char)0x17: y = 72; break;
+ case (char)0x18: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo2 (char x)
+{
+ switch (x)
+ {
+ case 0x01: y = 7; break;
+ case 0x02: y = 4; break;
+ case 0x03: y = 8; break;
+ case 0x04: y = 21; break;
+ case 0x05: y = 65; break;
+ case 0x06: y = 27; break;
+ case 0x07: y = 72; break;
+ case 0x08: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo3 (char x)
+{
+ switch (x)
+ {
+ case 0x1000001L: y = 7; break;
+ case 0x1000002L: y = 4; break;
+ case 0x1000003L: y = 8; break;
+ case 0x1000004L: y = 21; break;
+ case 0x1000005L: y = 65; break;
+ case 0x1000006L: y = 27; break;
+ case 0x1000007L: y = 72; break;
+ case 0x1000008L: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo4 (char x)
+{
+ switch (x)
+ {
+ case 0x100000001LL: y = 7; break;
+ case 0x100000002LL: y = 4; break;
+ case 0x100000003LL: y = 8; break;
+ case 0x100000004LL: y = 21; break;
+ case 0x100000005LL: y = 65; break;
+ case 0x100000006LL: y = 27; break;
+ case 0x100000007LL: y = 72; break;
+ case 0x100000008LL: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo5 (int x)
+{
+ switch (x)
+ {
+ case (char)0x11: y = 7; break;
+ case (char)0x12: y = 4; break;
+ case (char)0x13: y = 8; break;
+ case (char)0x14: y = 21; break;
+ case (char)0x15: y = 65; break;
+ case (char)0x16: y = 27; break;
+ case (char)0x17: y = 72; break;
+ case (char)0x18: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo6 (int x)
+{
+ switch (x)
+ {
+ case 0x101: y = 7; break;
+ case 0x102: y = 4; break;
+ case 0x103: y = 8; break;
+ case 0x104: y = 21; break;
+ case 0x105: y = 65; break;
+ case 0x106: y = 27; break;
+ case 0x107: y = 72; break;
+ case 0x108: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo7 (int x)
+{
+ switch (x)
+ {
+ case 0x1000001L: y = 7; break;
+ case 0x1000002L: y = 4; break;
+ case 0x1000003L: y = 8; break;
+ case 0x1000004L: y = 21; break;
+ case 0x1000005L: y = 65; break;
+ case 0x1000006L: y = 27; break;
+ case 0x1000007L: y = 72; break;
+ case 0x1000008L: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo8 (int x)
+{
+ switch (x)
+ {
+ case 0x100000001LL: y = 7; break;
+ case 0x100000002LL: y = 4; break;
+ case 0x100000003LL: y = 8; break;
+ case 0x100000004LL: y = 21; break;
+ case 0x100000005LL: y = 65; break;
+ case 0x100000006LL: y = 27; break;
+ case 0x100000007LL: y = 72; break;
+ case 0x100000008LL: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo9 (long x)
+{
+ switch (x)
+ {
+ case (char)0x11: y = 7; break;
+ case (char)0x12: y = 4; break;
+ case (char)0x13: y = 8; break;
+ case (char)0x14: y = 21; break;
+ case (char)0x15: y = 65; break;
+ case (char)0x16: y = 27; break;
+ case (char)0x17: y = 72; break;
+ case (char)0x18: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo10 (unsigned long x)
+{
+ switch (x)
+ {
+ case 0x100: y = 39; break;
+ case 0x101: y = 7; break;
+ case 0x102: y = 4; break;
+ case 0x103: y = 8; break;
+ case 0x104: y = 21; break;
+ case 0x105: y = 65; break;
+ case 0x106: y = 27; break;
+ case 0x107: y = 72; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo11 (long x)
+{
+ switch (x)
+ {
+ case 0x1000001L: y = 7; break;
+ case 0x1000002L: y = 4; break;
+ case 0x1000003L: y = 8; break;
+ case 0x1000004L: y = 21; break;
+ case 0x1000005L: y = 65; break;
+ case 0x1000006L: y = 27; break;
+ case 0x1000007L: y = 72; break;
+ case 0x1000008L: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo12 (long x)
+{
+ switch (x)
+ {
+ case 0x100000001LL: y = 7; break;
+ case 0x100000002LL: y = 4; break;
+ case 0x100000003LL: y = 8; break;
+ case 0x100000004LL: y = 21; break;
+ case 0x100000005LL: y = 65; break;
+ case 0x100000006LL: y = 27; break;
+ case 0x100000007LL: y = 72; break;
+ case 0x100000008LL: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo13 (long long x)
+{
+ switch (x)
+ {
+ case (char)0x11: y = 7; break;
+ case (char)0x12: y = 4; break;
+ case (char)0x13: y = 8; break;
+ case (char)0x14: y = 21; break;
+ case (char)0x15: y = 65; break;
+ case (char)0x16: y = 27; break;
+ case (char)0x17: y = 72; break;
+ case (char)0x18: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo14 (long long x)
+{
+ switch (x)
+ {
+ case 0x101: y = 7; break;
+ case 0x102: y = 4; break;
+ case 0x103: y = 8; break;
+ case 0x104: y = 21; break;
+ case 0x105: y = 65; break;
+ case 0x106: y = 27; break;
+ case 0x107: y = 72; break;
+ case 0x108: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+unsigned char __attribute__((noinline)) foo15 (long long x)
+{
+ switch (x)
+ {
+ case 0x1000001L: y = 7; break;
+ case 0x1000002L: y = 4; break;
+ case 0x1000003L: y = 8; break;
+ case 0x1000004L: y = 21; break;
+ case 0x1000005L: y = 65; break;
+ case 0x1000006L: y = 27; break;
+ case 0x1000007L: y = 72; break;
+ case 0x1000008L: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+
+unsigned char __attribute__((noinline)) foo16 (long long x)
+{
+ switch (x)
+ {
+ case 0x100000001LL: y = 7; break;
+ case 0x100000002LL: y = 4; break;
+ case 0x100000003LL: y = 8; break;
+ case 0x100000004LL: y = 21; break;
+ case 0x100000005LL: y = 65; break;
+ case 0x100000006LL: y = 27; break;
+ case 0x100000007LL: y = 72; break;
+ case 0x100000008LL: y = 39; break;
+ default: y=0;
+ }
+ return y;
+}
+
+int main ()
+{
+ if (foo1 (0x13) != 8)
+ abort();
+
+ if (foo2 (0x06) != 27)
+ abort();
+
+ if (foo3 (0x02) != 4)
+ abort();
+
+ if (foo4 (0x01) != 7)
+ abort();
+
+ if (foo5 (0x15) != 65)
+ abort();
+
+ if (foo6 (0x103) != 8)
+ abort();
+
+ if (foo7 (0x04) != 21)
+ abort();
+
+ if (foo8 (0x07) != 72)
+ abort();
+
+ if (foo9 (0x10000011L) != 0)
+ abort();
+
+ if (foo10 (0x1000105L) != 0)
+ abort();
+
+ if (foo11 (0x1000008L) != 39)
+ abort();
+
+ if (foo12 (0x1000004L) != 0)
+ abort();
+
+ if (foo13 (0x109LL) != 0)
+ abort();
+
+ if (foo14 (0x108LL) != 39)
+ abort();
+
+ if (foo15 (0x1000001LL) != 7)
+ abort();
+
+ if (foo16 (0x100000004LL) != 21)
+ abort();
+
+ return 0;
+}
+
new file mode 100644
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+/* { dg-options "-Os" } */
+
+#include "exit-abort.h"
+
+volatile unsigned char y;
+
+__attribute__((noinline,noclone))
+unsigned char foo (unsigned long x)
+{
+ switch (x)
+ {
+ case 0: y = 67; break;
+ case 1: y = 20; break;
+ case 2: y = 109; break;
+ case 3: y = 33; break;
+ case 4: y = 44; break;
+ case 5: y = 37; break;
+ case 6: y = 10; break;
+ case 7: y = 98; break;
+ }
+ return y;
+}
+
+int main (void)
+{
+ if (0 != foo (7L + 0x10000L))
+ abort();
+ return 0;
+}
+
new file mode 100644
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -fno-tree-switch-conversion" } */
+
+unsigned char foo (long long x)
+{
+ unsigned char y = 0;
+ switch (x)
+ {
+ case 0: y = 67; break;
+ case 1: y = 20; break;
+ case 2: y = 109; break;
+ case 3: y = 33; break;
+ case 4: y = 44; break;
+ case 5: y = 37; break;
+ case 6: y = 10; break;
+ case 7: y = 11; break;
+ }
+ return y;
+}
+