-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[Clang][CodeGen] Don't emit assumptions if current block is unreachable. #106936
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-codegen Author: Yingwei Zheng (dtcxzyw) ChangesFixes #106898. When emitting an infinite loop, clang codegen will delete the whole block and leave builder's current block as nullptr: llvm-project/clang/lib/CodeGen/CGStmt.cpp Lines 597 to 600 in 837ee5b
Then clang will create llvm-project/clang/lib/CodeGen/CGExprScalar.cpp Lines 416 to 420 in 837ee5b
Even if we disabled this optimization, it still crashes in llvm-project/llvm/lib/IR/IRBuilder.cpp Lines 551 to 561 in 837ee5b
This patch disables assumptions emission if current block is null. As an alternative, we can fix the optimization in llvm-project/clang/lib/CodeGen/CGBuiltin.cpp Lines 3422 to 3431 in 837ee5b
Full diff: https://github.com/llvm/llvm-project/pull/106936.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 7158a06e6bc3b3..b138c87a853495 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -752,7 +752,7 @@ void CodeGenFunction::EmitAttributedStmt(const AttributedStmt &S) {
} break;
case attr::CXXAssume: {
const Expr *Assumption = cast<CXXAssumeAttr>(A)->getAssumption();
- if (getLangOpts().CXXAssumptions &&
+ if (getLangOpts().CXXAssumptions && Builder.GetInsertBlock() &&
!Assumption->HasSideEffects(getContext())) {
llvm::Value *AssumptionVal = EvaluateExprAsBool(Assumption);
Builder.CreateAssumption(AssumptionVal);
diff --git a/clang/test/SemaCXX/cxx23-assume.cpp b/clang/test/SemaCXX/cxx23-assume.cpp
index 9138501d726dd6..eeae59daea3f70 100644
--- a/clang/test/SemaCXX/cxx23-assume.cpp
+++ b/clang/test/SemaCXX/cxx23-assume.cpp
@@ -158,3 +158,12 @@ foo (int x, int y)
return x + y;
}
}
+
+// Do not crash when assumptions are unreachable.
+namespace gh106898 {
+int foo () {
+ while(1);
+ int a = 0, b = 1;
+ __attribute__((assume (a < b)));
+}
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
/cherry-pick c94bd96 |
…le. (llvm#106936) Fixes llvm#106898. When emitting an infinite loop, clang codegen will delete the whole block and leave builder's current block as nullptr: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/clang/lib/CodeGen/CGStmt.cpp#L597-L600 Then clang will create `zext (icmp slt %a, %b)` without parent block for `a < b`. It will crash here: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/clang/lib/CodeGen/CGExprScalar.cpp#L416-L420 Even if we disabled this optimization, it still crashes in `Builder.CreateAssumption`: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/llvm/lib/IR/IRBuilder.cpp#L551-L561 This patch disables assumptions emission if current block is null. (cherry picked from commit c94bd96)
/pull-request #107183 |
…le. (llvm#106936) Fixes llvm#106898. When emitting an infinite loop, clang codegen will delete the whole block and leave builder's current block as nullptr: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/clang/lib/CodeGen/CGStmt.cpp#L597-L600 Then clang will create `zext (icmp slt %a, %b)` without parent block for `a < b`. It will crash here: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/clang/lib/CodeGen/CGExprScalar.cpp#L416-L420 Even if we disabled this optimization, it still crashes in `Builder.CreateAssumption`: https://github.com/llvm/llvm-project/blob/837ee5b46a5f7f898f0de7e46a19600b896a0a1f/llvm/lib/IR/IRBuilder.cpp#L551-L561 This patch disables assumptions emission if current block is null. (cherry picked from commit c94bd96)
Fixes #106898.
When emitting an infinite loop, clang codegen will delete the whole block and leave builder's current block as nullptr:
llvm-project/clang/lib/CodeGen/CGStmt.cpp
Lines 597 to 600 in 837ee5b
Then clang will create
zext (icmp slt %a, %b)
without parent block fora < b
. It will crash here:llvm-project/clang/lib/CodeGen/CGExprScalar.cpp
Lines 416 to 420 in 837ee5b
Even if we disabled this optimization, it still crashes in
Builder.CreateAssumption
:llvm-project/llvm/lib/IR/IRBuilder.cpp
Lines 551 to 561 in 837ee5b
This patch disables assumptions emission if current block is null. As an alternative, we can fix the optimization in
EmitIntToBoolConversion
and useCGM.getIntrinsic
as we do for__builtin_assume
:llvm-project/clang/lib/CodeGen/CGBuiltin.cpp
Lines 3422 to 3431 in 837ee5b