Skip to content
  • Benjamin Kramer's avatar
    InstCombine: Turn (zext A) udiv (zext B) into (zext (A udiv B)). Same for urem or constant B. · 9aa91b1f
    Benjamin Kramer authored
    This obviously helps a lot if the division would be turned into a libcall
    (think i64 udiv on i386), but div is also one of the few remaining instructions
    on modern CPUs that become more expensive when the bitwidth gets bigger.
    
    This also helps register pressure on i386 when dividing chars, divb needs
    two 8-bit parts of a 16 bit register as input where divl uses two registers.
    
    int foo(unsigned char a) { return a/10; }
    int bar(unsigned char a, unsigned char b) { return a/b; }
    
    compiles into (x86_64)
    _foo:
      imull $205, %edi, %eax
      shrl  $11, %eax
      ret
    _bar:
      movzbl        %dil, %eax
      divb  %sil, %al
      movzbl        %al, %eax
      ret
    
    llvm-svn: 130615
    9aa91b1f
Loading