rjmccall added inline comments.

================
Comment at: clang/lib/CodeGen/CGExprComplex.cpp:213
     TestAndClearIgnoreImag();
+    PromotionType = getPromotionType(E->getSubExpr()->getType());
+    if (!PromotionType.isNull())
----------------
Same problem


================
Comment at: clang/lib/CodeGen/CGExprComplex.cpp:288
+        const auto *BT = dyn_cast<BuiltinType>(Ty);
+        if (BT->getKind() == BuiltinType::Float16)
+          PromotedTy = CGF.getContext().FloatTy;
----------------
You can just use `isFloat16Type()` here.


================
Comment at: clang/lib/CodeGen/CGExprComplex.cpp:609
+  ComplexPairTy Op;
+  PromotionType = getPromotionType(E->getSubExpr()->getType());
+  if (!PromotionType.isNull())
----------------
This is overwriting the argument, so the code below doesn't understand whether 
it's supposed to be emitting a promoted result or not.  You can test this with 
something like:

```
cf16 = -cf16;
```

Here the context does not want a promoted result, but you will produce one 
anyway.

Because this operator does its own arithmetic, like the binary operators, it 
needs to follow the same basic logic:
- remember whether you're supposed to emit a promoted result
- if not, check whether you should do the arithmetic promoted anyway
- if you did the arithmetic promoted, but you're not supposed to emit a 
promoted result, unpromote the result


================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:626
     TestAndClearIgnoreResultAssign();
+    PromotionType = getPromotionType(E->getSubExpr()->getType());
+    if (!PromotionType.isNull())
----------------
Same problem


================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:2857
+  Value *Op;
+  PromotionType = getPromotionType(E->getSubExpr()->getType());
+  if (!PromotionType.isNull())
----------------
Same problem


================
Comment at: clang/lib/CodeGen/CGExprScalar.cpp:3073
   Expr *Op = E->getSubExpr();
+  PromotionType = getPromotionType(E->getSubExpr()->getType());
   if (Op->getType()->isAnyComplexType()) {
----------------
Same problem.  However, since `__real` and `__imag` don't really do arithmetic, 
we don't need to voluntarily promote here — you shoul emit the operand promoted 
if and only if we're given a promotion type.


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

https://reviews.llvm.org/D113107

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

Reply via email to