46 lines
1.6 KiB
Diff
46 lines
1.6 KiB
Diff
|
Pull in r200130 from upstream llvm trunk (by Jakob Stoklund Olesen):
|
||
|
|
||
|
Fix swapped CASA operands.
|
||
|
|
||
|
Found by SingleSource/UnitTests/AtomicOps.c
|
||
|
|
||
|
Introduced here: http://svn.freebsd.org/changeset/base/262261
|
||
|
|
||
|
Index: lib/Target/Sparc/SparcISelLowering.cpp
|
||
|
===================================================================
|
||
|
--- lib/Target/Sparc/SparcISelLowering.cpp
|
||
|
+++ lib/Target/Sparc/SparcISelLowering.cpp
|
||
|
@@ -2972,7 +2972,7 @@ SparcTargetLowering::expandAtomicRMW(MachineInstr
|
||
|
// loop:
|
||
|
// %val = phi %val0, %dest
|
||
|
// %upd = op %val, %rs2
|
||
|
- // %dest = cas %addr, %upd, %val
|
||
|
+ // %dest = cas %addr, %val, %upd
|
||
|
// cmp %val, %dest
|
||
|
// bne loop
|
||
|
// done:
|
||
|
@@ -3031,7 +3031,7 @@ SparcTargetLowering::expandAtomicRMW(MachineInstr
|
||
|
}
|
||
|
|
||
|
BuildMI(LoopMBB, DL, TII.get(is64Bit ? SP::CASXrr : SP::CASrr), DestReg)
|
||
|
- .addReg(AddrReg).addReg(UpdReg).addReg(ValReg)
|
||
|
+ .addReg(AddrReg).addReg(ValReg).addReg(UpdReg)
|
||
|
.setMemRefs(MI->memoperands_begin(), MI->memoperands_end());
|
||
|
BuildMI(LoopMBB, DL, TII.get(SP::CMPrr)).addReg(ValReg).addReg(DestReg);
|
||
|
BuildMI(LoopMBB, DL, TII.get(is64Bit ? SP::BPXCC : SP::BCOND))
|
||
|
Index: test/CodeGen/SPARC/atomics.ll
|
||
|
===================================================================
|
||
|
--- test/CodeGen/SPARC/atomics.ll
|
||
|
+++ test/CodeGen/SPARC/atomics.ll
|
||
|
@@ -64,8 +64,8 @@ entry:
|
||
|
|
||
|
; CHECK-LABEL: test_load_add_32
|
||
|
; CHECK: membar
|
||
|
-; CHECK: add
|
||
|
-; CHECK: cas [%o0]
|
||
|
+; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]]
|
||
|
+; CHECK: cas [%o0], [[V]], [[U]]
|
||
|
; CHECK: membar
|
||
|
define zeroext i32 @test_load_add_32(i32* %p, i32 zeroext %v) {
|
||
|
entry:
|