diff options
5 files changed, 13 insertions, 9 deletions
| diff --git a/llvm/lib/CodeGen/AtomicExpandLoadLinkedPass.cpp b/llvm/lib/CodeGen/AtomicExpandLoadLinkedPass.cpp index c7cc4bcb1cb..421946ded40 100644 --- a/llvm/lib/CodeGen/AtomicExpandLoadLinkedPass.cpp +++ b/llvm/lib/CodeGen/AtomicExpandLoadLinkedPass.cpp @@ -186,7 +186,7 @@ bool AtomicExpandLoadLinked::expandAtomicRMW(AtomicRMWInst *AI) {      NewVal = Builder.CreateAnd(Loaded, AI->getValOperand(), "new");      break;    case AtomicRMWInst::Nand: -    NewVal = Builder.CreateAnd(Loaded, Builder.CreateNot(AI->getValOperand()), +    NewVal = Builder.CreateNot(Builder.CreateAnd(Loaded, AI->getValOperand()),                                 "new");      break;    case AtomicRMWInst::Or: diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index d9f8967dbf0..5e866771bd1 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -2402,7 +2402,7 @@ bool X86FastISel::X86VisitIntrinsicCall(const IntrinsicInst &I) {      case Intrinsic::usub_with_overflow:        BaseOpc = ISD::SUB; CondOpc = X86::SETBr; break;      case Intrinsic::smul_with_overflow: -      BaseOpc = ISD::MUL; CondOpc = X86::SETOr; break; +      BaseOpc = X86ISD::SMUL; CondOpc = X86::SETOr; break;      case Intrinsic::umul_with_overflow:        BaseOpc = X86ISD::UMUL; CondOpc = X86::SETOr; break;      } diff --git a/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll b/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll index 0f5b23998ee..3377849f669 100644 --- a/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll +++ b/llvm/test/CodeGen/AArch64/arm64-atomic-128.ll @@ -22,8 +22,10 @@ define void @fetch_and_nand(i128* %p, i128 %bits) {  ; CHECK-LABEL: fetch_and_nand:  ; CHECK: [[LABEL:.?LBB[0-9]+_[0-9]+]]:  ; CHECK: ldxp  [[DEST_REGLO:x[0-9]+]], [[DEST_REGHI:x[0-9]+]], [x0] -; CHECK-DAG: bic    [[SCRATCH_REGLO:x[0-9]+]], [[DEST_REGLO]], x2 -; CHECK-DAG: bic    [[SCRATCH_REGHI:x[0-9]+]], [[DEST_REGHI]], x3 +; CHECK-DAG: and    [[TMP_REGLO:x[0-9]+]], [[DEST_REGLO]], x2 +; CHECK-DAG: and    [[TMP_REGHI:x[0-9]+]], [[DEST_REGHI]], x3 +; CHECK-DAG: mvn    [[SCRATCH_REGLO:x[0-9]+]], [[TMP_REGLO]] +; CHECK-DAG: mvn    [[SCRATCH_REGHI:x[0-9]+]], [[TMP_REGHI]]  ; CHECK: stlxp  [[SCRATCH_RES:w[0-9]+]], [[SCRATCH_REGLO]], [[SCRATCH_REGHI]], [x0]  ; CHECK: cbnz   [[SCRATCH_RES]], [[LABEL]] diff --git a/llvm/test/CodeGen/AArch64/arm64-atomic.ll b/llvm/test/CodeGen/AArch64/arm64-atomic.ll index aef79cb386b..b56f91ddd11 100644 --- a/llvm/test/CodeGen/AArch64/arm64-atomic.ll +++ b/llvm/test/CodeGen/AArch64/arm64-atomic.ll @@ -35,7 +35,8 @@ define i32 @fetch_and_nand(i32* %p) {  ; CHECK-LABEL: fetch_and_nand:  ; CHECK: [[LABEL:.?LBB[0-9]+_[0-9]+]]:  ; CHECK: ldxr   w[[DEST_REG:[0-9]+]], [x0] -; CHECK: and    [[SCRATCH2_REG:w[0-9]+]], w[[DEST_REG]], #0xfffffff8 +; CHECK: mvn    [[TMP_REG:w[0-9]+]], w[[DEST_REG]] +; CHECK: orr    [[SCRATCH2_REG:w[0-9]+]], [[TMP_REG]], #0xfffffff8  ; CHECK-NOT: stlxr [[SCRATCH2_REG]], [[SCRATCH2_REG]]  ; CHECK: stlxr   [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x0]  ; CHECK: cbnz   [[SCRATCH_REG]], [[LABEL]] @@ -48,8 +49,9 @@ define i64 @fetch_and_nand_64(i64* %p) {  ; CHECK-LABEL: fetch_and_nand_64:  ; CHECK: mov    x[[ADDR:[0-9]+]], x0  ; CHECK: [[LABEL:.?LBB[0-9]+_[0-9]+]]: -; CHECK: ldaxr   [[DEST_REG:x[0-9]+]], [x[[ADDR]]] -; CHECK: and    [[SCRATCH2_REG:x[0-9]+]], [[DEST_REG]], #0xfffffffffffffff8 +; CHECK: ldaxr   x[[DEST_REG:[0-9]+]], [x[[ADDR]]] +; CHECK: mvn    w[[TMP_REG:[0-9]+]], w[[DEST_REG]] +; CHECK: orr    [[SCRATCH2_REG:x[0-9]+]], x[[TMP_REG]], #0xfffffffffffffff8  ; CHECK: stlxr   [[SCRATCH_REG:w[0-9]+]], [[SCRATCH2_REG]], [x[[ADDR]]]  ; CHECK: cbnz   [[SCRATCH_REG]], [[LABEL]] diff --git a/llvm/test/Transforms/AtomicExpandLoadLinked/ARM/atomic-expansion-v7.ll b/llvm/test/Transforms/AtomicExpandLoadLinked/ARM/atomic-expansion-v7.ll index f2f5b925163..6a93016fc26 100644 --- a/llvm/test/Transforms/AtomicExpandLoadLinked/ARM/atomic-expansion-v7.ll +++ b/llvm/test/Transforms/AtomicExpandLoadLinked/ARM/atomic-expansion-v7.ll @@ -80,8 +80,8 @@ define i16 @test_atomic_nand_i16(i16* %ptr, i16 %nandend) {  ; CHECK: [[LOOP]]:  ; CHECK: [[OLDVAL32:%.*]] = call i32 @llvm.arm.ldrex.p0i16(i16* %ptr)  ; CHECK: [[OLDVAL:%.*]] = trunc i32 [[OLDVAL32]] to i16 -; CHECK: [[NEWVAL_TMP:%.*]] = xor i16 %nandend, -1 -; CHECK: [[NEWVAL:%.*]] = and i16 [[OLDVAL]], [[NEWVAL_TMP]] +; CHECK: [[NEWVAL_TMP:%.*]] = and i16 [[OLDVAL]], %nandend +; CHECK: [[NEWVAL:%.*]] = xor i16 [[NEWVAL_TMP]], -1  ; CHECK: [[NEWVAL32:%.*]] = zext i16 [[NEWVAL]] to i32  ; CHECK: [[TRYAGAIN:%.*]] = call i32 @llvm.arm.strex.p0i16(i32 [[NEWVAL32]], i16* %ptr)  ; CHECK: [[TST:%.*]] = icmp ne i32 [[TRYAGAIN]], 0 | 

