@@ -278,6 +278,14 @@ impl<'a, 'tcx> OperandRef<'tcx> {
278278
279279impl < ' a , ' tcx > OperandValue {
280280 pub fn store ( self , bx : & Builder < ' a , ' tcx > , dest : PlaceRef < ' tcx > ) {
281+ self . store_maybe_volatile ( bx, dest, false ) ;
282+ }
283+
284+ pub fn volatile_store ( self , bx : & Builder < ' a , ' tcx > , dest : PlaceRef < ' tcx > ) {
285+ self . store_maybe_volatile ( bx, dest, true ) ;
286+ }
287+
288+ fn store_maybe_volatile ( self , bx : & Builder < ' a , ' tcx > , dest : PlaceRef < ' tcx > , volatile : bool ) {
281289 debug ! ( "OperandRef::store: operand={:?}, dest={:?}" , self , dest) ;
282290 // Avoid generating stores of zero-sized values, because the only way to have a zero-sized
283291 // value is through `undef`, and store itself is useless.
@@ -287,9 +295,14 @@ impl<'a, 'tcx> OperandValue {
287295 match self {
288296 OperandValue :: Ref ( r, source_align) =>
289297 base:: memcpy_ty ( bx, dest. llval , r, dest. layout ,
290- source_align. min ( dest. align ) ) ,
298+ source_align. min ( dest. align ) , volatile ) ,
291299 OperandValue :: Immediate ( s) => {
292- bx. store ( base:: from_immediate ( bx, s) , dest. llval , dest. align ) ;
300+ let val = base:: from_immediate ( bx, s) ;
301+ if !volatile {
302+ bx. store ( val, dest. llval , dest. align ) ;
303+ } else {
304+ bx. volatile_store ( val, dest. llval , dest. align ) ;
305+ }
293306 }
294307 OperandValue :: Pair ( a, b) => {
295308 for ( i, & x) in [ a, b] . iter ( ) . enumerate ( ) {
@@ -298,7 +311,12 @@ impl<'a, 'tcx> OperandValue {
298311 if common:: val_ty ( x) == Type :: i1 ( bx. cx ) {
299312 llptr = bx. pointercast ( llptr, Type :: i8p ( bx. cx ) ) ;
300313 }
301- bx. store ( base:: from_immediate ( bx, x) , llptr, dest. align ) ;
314+ let val = base:: from_immediate ( bx, x) ;
315+ if !volatile {
316+ bx. store ( val, llptr, dest. align ) ;
317+ } else {
318+ bx. volatile_store ( val, llptr, dest. align ) ;
319+ }
302320 }
303321 }
304322 }
0 commit comments