| Index: src/IceTargetLoweringX8632.cpp
 | 
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
 | 
| index 94ab396ccaffdbb52390180d8791bbab315095ab..938c6746cb827e78a60f7102dc5eaaaf63762596 100644
 | 
| --- a/src/IceTargetLoweringX8632.cpp
 | 
| +++ b/src/IceTargetLoweringX8632.cpp
 | 
| @@ -689,10 +689,13 @@ void TargetX8632::findRMW() {
 | 
|              if (!isSameMemAddressOperand(Load->getSourceAddress(),
 | 
|                                           Store->getAddr()))
 | 
|                continue;
 | 
| -            if (false && Load->getSourceAddress() != Store->getAddr())
 | 
| -              continue;
 | 
| -            if (Arith->getSrc(0) != Load->getDest())
 | 
| -              continue;
 | 
| +            Operand *ArithSrcFromLoad = Arith->getSrc(0);
 | 
| +            Operand *ArithSrcOther = Arith->getSrc(1);
 | 
| +            if (ArithSrcFromLoad != Load->getDest()) {
 | 
| +              if (!Arith->isCommutative() || ArithSrcOther != Load->getDest())
 | 
| +                continue;
 | 
| +              std::swap(ArithSrcFromLoad, ArithSrcOther);
 | 
| +            }
 | 
|              if (Arith->getDest() != Store->getData())
 | 
|                continue;
 | 
|              if (!canRMW(Arith))
 | 
| @@ -712,8 +715,7 @@ void TargetX8632::findRMW() {
 | 
|              InstFakeDef *BeaconDef = InstFakeDef::create(Func, Beacon);
 | 
|              Node->getInsts().insert(I3, BeaconDef);
 | 
|              InstX8632FakeRMW *RMW = InstX8632FakeRMW::create(
 | 
| -                Func, Arith->getSrc(1), Store->getAddr(), Beacon,
 | 
| -                Arith->getOp());
 | 
| +                Func, ArithSrcOther, Store->getAddr(), Beacon, Arith->getOp());
 | 
|              Node->getInsts().insert(I3, RMW);
 | 
|            }
 | 
|          }
 | 
| 
 |