Lines Matching refs:RMWI
23 bool isIdempotentRMW(AtomicRMWInst& RMWI) { in isIdempotentRMW() argument
24 if (auto CF = dyn_cast<ConstantFP>(RMWI.getValOperand())) in isIdempotentRMW()
25 switch(RMWI.getOperation()) { in isIdempotentRMW()
34 auto C = dyn_cast<ConstantInt>(RMWI.getValOperand()); in isIdempotentRMW()
38 switch(RMWI.getOperation()) { in isIdempotentRMW()
61 bool isSaturating(AtomicRMWInst& RMWI) { in isSaturating() argument
62 if (auto CF = dyn_cast<ConstantFP>(RMWI.getValOperand())) in isSaturating()
63 switch(RMWI.getOperation()) { in isSaturating()
71 auto C = dyn_cast<ConstantInt>(RMWI.getValOperand()); in isSaturating()
75 switch(RMWI.getOperation()) { in isSaturating()
96 Instruction *InstCombiner::visitAtomicRMWInst(AtomicRMWInst &RMWI) { in visitAtomicRMWInst() argument
101 if (RMWI.isVolatile()) in visitAtomicRMWInst()
106 if (isSaturating(RMWI) && in visitAtomicRMWInst()
107 RMWI.getOperation() != AtomicRMWInst::Xchg) { in visitAtomicRMWInst()
108 RMWI.setOperation(AtomicRMWInst::Xchg); in visitAtomicRMWInst()
109 return &RMWI; in visitAtomicRMWInst()
112 AtomicOrdering Ordering = RMWI.getOrdering(); in visitAtomicRMWInst()
119 if (RMWI.getOperation() == AtomicRMWInst::Xchg && in visitAtomicRMWInst()
120 RMWI.use_empty()) { in visitAtomicRMWInst()
124 auto *SI = new StoreInst(RMWI.getValOperand(), in visitAtomicRMWInst()
125 RMWI.getPointerOperand(), &RMWI); in visitAtomicRMWInst()
126 SI->setAtomic(Ordering, RMWI.getSyncScopeID()); in visitAtomicRMWInst()
127 SI->setAlignment(MaybeAlign(DL.getABITypeAlignment(RMWI.getType()))); in visitAtomicRMWInst()
128 return eraseInstFromFunction(RMWI); in visitAtomicRMWInst()
131 if (!isIdempotentRMW(RMWI)) in visitAtomicRMWInst()
138 if (RMWI.getType()->isIntegerTy() && in visitAtomicRMWInst()
139 RMWI.getOperation() != AtomicRMWInst::Or) { in visitAtomicRMWInst()
140 RMWI.setOperation(AtomicRMWInst::Or); in visitAtomicRMWInst()
141 RMWI.setOperand(1, ConstantInt::get(RMWI.getType(), 0)); in visitAtomicRMWInst()
142 return &RMWI; in visitAtomicRMWInst()
143 } else if (RMWI.getType()->isFloatingPointTy() && in visitAtomicRMWInst()
144 RMWI.getOperation() != AtomicRMWInst::FAdd) { in visitAtomicRMWInst()
145 RMWI.setOperation(AtomicRMWInst::FAdd); in visitAtomicRMWInst()
146 RMWI.setOperand(1, ConstantFP::getNegativeZero(RMWI.getType())); in visitAtomicRMWInst()
147 return &RMWI; in visitAtomicRMWInst()
155 LoadInst *Load = new LoadInst(RMWI.getType(), RMWI.getPointerOperand()); in visitAtomicRMWInst()
156 Load->setAtomic(Ordering, RMWI.getSyncScopeID()); in visitAtomicRMWInst()
157 Load->setAlignment(MaybeAlign(DL.getABITypeAlignment(RMWI.getType()))); in visitAtomicRMWInst()