Skip to content

Commit 6cf6139

Browse files
Bernd SchmidtWaffleLapkin
Bernd Schmidt
authored andcommitted
Change rustc_codegen_ssa's atomic_cmpxchg interface to return a pair of values
1 parent 5b8bc56 commit 6cf6139

File tree

4 files changed

+12
-20
lines changed

4 files changed

+12
-20
lines changed

compiler/rustc_codegen_gcc/src/builder.rs

+6-14
Original file line numberDiff line numberDiff line change
@@ -1296,7 +1296,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
12961296
}
12971297

12981298
// Atomic Operations
1299-
fn atomic_cmpxchg(&mut self, dst: RValue<'gcc>, cmp: RValue<'gcc>, src: RValue<'gcc>, order: AtomicOrdering, failure_order: AtomicOrdering, weak: bool) -> RValue<'gcc> {
1299+
fn atomic_cmpxchg(&mut self, dst: RValue<'gcc>, cmp: RValue<'gcc>, src: RValue<'gcc>, order: AtomicOrdering, failure_order: AtomicOrdering, weak: bool) -> (RValue<'gcc>, RValue<'gcc>) {
13001300
let expected = self.current_func().new_local(None, cmp.get_type(), "expected");
13011301
self.llbb().add_assignment(None, expected, cmp);
13021302
// NOTE: gcc doesn't support a failure memory model that is stronger than the success
@@ -1310,20 +1310,12 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
13101310
};
13111311
let success = self.compare_exchange(dst, expected, src, order, failure_order, weak);
13121312

1313-
let pair_type = self.cx.type_struct(&[src.get_type(), self.bool_type], false);
1314-
let result = self.current_func().new_local(None, pair_type, "atomic_cmpxchg_result");
1315-
let align = Align::from_bits(64).expect("align"); // TODO(antoyo): use good align.
1313+
// NOTE: since success contains the call to the intrinsic, it must be added to the basic block before
1314+
// expected so that we store expected after the call.
1315+
let success_var = self.current_func().new_local(None, self.bool_type, "success");
1316+
self.llbb().add_assignment(None, success_var, success);
13161317

1317-
let value_type = result.to_rvalue().get_type();
1318-
if let Some(struct_type) = value_type.is_struct() {
1319-
self.store(success, result.access_field(None, struct_type.get_field(1)).get_address(None), align);
1320-
// NOTE: since success contains the call to the intrinsic, it must be stored before
1321-
// expected so that we store expected after the call.
1322-
self.store(expected.to_rvalue(), result.access_field(None, struct_type.get_field(0)).get_address(None), align);
1323-
}
1324-
// TODO(antoyo): handle when value is not a struct.
1325-
1326-
result.to_rvalue()
1318+
(expected.to_rvalue(), success_var.to_rvalue())
13271319
}
13281320

13291321
fn atomic_rmw(&mut self, op: AtomicRmwBinOp, dst: RValue<'gcc>, src: RValue<'gcc>, order: AtomicOrdering) -> RValue<'gcc> {

compiler/rustc_codegen_llvm/src/builder.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
10801080
order: rustc_codegen_ssa::common::AtomicOrdering,
10811081
failure_order: rustc_codegen_ssa::common::AtomicOrdering,
10821082
weak: bool,
1083-
) -> &'ll Value {
1083+
) -> (&'ll Value, &'ll Value) {
10841084
let weak = if weak { llvm::True } else { llvm::False };
10851085
unsafe {
10861086
let value = llvm::LLVMBuildAtomicCmpXchg(
@@ -1093,7 +1093,9 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
10931093
llvm::False, // SingleThreaded
10941094
);
10951095
llvm::LLVMSetWeak(value, weak);
1096-
value
1096+
let val = self.extract_value(value, 0);
1097+
let success = self.extract_value(value, 1);
1098+
(val, success)
10971099
}
10981100
}
10991101
fn atomic_rmw(

compiler/rustc_codegen_ssa/src/mir/intrinsic.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
339339
cmp = bx.ptrtoint(cmp, bx.type_isize());
340340
src = bx.ptrtoint(src, bx.type_isize());
341341
}
342-
let pair = bx.atomic_cmpxchg(
342+
let (val, success) = bx.atomic_cmpxchg(
343343
dst,
344344
cmp,
345345
src,
346346
parse_ordering(bx, success),
347347
parse_ordering(bx, failure),
348348
weak,
349349
);
350-
let val = bx.extract_value(pair, 0);
351-
let success = bx.extract_value(pair, 1);
352350
let val = bx.from_immediate(val);
353351
let success = bx.from_immediate(success);
354352

compiler/rustc_codegen_ssa/src/traits/builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ pub trait BuilderMethods<'a, 'tcx>:
296296
order: AtomicOrdering,
297297
failure_order: AtomicOrdering,
298298
weak: bool,
299-
) -> Self::Value;
299+
) -> (Self::Value, Self::Value);
300300
fn atomic_rmw(
301301
&mut self,
302302
op: AtomicRmwBinOp,

0 commit comments

Comments
 (0)