1  /* PR target/109109 */
       2  /* { dg-do run { target ia32 } } */
       3  /* { dg-options "-O2" } */
       4  
       5  unsigned int arr[64];
       6  
       7  __attribute__((noipa, regparm (2))) unsigned long long
       8  f1 (unsigned int ax, unsigned int dx)
       9  {
      10    return (((unsigned long long) arr[ax]) << 32) | ax;
      11  }
      12  
      13  __attribute__((noipa, regparm (2))) unsigned long long
      14  f2 (unsigned int ax, unsigned int dx)
      15  {
      16    return (((unsigned long long) arr[dx]) << 32) | ax;
      17  }
      18  
      19  __attribute__((noipa, regparm (2))) unsigned long long
      20  f3 (unsigned int ax, unsigned int dx)
      21  {
      22    return (((unsigned long long) ((unsigned int *) (((char *) arr) + ax))[dx]) << 32) | ax;
      23  }
      24  
      25  __attribute__((noipa, regparm (2))) unsigned long long
      26  f4 (unsigned int ax, unsigned int dx)
      27  {
      28    return (((unsigned long long) arr[ax]) << 32) | dx;
      29  }
      30  
      31  __attribute__((noipa, regparm (2))) unsigned long long
      32  f5 (unsigned int ax, unsigned int dx)
      33  {
      34    return (((unsigned long long) arr[dx]) << 32) | dx;
      35  }
      36  
      37  __attribute__((noipa, regparm (2))) unsigned long long
      38  f6 (unsigned int ax, unsigned int dx)
      39  {
      40    return (((unsigned long long) ((unsigned int *) (((char *) arr) + ax))[dx]) << 32) | dx;
      41  }
      42  
      43  __attribute__((noipa, regparm (3))) unsigned long long
      44  f7 (unsigned int ax, unsigned int dx, unsigned int cx)
      45  {
      46    return (((unsigned long long) arr[ax]) << 32) | cx;
      47  }
      48  
      49  __attribute__((noipa, regparm (3))) unsigned long long
      50  f8 (unsigned int ax, unsigned int dx, unsigned int cx)
      51  {
      52    return (((unsigned long long) arr[dx]) << 32) | cx;
      53  }
      54  
      55  __attribute__((noipa, regparm (3))) unsigned long long
      56  f9 (unsigned int ax, unsigned int dx, unsigned int cx)
      57  {
      58    return (((unsigned long long) ((unsigned int *) (((char *) arr) + ax))[dx]) << 32) | cx;
      59  }
      60  
      61  __attribute__((noipa, regparm (2))) unsigned long long
      62  f10 (unsigned int ax, unsigned int dx)
      63  {
      64    return (((unsigned long long) ax) << 32) | arr[ax];
      65  }
      66  
      67  __attribute__((noipa, regparm (2))) unsigned long long
      68  f11 (unsigned int ax, unsigned int dx)
      69  {
      70    return (((unsigned long long) ax) << 32) | arr[dx];
      71  }
      72  
      73  __attribute__((noipa, regparm (2))) unsigned long long
      74  f12 (unsigned int ax, unsigned int dx)
      75  {
      76    return (((unsigned long long) ax) << 32) | ((unsigned int *) (((char *) arr) + ax))[dx];
      77  }
      78  
      79  __attribute__((noipa, regparm (2))) unsigned long long
      80  f13 (unsigned int ax, unsigned int dx)
      81  {
      82    return (((unsigned long long) dx) << 32) | arr[ax];
      83  }
      84  
      85  __attribute__((noipa, regparm (2))) unsigned long long
      86  f14 (unsigned int ax, unsigned int dx)
      87  {
      88    return (((unsigned long long) dx) << 32) | arr[dx];
      89  }
      90  
      91  __attribute__((noipa, regparm (2))) unsigned long long
      92  f15 (unsigned int ax, unsigned int dx)
      93  {
      94    return (((unsigned long long) dx) << 32) | ((unsigned int *) (((char *) arr) + ax))[dx];
      95  }
      96  
      97  __attribute__((noipa, regparm (3))) unsigned long long
      98  f16 (unsigned int ax, unsigned int dx, unsigned int cx)
      99  {
     100    return (((unsigned long long) cx) << 32) | arr[ax];
     101  }
     102  
     103  __attribute__((noipa, regparm (3))) unsigned long long
     104  f17 (unsigned int ax, unsigned int dx, unsigned int cx)
     105  {
     106    return (((unsigned long long) cx) << 32) | arr[dx];
     107  }
     108  
     109  __attribute__((noipa, regparm (3))) unsigned long long
     110  f18 (unsigned int ax, unsigned int dx, unsigned int cx)
     111  {
     112    return (((unsigned long long) cx) << 32) | ((unsigned int *) (((char *) arr) + ax))[dx];
     113  }
     114  
     115  int
     116  main ()
     117  {
     118    for (int i = 0; i < 64; i++)
     119      arr[i] = 64 + i;
     120  #define CHECK_EQ(x, y) do { if (x != y) __builtin_abort (); } while (0)
     121    CHECK_EQ (f1 (8, 9), 0x4800000008ULL);
     122    CHECK_EQ (f2 (8, 9), 0x4900000008ULL);
     123    CHECK_EQ (f3 (8, 9), 0x4b00000008ULL);
     124    CHECK_EQ (f4 (8, 9), 0x4800000009ULL);
     125    CHECK_EQ (f5 (8, 9), 0x4900000009ULL);
     126    CHECK_EQ (f6 (8, 9), 0x4b00000009ULL);
     127    CHECK_EQ (f7 (8, 9, 10), 0x480000000aULL);
     128    CHECK_EQ (f8 (8, 9, 10), 0x490000000aULL);
     129    CHECK_EQ (f9 (8, 9, 10), 0x4b0000000aULL);
     130    CHECK_EQ (f10 (8, 9), 0x800000048ULL);
     131    CHECK_EQ (f11 (8, 9), 0x800000049ULL);
     132    CHECK_EQ (f12 (8, 9), 0x80000004bULL);
     133    CHECK_EQ (f13 (8, 9), 0x900000048ULL);
     134    CHECK_EQ (f14 (8, 9), 0x900000049ULL);
     135    CHECK_EQ (f15 (8, 9), 0x90000004bULL);
     136    CHECK_EQ (f16 (8, 9, 10), 0xa00000048ULL);
     137    CHECK_EQ (f17 (8, 9, 10), 0xa00000049ULL);
     138    CHECK_EQ (f18 (8, 9, 10), 0xa0000004bULL);
     139  }