tianshilei1992 added inline comments.

================
Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:6168
   llvm::Value *EVal = CGF.EmitScalarExpr(E);
+  if (auto CI = dyn_cast<llvm::ConstantInt>(EVal))
+    EVal = CGF.Builder.CreateIntCast(
----------------
ABataev wrote:
> 1. `auto *CI`
> 2. What if this is not a constant, but just a value with int type? Is this 
> possible?
> What if this is not a constant, but just a value with int type? Is this 
> possible?
I'm thinking of a similar case.
```
void foo() {
  int e, d;
  char x, v;
  if (x == e)
    x = d;
}
```
In this case, there are two casts:
1. In expression `x == e`, cast `x` to `int`.
2. In expression `x = d`, cast `d` to `char`.
We cannot ignore both of them. For the 2nd, no question. For the expression `x 
== e`, the problem is in `e` instead of `x`. `e` here is always `int`, further 
causing issue in codegen.

I'm thinking for those lvalues, we can only set them where they are used as 
lvalues in case any type lifting. For those rvalues, if their types are not 
same as `x`, but compatible with `x`, we have to insert cast, including 
truncate, before feed them into codegen. Does it sound good?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D120290/new/

https://reviews.llvm.org/D120290

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to