(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
pr41175.c
       1  /* PR target/41175 */
       2  /* { dg-do run } */
       3  /* { dg-options "-Os" } */
       4  
       5  #define X2(n) X1(n##0) X1(n##1)
       6  #define X4(n) X2(n##0) X2(n##1)
       7  #define X8(n) X4(n##0) X4(n##1)
       8  
       9  #ifndef __SPE__
      10  #define FLOAT_REG_CONSTRAINT "f"
      11  #else
      12  #define FLOAT_REG_CONSTRAINT "r"
      13  #endif
      14  
      15  volatile int ll;
      16  
      17  __attribute__((noinline)) void
      18  foo (void)
      19  {
      20    asm volatile ("" : : : "memory");
      21  }
      22  
      23  __attribute__((noinline)) void
      24  bar (char *p)
      25  {
      26    asm volatile ("" : : "r" (p) : "memory");
      27  }
      28  
      29  __attribute__((noinline)) void
      30  f1 (void)
      31  {
      32    int mem;
      33  #undef X1
      34  #define X1(n) int gpr##n = 0;
      35    X8(a) X8(b) X8(c)
      36  #undef X1
      37  #define X1(n) "+r" (gpr##n),
      38    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
      39    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
      40    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
      41    foo ();
      42  #undef X1
      43  #define X1(n) "r" (gpr##n),
      44    asm volatile ("" : : X8(a) "m" (mem) : "memory");
      45    asm volatile ("" : : X8(b) "m" (mem) : "memory");
      46    asm volatile ("" : : X8(c) "m" (mem) : "memory");
      47  }
      48  
      49  __attribute__((noinline)) void
      50  f2 (void)
      51  {
      52    int mem;
      53  #undef X1
      54  #define X1(n) int gpr##n = 0;
      55    X8(a) X8(b) X8(c)
      56  #undef X1
      57  #define X1(n) "+r" (gpr##n),
      58    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
      59    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
      60    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
      61    char *pp = __builtin_alloca (ll);
      62    bar (pp);
      63  #undef X1
      64  #define X1(n) "r" (gpr##n),
      65    asm volatile ("" : : X8(a) "m" (mem) : "memory");
      66    asm volatile ("" : : X8(b) "m" (mem) : "memory");
      67    asm volatile ("" : : X8(c) "m" (mem) : "memory");
      68  }
      69  
      70  __attribute__((noinline)) void
      71  f3 (void)
      72  {
      73    int mem;
      74  #undef X1
      75  #define X1(n) int gpr##n = 0;
      76    X8(a) X8(b) X8(c)
      77  #undef X1
      78  #define X1(n) "+r" (gpr##n),
      79    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
      80    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
      81    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
      82  #undef X1
      83  #define X1(n) "r" (gpr##n),
      84    asm volatile ("" : : X8(a) "m" (mem) : "memory");
      85    asm volatile ("" : : X8(b) "m" (mem) : "memory");
      86    asm volatile ("" : : X8(c) "m" (mem) : "memory");
      87  }
      88  
      89  #ifndef __NO_FPRS__
      90  __attribute__((noinline)) void
      91  f4 (void)
      92  {
      93    int mem;
      94  #undef X1
      95  #define X1(n) int gpr##n = 0;
      96    X8(a) X8(b) X8(c)
      97  #undef X1
      98  #define X1(n) double fpr##n = 0.0;
      99    X4(d)
     100  #undef X1
     101  #define X1(n) "+r" (gpr##n),
     102    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     103    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     104    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     105  #undef X1
     106  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     107    asm volatile ("" : X4(d) "=m" (mem) : : "memory");
     108    foo ();
     109  #undef X1
     110  #define X1(n) "r" (gpr##n),
     111    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     112    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     113    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     114  #undef X1
     115  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     116    asm volatile ("" : : X4(d) "m" (mem) : "memory");
     117  }
     118  
     119  __attribute__((noinline)) void
     120  f5 (void)
     121  {
     122    int mem;
     123  #undef X1
     124  #define X1(n) int gpr##n = 0;
     125    X8(a) X8(b) X8(c)
     126  #undef X1
     127  #define X1(n) double fpr##n = 0.0;
     128    X4(d)
     129  #undef X1
     130  #define X1(n) "+r" (gpr##n),
     131    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     132    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     133    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     134  #undef X1
     135  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     136    asm volatile ("" : X4(d) "=m" (mem) : : "memory");
     137    char *pp = __builtin_alloca (ll);
     138    bar (pp);
     139  #undef X1
     140  #define X1(n) "r" (gpr##n),
     141    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     142    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     143    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     144  #undef X1
     145  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     146    asm volatile ("" : : X4(d) "m" (mem) : "memory");
     147  }
     148  
     149  __attribute__((noinline)) void
     150  f6 (void)
     151  {
     152    int mem;
     153  #undef X1
     154  #define X1(n) int gpr##n = 0;
     155    X8(a) X8(b) X8(c)
     156  #undef X1
     157  #define X1(n) double fpr##n = 0.0;
     158    X4(d)
     159  #undef X1
     160  #define X1(n) "+r" (gpr##n),
     161    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     162    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     163    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     164  #undef X1
     165  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     166    asm volatile ("" : X4(d) "=m" (mem) : : "memory");
     167  #undef X1
     168  #define X1(n) "r" (gpr##n),
     169    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     170    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     171    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     172  #undef X1
     173  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     174    asm volatile ("" : : X4(d) "m" (mem) : "memory");
     175  }
     176  
     177  __attribute__((noinline)) void
     178  f7 (void)
     179  {
     180    int mem;
     181  #undef X1
     182  #define X1(n) int gpr##n = 0;
     183    X8(a) X8(b) X8(c)
     184  #undef X1
     185  #define X1(n) double fpr##n = 0.0;
     186    X2(d)
     187  #undef X1
     188  #define X1(n) "+r" (gpr##n),
     189    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     190    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     191    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     192  #undef X1
     193  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     194    asm volatile ("" : X2(d) "=m" (mem) : : "memory");
     195    foo ();
     196  #undef X1
     197  #define X1(n) "r" (gpr##n),
     198    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     199    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     200    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     201  #undef X1
     202  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     203    asm volatile ("" : : X2(d) "m" (mem) : "memory");
     204  }
     205  
     206  __attribute__((noinline)) void
     207  f8 (void)
     208  {
     209    int mem;
     210  #undef X1
     211  #define X1(n) int gpr##n = 0;
     212    X8(a) X8(b) X8(c)
     213  #undef X1
     214  #define X1(n) double fpr##n = 0.0;
     215    X2(d)
     216  #undef X1
     217  #define X1(n) "+r" (gpr##n),
     218    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     219    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     220    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     221  #undef X1
     222  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     223    asm volatile ("" : X2(d) "=m" (mem) : : "memory");
     224    char *pp = __builtin_alloca (ll);
     225    bar (pp);
     226  #undef X1
     227  #define X1(n) "r" (gpr##n),
     228    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     229    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     230    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     231  #undef X1
     232  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     233    asm volatile ("" : : X2(d) "m" (mem) : "memory");
     234  }
     235  
     236  __attribute__((noinline)) void
     237  f9 (void)
     238  {
     239    int mem;
     240  #undef X1
     241  #define X1(n) int gpr##n = 0;
     242    X8(a) X8(b) X8(c)
     243  #undef X1
     244  #define X1(n) double fpr##n = 0.0;
     245    X2(d)
     246  #undef X1
     247  #define X1(n) "+r" (gpr##n),
     248    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     249    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     250    asm volatile ("" : X8(c) "=m" (mem) : : "memory");
     251  #undef X1
     252  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     253    asm volatile ("" : X2(d) "=m" (mem) : : "memory");
     254  #undef X1
     255  #define X1(n) "r" (gpr##n),
     256    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     257    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     258    asm volatile ("" : : X8(c) "m" (mem) : "memory");
     259  #undef X1
     260  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     261    asm volatile ("" : : X2(d) "m" (mem) : "memory");
     262  }
     263  
     264  __attribute__((noinline)) void
     265  f10 (void)
     266  {
     267    int mem;
     268  #undef X1
     269  #define X1(n) int gpr##n = 0;
     270    X8(a) X8(b) X4(c)
     271  #undef X1
     272  #define X1(n) double fpr##n = 0.0;
     273    X1(d)
     274  #undef X1
     275  #define X1(n) "+r" (gpr##n),
     276    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     277    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     278    asm volatile ("" : X4(c) "=m" (mem) : : "memory");
     279  #undef X1
     280  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     281    asm volatile ("" : X1(d) "=m" (mem) : : "memory");
     282    foo ();
     283  #undef X1
     284  #define X1(n) "r" (gpr##n),
     285    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     286    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     287    asm volatile ("" : : X4(c) "m" (mem) : "memory");
     288  #undef X1
     289  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     290    asm volatile ("" : : X1(d) "m" (mem) : "memory");
     291  }
     292  
     293  __attribute__((noinline)) void
     294  f11 (void)
     295  {
     296    int mem;
     297  #undef X1
     298  #define X1(n) int gpr##n = 0;
     299    X8(a) X8(b) X4(c)
     300  #undef X1
     301  #define X1(n) double fpr##n = 0.0;
     302    X1(d)
     303  #undef X1
     304  #define X1(n) "+r" (gpr##n),
     305    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     306    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     307    asm volatile ("" : X4(c) "=m" (mem) : : "memory");
     308  #undef X1
     309  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     310    asm volatile ("" : X1(d) "=m" (mem) : : "memory");
     311    char *pp = __builtin_alloca (ll);
     312    bar (pp);
     313  #undef X1
     314  #define X1(n) "r" (gpr##n),
     315    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     316    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     317    asm volatile ("" : : X4(c) "m" (mem) : "memory");
     318  #undef X1
     319  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     320    asm volatile ("" : : X1(d) "m" (mem) : "memory");
     321  }
     322  
     323  __attribute__((noinline)) void
     324  f12 (void)
     325  {
     326    int mem;
     327  #undef X1
     328  #define X1(n) int gpr##n = 0;
     329    X8(a) X8(b) X4(c)
     330  #undef X1
     331  #define X1(n) double fpr##n = 0.0;
     332    X1(d)
     333  #undef X1
     334  #define X1(n) "+r" (gpr##n),
     335    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     336    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     337    asm volatile ("" : X4(c) "=m" (mem) : : "memory");
     338  #undef X1
     339  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     340    asm volatile ("" : X1(d) "=m" (mem) : : "memory");
     341  #undef X1
     342  #define X1(n) "r" (gpr##n),
     343    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     344    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     345    asm volatile ("" : : X4(c) "m" (mem) : "memory");
     346  #undef X1
     347  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     348    asm volatile ("" : : X1(d) "m" (mem) : "memory");
     349  }
     350  
     351  __attribute__((noinline)) void
     352  f13 (void)
     353  {
     354    int mem;
     355  #undef X1
     356  #define X1(n) int gpr##n = 0;
     357    X8(a) X8(b) X2(c)
     358  #undef X1
     359  #define X1(n) double fpr##n = 0.0;
     360    X8(d)
     361  #undef X1
     362  #define X1(n) "+r" (gpr##n),
     363    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     364    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     365    asm volatile ("" : X2(c) "=m" (mem) : : "memory");
     366  #undef X1
     367  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     368    asm volatile ("" : X8(d) "=m" (mem) : : "memory");
     369    foo ();
     370  #undef X1
     371  #define X1(n) "r" (gpr##n),
     372    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     373    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     374    asm volatile ("" : : X2(c) "m" (mem) : "memory");
     375  #undef X1
     376  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     377    asm volatile ("" : : X8(d) "m" (mem) : "memory");
     378  }
     379  
     380  __attribute__((noinline)) void
     381  f14 (void)
     382  {
     383    int mem;
     384  #undef X1
     385  #define X1(n) int gpr##n = 0;
     386    X8(a) X8(b) X2(c)
     387  #undef X1
     388  #define X1(n) double fpr##n = 0.0;
     389    X8(d)
     390  #undef X1
     391  #define X1(n) "+r" (gpr##n),
     392    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     393    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     394    asm volatile ("" : X2(c) "=m" (mem) : : "memory");
     395  #undef X1
     396  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     397    asm volatile ("" : X8(d) "=m" (mem) : : "memory");
     398    char *pp = __builtin_alloca (ll);
     399    bar (pp);
     400  #undef X1
     401  #define X1(n) "r" (gpr##n),
     402    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     403    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     404    asm volatile ("" : : X2(c) "m" (mem) : "memory");
     405  #undef X1
     406  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     407    asm volatile ("" : : X8(d) "m" (mem) : "memory");
     408  }
     409  
     410  __attribute__((noinline)) void
     411  f15 (void)
     412  {
     413    int mem;
     414  #undef X1
     415  #define X1(n) int gpr##n = 0;
     416    X8(a) X8(b) X2(c)
     417  #undef X1
     418  #define X1(n) double fpr##n = 0.0;
     419    X8(d)
     420  #undef X1
     421  #define X1(n) "+r" (gpr##n),
     422    asm volatile ("" : X8(a) "=m" (mem) : : "memory");
     423    asm volatile ("" : X8(b) "=m" (mem) : : "memory");
     424    asm volatile ("" : X2(c) "=m" (mem) : : "memory");
     425  #undef X1
     426  #define X1(n) "+" FLOAT_REG_CONSTRAINT (fpr##n),
     427    asm volatile ("" : X8(d) "=m" (mem) : : "memory");
     428  #undef X1
     429  #define X1(n) "r" (gpr##n),
     430    asm volatile ("" : : X8(a) "m" (mem) : "memory");
     431    asm volatile ("" : : X8(b) "m" (mem) : "memory");
     432    asm volatile ("" : : X2(c) "m" (mem) : "memory");
     433  #undef X1
     434  #define X1(n) FLOAT_REG_CONSTRAINT (fpr##n),
     435    asm volatile ("" : : X8(d) "m" (mem) : "memory");
     436  }
     437  #endif
     438  
     439  int
     440  main ()
     441  {
     442    ll = 60;
     443    f1 ();
     444    f2 ();
     445    f3 ();
     446  #ifndef __NO_FPRS__
     447    f4 ();
     448    f5 ();
     449    f6 ();
     450    f7 ();
     451    f8 ();
     452    f9 ();
     453    f10 ();
     454    f11 ();
     455    f12 ();
     456    f13 ();
     457    f14 ();
     458    f15 ();
     459  #endif
     460    return 0;
     461  }