[X86] Fix atomic rmw intrinsic expansion for non-opaque pointers
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 Nov 2022 14:24:14 +0000 (15:24 +0100)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 Nov 2022 14:39:30 +0000 (15:39 +0100)
This is a bit annoying, but there are still users out there that got
broken by this (this time it was numba). We need to keep some barebones
support around until non-opaque pointers are completely gone.

llvm/lib/Target/X86/X86ISelLowering.cpp

index 89eeab5..e9d4140 100644 (file)
@@ -31490,9 +31490,10 @@ void X86TargetLowering::emitCmpArithAtomicRMWIntrinsic(
   }
   Function *CmpArith =
       Intrinsic::getDeclaration(AI->getModule(), IID, AI->getType());
-  Value *Call = Builder.CreateCall(CmpArith, {AI->getPointerOperand(),
-                                              AI->getValOperand(),
-                                              Builder.getInt32((unsigned)CC)});
+  Value *Addr = Builder.CreatePointerCast(AI->getPointerOperand(),
+                                          Type::getInt8PtrTy(Ctx));
+  Value *Call = Builder.CreateCall(
+      CmpArith, {Addr, AI->getValOperand(), Builder.getInt32((unsigned)CC)});
   Value *Result = Builder.CreateTrunc(Call, Type::getInt1Ty(Ctx));
   ICI->replaceAllUsesWith(Result);
   ICI->eraseFromParent();