On 3/27/23 00:59, juzhe.zh...@rivai.ai wrote:
From: Juzhe-Zhong <juzhe.zh...@rivai.ai>

         PR 108270

Fix bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108270.

Consider the following testcase:
void f (void * restrict in, void * restrict out, int l, int n, int m)
{
   for (int i = 0; i < l; i++){
     for (int j = 0; j < m; j++){
       for (int k = 0; k < n; k++)
         {
           vint8mf8_t v = __riscv_vle8_v_i8mf8 (in + i + j, 17);
           __riscv_vse8_v_i8mf8 (out + i + j, v, 17);
         }
     }
   }
}

Compile option: -O3

Before this patch:
        mv      a7,a2
        mv      a6,a0   
         mv     t1,a1
        mv      a2,a3
        vsetivli        zero,17,e8,mf8,ta,ma
...

After this patch:
         mv      a7,a2
         mv      a6,a0
         mv      t1,a1
         mv      a2,a3
         ble     a7,zero,.L1
         ble     a4,zero,.L1
         ble     a3,zero,.L1
         add     a1,a0,a4
         li      a0,0
         vsetivli        zero,17,e8,mf8,ta,ma
...

It will produce potential bug when:

int main ()
{
   vsetivli zero, 100,.....
   f (in, out, 0,0,0)
   asm volatile ("csrr a0,vl":::"memory");

   // Before this patch the a0 is 17. (Wrong).
   // After this patch the a0 is 100. (Correct).
   ...
}
So why was that point selected in the first place? I would have expected LCM to select the loop entry edge as the desired insertion point.

Essentially if LCM selects the point before those branches, then it's voilating a fundamental principal of LCM, namely that you never put an evaluation on a path where it didn't have one before.

So not objecting to the patch but it is raising concerns about the LCM results.

jeff

Reply via email to