15 #define DEBUG_TYPE "loweratomic"
29 LoadInst *Orig = Builder.CreateLoad(Ptr);
30 Value *Equal = Builder.CreateICmpEQ(Orig, Cmp);
31 Value *Res = Builder.CreateSelect(Equal, Val, Orig);
32 Builder.CreateStore(Res, Ptr);
44 LoadInst *Orig = Builder.CreateLoad(Ptr);
53 Res = Builder.CreateAdd(Orig, Val);
56 Res = Builder.CreateSub(Orig, Val);
59 Res = Builder.CreateAnd(Orig, Val);
62 Res = Builder.CreateNot(Builder.CreateAnd(Orig, Val));
65 Res = Builder.CreateOr(Orig, Val);
68 Res = Builder.CreateXor(Orig, Val);
71 Res = Builder.CreateSelect(Builder.CreateICmpSLT(Orig, Val),
75 Res = Builder.CreateSelect(Builder.CreateICmpSLT(Orig, Val),
79 Res = Builder.CreateSelect(Builder.CreateICmpULT(Orig, Val),
83 Res = Builder.CreateSelect(Builder.CreateICmpULT(Orig, Val),
87 Builder.CreateStore(Res, Ptr);
115 bool Changed =
false;
118 if (
FenceInst *FI = dyn_cast<FenceInst>(Inst))
122 else if (
AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(Inst))
124 else if (
LoadInst *
LI = dyn_cast<LoadInst>(Inst)) {
127 }
else if (
StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
139 "Lower atomic intrinsics to non-atomic form",
static PassRegistry * getPassRegistry()
*p = old <signed v ? old : v
*p = old <unsigned v ? old : v
static bool LowerLoadInst(LoadInst *LI)
*p = old >unsigned v ? old : v
Value * getNewValOperand()
static bool LowerFenceInst(FenceInst *FI)
*p = old >signed v ? old : v
LoopInfoBase< BlockT, LoopT > * LI
#define llvm_unreachable(msg)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
ID
LLVM Calling Convention Representation.
Value * getPointerOperand()
void setAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope=CrossThread)
static bool LowerStoreInst(StoreInst *SI)
void replaceAllUsesWith(Value *V)
LLVM Basic Block Representation.
Value * getCompareOperand()
static bool LowerAtomicRMWInst(AtomicRMWInst *RMWI)
void initializeLowerAtomicPass(PassRegistry &)
void setAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope=CrossThread)
Pass * createLowerAtomicPass()
BinOp getOperation() const
Value * getPointerOperand()
INITIALIZE_PASS(LowerAtomic,"loweratomic","Lower atomic intrinsics to non-atomic form", false, false) Pass *llvm
LLVM Value Representation.
static bool LowerAtomicCmpXchgInst(AtomicCmpXchgInst *CXI)
const BasicBlock * getParent() const