File tree Expand file tree Collapse file tree 2 files changed +16
-1
lines changed Expand file tree Collapse file tree 2 files changed +16
-1
lines changed Original file line number Diff line number Diff line change @@ -1806,7 +1806,11 @@ void AtomicInfo::EmitAtomicUpdateOp(
1806
1806
/* NumReservedValues=*/ 2 );
1807
1807
PHI->addIncoming (OldVal, CurBB);
1808
1808
Address NewAtomicAddr = CreateTempAlloca ();
1809
- Address NewAtomicIntAddr = castToAtomicIntPointer (NewAtomicAddr);
1809
+ Address NewAtomicIntAddr =
1810
+ shouldCastToInt (NewAtomicAddr.getElementType (), /* CmpXchg=*/ true )
1811
+ ? castToAtomicIntPointer (NewAtomicAddr)
1812
+ : NewAtomicAddr;
1813
+
1810
1814
if ((LVal.isBitField () && BFI.Size != ValueSizeInBits) ||
1811
1815
requiresMemSetZero (getAtomicAddress ().getElementType ())) {
1812
1816
CGF.Builder .CreateStore (PHI, NewAtomicIntAddr);
Original file line number Diff line number Diff line change @@ -27,6 +27,7 @@ long double ldv, ldx;
27
27
_Complex int civ, cix;
28
28
_Complex float cfv, cfx;
29
29
_Complex double cdv, cdx;
30
+ char *cpx;
30
31
31
32
typedef int int4 __attribute__ ((__vector_size__(16 )));
32
33
int4 int4x;
@@ -851,6 +852,16 @@ int main(void) {
851
852
// CHECK: call{{.*}} @__kmpc_flush(
852
853
#pragma omp atomic seq_cst
853
854
rix = dv / rix;
855
+
856
+ // CHECK: [[LD_CPX:%.+]] = load atomic ptr, ptr @cpx monotonic
857
+ // CHECK: br label %[[CONT:.+]]
858
+ // CHECK: [[CONT]]
859
+ // CHECK: [[PHI:%.+]] = phi ptr
860
+ // CHECK: [[RES:%.+]] = cmpxchg ptr @cpx,
861
+ // CHECK: br i1 %{{.+}}, label %[[EXIT:.+]], label %[[CONT]]
862
+ #pragma omp atomic update
863
+ cpx += 1 ;
864
+
854
865
return 0 ;
855
866
}
856
867
You can’t perform that action at this time.
0 commit comments