Skip to content
  • Bill Wendling's avatar
    We have a chance for an optimization. Consider this code: · 6789f8b6
    Bill Wendling authored
    int x(int t) {
      if (t & 256)
        return -26;
      return 0;
    }
    
    We generate this:
    
         tst.w   r0, #256
         mvn     r0, #25
         it      eq
         moveq   r0, #0
    
    while gcc generates this:
    
         ands    r0, r0, #256
         it      ne
         mvnne   r0, #25
         bx      lr
    
    Scandalous really!
    
    During ISel time, we can look for this particular pattern. One where we have a
    "MOVCC" that uses the flag off of a CMPZ that itself is comparing an AND
    instruction to 0. Something like this (greatly simplified):
    
      %r0 = ISD::AND ...
      ARMISD::CMPZ %r0, 0         @ sets [CPSR]
      %r0 = ARMISD::MOVCC 0, -26  @ reads [CPSR]
    
    All we have to do is convert the "ISD::AND" into an "ARM::ANDS" that sets [CPSR]
    when it's zero. The zero value will all ready be in the %r0 register and we only
    need to change it if the AND wasn't zero. Easy!
    
    llvm-svn: 112664
    6789f8b6
Loading