Skip to content
  • Tim Northover's avatar
    ARM & AArch64: make use of common cmpxchg idioms after expansion · b4ddc084
    Tim Northover authored
    The C and C++ semantics for compare_exchange require it to return a bool
    indicating success. This gets mapped to LLVM IR which follows each cmpxchg with
    an icmp of the value loaded against the desired value.
    
    When lowered to ldxr/stxr loops, this extra comparison is redundant: its
    results are implicit in the control-flow of the function.
    
    This commit makes two changes: it replaces that icmp with appropriate PHI
    nodes, and then makes sure earlyCSE is called after expansion to actually make
    use of the opportunities revealed.
    
    I've also added -{arm,aarch64}-enable-atomic-tidy options, so that
    existing fragile tests aren't perturbed too much by the change. Many
    of them either rely on undef/unreachable too pervasively to be
    restored to something well-defined (particularly while making sure
    they test the same obscure assert from many years ago), or depend on a
    particular CFG shape, which is disrupted by SimplifyCFG.
    
    rdar://problem/16227836
    
    llvm-svn: 209883
    b4ddc084
Loading