This revision was automatically updated to reflect the committed changes. Closed by commit rC356475: [Sema] Adjust addr space of reference operand in compound assignment (authored by stulova, committed by ). Herald added a subscriber: kristina. Herald added a project: clang.
Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D59367/new/ https://reviews.llvm.org/D59367 Files: lib/Sema/SemaOverload.cpp test/CodeGenOpenCLCXX/addrspace-operators.cl Index: test/CodeGenOpenCLCXX/addrspace-operators.cl =================================================================== --- test/CodeGenOpenCLCXX/addrspace-operators.cl +++ test/CodeGenOpenCLCXX/addrspace-operators.cl @@ -14,6 +14,8 @@ }; __global E globE; +volatile __global int globVI; +__global int globI; //CHECK-LABEL: define spir_func void @_Z3barv() void bar() { C c; @@ -25,13 +27,18 @@ c.OrAssign(a); E e; - // CHECK: store i32 1, i32* %e + //CHECK: store i32 1, i32* %e e = b; - // CHECK: store i32 0, i32 addrspace(1)* @globE + //CHECK: store i32 0, i32 addrspace(1)* @globE globE = a; - // FIXME: Sema fails here because it thinks the types are incompatible. - //e = b; - //globE = a; + //CHECK: store i32 %or, i32 addrspace(1)* @globI + globI |= b; + //CHECK: store i32 %add, i32 addrspace(1)* @globI + globI += a; + //CHECK: store volatile i32 %and, i32 addrspace(1)* @globVI + globVI &= b; + //CHECK: store volatile i32 %sub, i32 addrspace(1)* @globVI + globVI -= a; } //CHECK: define linkonce_odr void @_ZNU3AS41C6AssignE1E(%class.C addrspace(4)* %this, i32 %e) Index: lib/Sema/SemaOverload.cpp =================================================================== --- lib/Sema/SemaOverload.cpp +++ lib/Sema/SemaOverload.cpp @@ -8513,17 +8513,16 @@ Right < LastPromotedArithmeticType; ++Right) { QualType ParamTypes[2]; ParamTypes[1] = ArithmeticTypes[Right]; - + auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( + S, ArithmeticTypes[Left], Args[0]); // Add this built-in operator as a candidate (VQ is empty). - ParamTypes[0] = - S.Context.getLValueReferenceType(ArithmeticTypes[Left]); + ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, /*IsAssigmentOperator=*/isEqualOp); // Add this built-in operator as a candidate (VQ is 'volatile'). if (VisibleTypeConversionsQuals.hasVolatile()) { - ParamTypes[0] = - S.Context.getVolatileType(ArithmeticTypes[Left]); + ParamTypes[0] = S.Context.getVolatileType(LeftBaseTy); ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, /*IsAssigmentOperator=*/isEqualOp); @@ -8579,15 +8578,14 @@ Right < LastPromotedIntegralType; ++Right) { QualType ParamTypes[2]; ParamTypes[1] = ArithmeticTypes[Right]; - + auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( + S, ArithmeticTypes[Left], Args[0]); // Add this built-in operator as a candidate (VQ is empty). - ParamTypes[0] = S.Context.getLValueReferenceType( - AdjustAddressSpaceForBuiltinOperandType(S, ArithmeticTypes[Left], - Args[0])); + ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); if (VisibleTypeConversionsQuals.hasVolatile()) { // Add this built-in operator as a candidate (VQ is 'volatile'). - ParamTypes[0] = ArithmeticTypes[Left]; + ParamTypes[0] = LeftBaseTy; ParamTypes[0] = S.Context.getVolatileType(ParamTypes[0]); ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet);
Index: test/CodeGenOpenCLCXX/addrspace-operators.cl =================================================================== --- test/CodeGenOpenCLCXX/addrspace-operators.cl +++ test/CodeGenOpenCLCXX/addrspace-operators.cl @@ -14,6 +14,8 @@ }; __global E globE; +volatile __global int globVI; +__global int globI; //CHECK-LABEL: define spir_func void @_Z3barv() void bar() { C c; @@ -25,13 +27,18 @@ c.OrAssign(a); E e; - // CHECK: store i32 1, i32* %e + //CHECK: store i32 1, i32* %e e = b; - // CHECK: store i32 0, i32 addrspace(1)* @globE + //CHECK: store i32 0, i32 addrspace(1)* @globE globE = a; - // FIXME: Sema fails here because it thinks the types are incompatible. - //e = b; - //globE = a; + //CHECK: store i32 %or, i32 addrspace(1)* @globI + globI |= b; + //CHECK: store i32 %add, i32 addrspace(1)* @globI + globI += a; + //CHECK: store volatile i32 %and, i32 addrspace(1)* @globVI + globVI &= b; + //CHECK: store volatile i32 %sub, i32 addrspace(1)* @globVI + globVI -= a; } //CHECK: define linkonce_odr void @_ZNU3AS41C6AssignE1E(%class.C addrspace(4)* %this, i32 %e) Index: lib/Sema/SemaOverload.cpp =================================================================== --- lib/Sema/SemaOverload.cpp +++ lib/Sema/SemaOverload.cpp @@ -8513,17 +8513,16 @@ Right < LastPromotedArithmeticType; ++Right) { QualType ParamTypes[2]; ParamTypes[1] = ArithmeticTypes[Right]; - + auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( + S, ArithmeticTypes[Left], Args[0]); // Add this built-in operator as a candidate (VQ is empty). - ParamTypes[0] = - S.Context.getLValueReferenceType(ArithmeticTypes[Left]); + ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, /*IsAssigmentOperator=*/isEqualOp); // Add this built-in operator as a candidate (VQ is 'volatile'). if (VisibleTypeConversionsQuals.hasVolatile()) { - ParamTypes[0] = - S.Context.getVolatileType(ArithmeticTypes[Left]); + ParamTypes[0] = S.Context.getVolatileType(LeftBaseTy); ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet, /*IsAssigmentOperator=*/isEqualOp); @@ -8579,15 +8578,14 @@ Right < LastPromotedIntegralType; ++Right) { QualType ParamTypes[2]; ParamTypes[1] = ArithmeticTypes[Right]; - + auto LeftBaseTy = AdjustAddressSpaceForBuiltinOperandType( + S, ArithmeticTypes[Left], Args[0]); // Add this built-in operator as a candidate (VQ is empty). - ParamTypes[0] = S.Context.getLValueReferenceType( - AdjustAddressSpaceForBuiltinOperandType(S, ArithmeticTypes[Left], - Args[0])); + ParamTypes[0] = S.Context.getLValueReferenceType(LeftBaseTy); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet); if (VisibleTypeConversionsQuals.hasVolatile()) { // Add this built-in operator as a candidate (VQ is 'volatile'). - ParamTypes[0] = ArithmeticTypes[Left]; + ParamTypes[0] = LeftBaseTy; ParamTypes[0] = S.Context.getVolatileType(ParamTypes[0]); ParamTypes[0] = S.Context.getLValueReferenceType(ParamTypes[0]); S.AddBuiltinCandidate(ParamTypes, Args, CandidateSet);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits