forked from OSchip/llvm-project
[Clang][OpenMP] Avoid using `IgnoreImpCasts` if possible
This patch removes all `IgnoreImpCasts` in Sema, and only uses it if necessary. If the expression is not of the same type as the pointer value, a cast is inserted. Reviewed By: ABataev Differential Revision: https://reviews.llvm.org/D126602
This commit is contained in:
parent
aa1cdf87b5
commit
3a96256b7e
|
@ -6183,8 +6183,19 @@ static void emitOMPAtomicCompareExpr(CodeGenFunction &CGF,
|
|||
|
||||
LValue XLVal = CGF.EmitLValue(X);
|
||||
Address XAddr = XLVal.getAddress(CGF);
|
||||
llvm::Value *EVal = CGF.EmitScalarExpr(E);
|
||||
llvm::Value *DVal = D ? CGF.EmitScalarExpr(D) : nullptr;
|
||||
|
||||
auto EmitRValueWithCastIfNeeded = [&CGF, Loc](const Expr *X, const Expr *E) {
|
||||
if (X->getType() == E->getType())
|
||||
return CGF.EmitScalarExpr(E);
|
||||
const Expr *NewE = E->IgnoreImplicitAsWritten();
|
||||
llvm::Value *V = CGF.EmitScalarExpr(NewE);
|
||||
if (NewE->getType() == X->getType())
|
||||
return V;
|
||||
return CGF.EmitScalarConversion(V, NewE->getType(), X->getType(), Loc);
|
||||
};
|
||||
|
||||
llvm::Value *EVal = EmitRValueWithCastIfNeeded(X, E);
|
||||
llvm::Value *DVal = D ? EmitRValueWithCastIfNeeded(X, D) : nullptr;
|
||||
|
||||
llvm::OpenMPIRBuilder::AtomicOpValue XOpVal{
|
||||
XAddr.getPointer(), XAddr.getElementType(),
|
||||
|
|
|
@ -11429,11 +11429,11 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
|
|||
switch (Cond->getOpcode()) {
|
||||
case BO_EQ: {
|
||||
C = Cond;
|
||||
D = BO->getRHS()->IgnoreImpCasts();
|
||||
D = BO->getRHS();
|
||||
if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) {
|
||||
E = Cond->getRHS()->IgnoreImpCasts();
|
||||
E = Cond->getRHS();
|
||||
} else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) {
|
||||
E = Cond->getLHS()->IgnoreImpCasts();
|
||||
E = Cond->getLHS();
|
||||
} else {
|
||||
ErrorInfo.Error = ErrorTy::InvalidComparison;
|
||||
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
|
||||
|
@ -11444,7 +11444,7 @@ bool OpenMPAtomicCompareChecker::checkCondUpdateStmt(IfStmt *S,
|
|||
}
|
||||
case BO_LT:
|
||||
case BO_GT: {
|
||||
E = BO->getRHS()->IgnoreImpCasts();
|
||||
E = BO->getRHS();
|
||||
if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) &&
|
||||
checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) {
|
||||
C = Cond;
|
||||
|
@ -11524,11 +11524,11 @@ bool OpenMPAtomicCompareChecker::checkCondExprStmt(Stmt *S,
|
|||
switch (Cond->getOpcode()) {
|
||||
case BO_EQ: {
|
||||
C = Cond;
|
||||
D = CO->getTrueExpr()->IgnoreImpCasts();
|
||||
D = CO->getTrueExpr();
|
||||
if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS())) {
|
||||
E = Cond->getRHS()->IgnoreImpCasts();
|
||||
E = Cond->getRHS();
|
||||
} else if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getRHS())) {
|
||||
E = Cond->getLHS()->IgnoreImpCasts();
|
||||
E = Cond->getLHS();
|
||||
} else {
|
||||
ErrorInfo.Error = ErrorTy::InvalidComparison;
|
||||
ErrorInfo.ErrorLoc = ErrorInfo.NoteLoc = Cond->getExprLoc();
|
||||
|
@ -11539,7 +11539,7 @@ bool OpenMPAtomicCompareChecker::checkCondExprStmt(Stmt *S,
|
|||
}
|
||||
case BO_LT:
|
||||
case BO_GT: {
|
||||
E = CO->getTrueExpr()->IgnoreImpCasts();
|
||||
E = CO->getTrueExpr();
|
||||
if (checkIfTwoExprsAreSame(ContextRef, X, Cond->getLHS()) &&
|
||||
checkIfTwoExprsAreSame(ContextRef, E, Cond->getRHS())) {
|
||||
C = Cond;
|
||||
|
|
Loading…
Reference in New Issue