[PATCH] D114832: [SROA] Improve SROA to prevent generating redundant coalescing operations.
    Arthur Eubanks via Phabricator via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Wed Dec  8 15:44:37 PST 2021
    
    
  
aeubanks added a comment.
after running it through -O2:
  define i64 @test_struct_of_two_int(i1 zeroext %test, i64 ()* nocapture %p) local_unnamed_addr {
  entry:
    br i1 %test, label %return, label %if.end
  
  if.end:                                           ; preds = %entry
    %call = tail call i64 %p()
    %retval.sroa.3.0.extract.shift = and i64 %call, -4294967296
    %phi.cast = and i64 %call, 4294967295
    br label %return
  
  return:                                           ; preds = %entry, %if.end
    %retval.sroa.3.0 = phi i64 [ %retval.sroa.3.0.extract.shift, %if.end ], [ 0, %entry ]
    %retval.sroa.0.0 = phi i64 [ %phi.cast, %if.end ], [ 0, %entry ]
    %retval.sroa.0.0.insert.insert = or i64 %retval.sroa.0.0, %retval.sroa.3.0
    ret i64 %retval.sroa.0.0.insert.insert
  }
yeah I'm not sure if this is something that only happens with SROA, but it does look very weird
perhaps trying to implement something like
  b:
   phi1 = phi [b1, v1] [b2, v2]
   phi2 = phi [b1, v3] [b2, v4]
   r = op phi1, phi2
into
  b1:
   n1 = op v1, v2
  b2:
   n2 = op v3, v4
  b:
   r = phi [b1, n1] [b2, n2]
and maybe only if at least one of the ops simplifies away to prevent increasing the number of op instructions
when `test_struct_of_two_int` is properly fixed we should add a phase ordering test for it to make sure it fully optimizes correctly if we do go down this route
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114832/new/
https://reviews.llvm.org/D114832
    
    
More information about the llvm-commits
mailing list