Tyker marked 2 inline comments as done.
Tyker added inline comments.

================
Comment at: clang/lib/Analysis/CFG.cpp:2208
+}
+
 CFGBlock *CFGBuilder::VisitStmt(Stmt *S, AddStmtChoice asc) {
----------------
riccibruno wrote:
> I don't understand why this is needed. Can you explain it ? Also I think that 
> someone familiar with this code should comment on this (maybe @NoQ ?)
the detail of why are complicated and i don't have them all in head but without 
this edit in cases like 

```
switch (...) {
[[likely]] case 1:
        ...
        [[fallthrough]];
default:
        ...
}
```
the fallthrough attribute emitted a diagnostic because is wasn't handling 
attributed case statement. the edit i performed is probably not the optimal way 
to solve the issue as it only solves the issue for likelihood attribute. but i 
don't know any other attribute that can be applied on a case statement but if 
they were others they would probably have the same issue. but the code is quite 
hard to follow and i didn't wanted to break anything. so this is what i came up 
with.
i am going to look into it to find a better solution.


================
Comment at: clang/lib/CodeGen/CGStmt.cpp:705
+}
+
 void CodeGenFunction::EmitWhileStmt(const WhileStmt &S,
----------------
riccibruno wrote:
> I believe that the lowering is incorrect. I applied your patch and here 
> ({F8571803}) is the IR that clang generates (obtained with `-O1 -S -emit-llvm 
> -Xclang -disable-llvm-passes -g0`) for this code:
> 
> ```
> bool f(bool i);
> bool g(bool i);
> 
> bool h1(bool i) {
>   if (i) [[likely]]
>     return f(i);
>   return g(i);
> }
> 
> bool h2(bool i) {
>   if (__builtin_expect(i, true))
>     return f(i);
>   return g(i);
> }
> ```
> 
> In particular for the branch in `h1` we have:
> ```
>   %tobool = trunc i8 %0 to i1
>   %expval = call i1 @llvm.expect.i1(i1 %tobool, i1 true)
>   br i1 %tobool, label %if.then, label %if.end
> ```
> Note that `%expval` is not used. Compare this to the branch in `h2`:
> ```
>   %tobool = trunc i8 %0 to i1
>   %conv = zext i1 %tobool to i64
>   %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
>   %tobool1 = icmp ne i64 %expval, 0
>   br i1 %tobool1, label %if.then, label %if.end
> ```
> where the extra conversions are because of the signature of 
> `__builtin_expect`.
from reading the documentation it seemed to me that both were equivalent. but 
after further checking there aren't.


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

https://reviews.llvm.org/D59467



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

Reply via email to