From: Matt Arsenault Date: Fri, 12 Jun 2020 12:49:18 +0000 (-0400) Subject: GlobalISel: Don't fail translate on weak cmpxchg X-Git-Tag: llvmorg-12-init~1743 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c2e403c19d40524f868d7803b104224ca4978597;p=platform%2Fupstream%2Fllvm.git GlobalISel: Don't fail translate on weak cmpxchg The translation of cmpxchg added by 9481399c0fd2c198c81b92636c0dcff7d4c41df2 specifically skipped weak cmpxchg due to not understanding the meaning. Weak cmpxchg was added in 420a216817def01816186910a2e35885c9201951. As explained in the commit message, the weak mode is implicit in how ATOMIC_CMP_SWAP_WITH_SUCCESS is lowered. If it's expanded to a regular ATOMIC_CMP_SWAP, it's replaced with a strong cmpxchg. This handling seems weird to me, but this was already following the DAG behavior. I would expect the strong IR instruction to not have the boolean output. Failing that, I might expect the IRTranslator to emit ATOMIC_CMP_SWAP and a constant for the boolean. --- diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index fae7387..eabab3f 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2023,9 +2023,6 @@ bool IRTranslator::translateAtomicCmpXchg(const User &U, MachineIRBuilder &MIRBuilder) { const AtomicCmpXchgInst &I = cast(U); - if (I.isWeak()) - return false; - auto &TLI = *MF->getSubtarget().getTargetLowering(); auto Flags = TLI.getAtomicMemOperandFlags(I, *DL); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 8e312d8..7e806e5 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -1968,6 +1968,32 @@ done: ret i32 %value_loaded } +; Try one cmpxchg +define i32 @test_weak_atomic_cmpxchg_1(i32* %addr) { +; CHECK-LABEL: name: test_weak_atomic_cmpxchg_1 +; CHECK: bb.1.entry: +; CHECK-NEXT: successors: %bb.{{[^)]+}} +; CHECK-NEXT: liveins: $x0 +; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0 +; CHECK-NEXT: [[OLDVAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +; CHECK-NEXT: [[NEWVAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 +; CHECK: bb.2.repeat: +; CHECK-NEXT: successors: %bb.3({{[^)]+}}), %bb.2({{[^)]+}}) +; CHECK: [[OLDVALRES:%[0-9]+]]:_(s32), [[SUCCESS:%[0-9]+]]:_(s1) = G_ATOMIC_CMPXCHG_WITH_SUCCESS [[ADDR]](p0), [[OLDVAL]], [[NEWVAL]] :: (load store monotonic monotonic 4 on %ir.addr) +; CHECK-NEXT: G_BRCOND [[SUCCESS]](s1), %bb.3 +; CHECK-NEXT: G_BR %bb.2 +; CHECK: bb.3.done: +entry: + br label %repeat +repeat: + %val_success = cmpxchg weak i32* %addr, i32 0, i32 1 monotonic monotonic + %value_loaded = extractvalue { i32, i1 } %val_success, 0 + %success = extractvalue { i32, i1 } %val_success, 1 + br i1 %success, label %done, label %repeat +done: + ret i32 %value_loaded +} + ; Try one cmpxchg with a small type and high atomic ordering. define i16 @test_atomic_cmpxchg_2(i16* %addr) { ; CHECK-LABEL: name: test_atomic_cmpxchg_2