https://github.com/oontvoo updated 
https://github.com/llvm/llvm-project/pull/197789

>From 48bc3a4580675833dc69afcb8d6a4328644b6ce2 Mon Sep 17 00:00:00 2001
From: Vy Nguyen <[email protected]>
Date: Thu, 14 May 2026 15:36:16 -0400
Subject: [PATCH 1/4] [codegen]Ensure __builtin_trap() has an unreachable

---
 clang/lib/CodeGen/CGBuiltin.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 20f99f489c55f..678985ebb55e1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4022,6 +4022,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl 
GD, unsigned BuiltinID,
   }
   case Builtin::BI__builtin_trap:
     EmitTrapCall(Intrinsic::trap);
+    if (Builder.GetInsertBlock()) {
+      Builder.CreateUnreachable();
+      // Dummy block for the ret void - it'll be clened up
+      llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap");
+      EmitBlock(DeadBB);
+    }
     return RValue::get(nullptr);
   case Builtin::BI__builtin_verbose_trap: {
     llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation();

>From b7c197092170a9a44030f950973ac941ca554d01 Mon Sep 17 00:00:00 2001
From: Vy Nguyen <[email protected]>
Date: Thu, 14 May 2026 20:22:07 -0400
Subject: [PATCH 2/4] set no ret

---
 clang/lib/CodeGen/CGBuiltin.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 678985ebb55e1..c907bd829d149 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4020,15 +4020,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(const 
GlobalDecl GD, unsigned BuiltinID,
     Function *F = CGM.getIntrinsic(Intrinsic::clear_cache, {CGM.DefaultPtrTy});
     return RValue::get(Builder.CreateCall(F, {Begin, End}));
   }
-  case Builtin::BI__builtin_trap:
+  case Builtin::BI__builtin_trap: {
     EmitTrapCall(Intrinsic::trap);
+    Trap->setDoesNotReturn();
+    Trap->setDoesNotThrow();
+    Builder.CreateUnreachable();
     if (Builder.GetInsertBlock()) {
-      Builder.CreateUnreachable();
-      // Dummy block for the ret void - it'll be clened up
+      // Dummy block for the ret void - it'll be cleaned up
       llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap");
       EmitBlock(DeadBB);
     }
     return RValue::get(nullptr);
+  }
   case Builtin::BI__builtin_verbose_trap: {
     llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation();
     if (getDebugInfo()) {

>From d2c974b04a8b9315d63127fa3b636ec0501b578a Mon Sep 17 00:00:00 2001
From: Vy Nguyen <[email protected]>
Date: Thu, 14 May 2026 21:17:41 -0400
Subject: [PATCH 3/4] typo

---
 clang/lib/CodeGen/CGBuiltin.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index c907bd829d149..d01e00c7fd35d 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4021,12 +4021,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const 
GlobalDecl GD, unsigned BuiltinID,
     return RValue::get(Builder.CreateCall(F, {Begin, End}));
   }
   case Builtin::BI__builtin_trap: {
-    EmitTrapCall(Intrinsic::trap);
+    llvm::CallInst *Trap = EmitTrapCall(Intrinsic::trap);
     Trap->setDoesNotReturn();
     Trap->setDoesNotThrow();
     Builder.CreateUnreachable();
     if (Builder.GetInsertBlock()) {
-      // Dummy block for the ret void - it'll be cleaned up
+      // Dummy block for the ret void - it'll be cleaned up.
       llvm::BasicBlock *DeadBB = createBasicBlock("dead.trap");
       EmitBlock(DeadBB);
     }

>From ca1be1c1763d5fef010472f735b7aa835e3914fd Mon Sep 17 00:00:00 2001
From: Vy Nguyen <[email protected]>
Date: Fri, 15 May 2026 08:47:31 -0400
Subject: [PATCH 4/4] update tests

---
 clang/test/CodeGen/amdgpu-builtin-is-invocable.c     | 4 +++-
 clang/test/CodeGen/amdgpu-builtin-processor-is.c     | 4 ++++
 clang/test/CodeGen/attr-nomerge.cpp                  | 7 +++----
 clang/test/CodeGen/pr53127.cpp                       | 2 ++
 clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp | 1 +
 clang/test/CodeGenCXX/trap-fnattr.cpp                | 2 +-
 6 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/clang/test/CodeGen/amdgpu-builtin-is-invocable.c 
b/clang/test/CodeGen/amdgpu-builtin-is-invocable.c
index 5c6d7b25f3bf1..b92215be472ab 100644
--- a/clang/test/CodeGen/amdgpu-builtin-is-invocable.c
+++ b/clang/test/CodeGen/amdgpu-builtin-is-invocable.c
@@ -20,7 +20,7 @@
 // AMDGCN-GFX1010-SAME: ) #[[ATTR0:[0-9]+]] {
 // AMDGCN-GFX1010-NEXT:  [[ENTRY:.*:]]
 // AMDGCN-GFX1010-NEXT:    call void @llvm.trap()
-// AMDGCN-GFX1010-NEXT:    ret void
+// AMDGCN-GFX1010-NEXT:    unreachable
 //
 // AMDGCNSPIRV-LABEL: define spir_func void @foo(
 // AMDGCNSPIRV-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
@@ -38,6 +38,8 @@
 // AMDGCNSPIRV-NEXT:    br i1 [[TOBOOL3]], label %[[IF_THEN]], label 
%[[IF_END:.*]]
 // AMDGCNSPIRV:       [[IF_THEN]]:
 // AMDGCNSPIRV-NEXT:    call addrspace(4) void @llvm.trap()
+// AMDGCNSPIRV-NEXT:    unreachable
+// AMDGCNSPIRV:        dead.trap:
 // AMDGCNSPIRV-NEXT:    br label %[[IF_END]]
 // AMDGCNSPIRV:       [[IF_END]]:
 // AMDGCNSPIRV-NEXT:    ret void
diff --git a/clang/test/CodeGen/amdgpu-builtin-processor-is.c 
b/clang/test/CodeGen/amdgpu-builtin-processor-is.c
index b2f04f11ecb54..70a00960b971c 100644
--- a/clang/test/CodeGen/amdgpu-builtin-processor-is.c
+++ b/clang/test/CodeGen/amdgpu-builtin-processor-is.c
@@ -14,6 +14,8 @@
 // AMDGCN-GFX900-SAME: ) #[[ATTR0:[0-9]+]] {
 // AMDGCN-GFX900-NEXT:  [[ENTRY:.*:]]
 // AMDGCN-GFX900-NEXT:    call void @llvm.trap()
+// AMDGCN-GFX900-NEXT:    unreachable
+// AMDGCN-GFX900:       dead.trap:
 // AMDGCN-GFX900-NEXT:    ret void
 //
 // AMDGCN-GFX1010-LABEL: define dso_local void @foo(
@@ -45,6 +47,8 @@
 // AMDGCNSPIRV-NEXT:    br i1 [[TOBOOL7]], label %[[IF_THEN]], label 
%[[IF_END:.*]]
 // AMDGCNSPIRV:       [[IF_THEN]]:
 // AMDGCNSPIRV-NEXT:    call addrspace(4) void @llvm.trap()
+// AMDGCNSPIRV-NEXT:    unreachable
+// AMDGCNSPIRV:       dead.trap:    
 // AMDGCNSPIRV-NEXT:    br label %[[IF_END]]
 // AMDGCNSPIRV:       [[IF_END]]:
 // AMDGCNSPIRV-NEXT:    ret void
diff --git a/clang/test/CodeGen/attr-nomerge.cpp 
b/clang/test/CodeGen/attr-nomerge.cpp
index 1cf5bb1619b31..312e8ed62d5d9 100644
--- a/clang/test/CodeGen/attr-nomerge.cpp
+++ b/clang/test/CodeGen/attr-nomerge.cpp
@@ -100,10 +100,9 @@ void something_else_again() {
 // CHECK: load ptr, ptr
 // CHECK: %[[AG:.*]] = load ptr, ptr
 // CHECK-NEXT: call void %[[AG]](ptr {{.*}}) #[[ATTR1]]
-// CHECK: call void @llvm.trap() #[[ATTR0]]
-// CHECK: call void @llvm.debugtrap() #[[ATTR0]]
-// CHECK: call void @llvm.trap() #[[ATTR0]]
-// CHECK: call void  @_ZN1AD1Ev(ptr {{.*}}) #[[ATTR1]]
+// CHECK: call void @llvm.trap() #[[ATTR8:[0-9]+]]
+// CHECK: unreachable
 
 // CHECK-DAG: attributes #[[ATTR0]] = {{{.*}}nomerge{{.*}}}
 // CHECK-DAG: attributes #[[ATTR1]] = {{{.*}}nomerge{{.*}}}
+// CHECK-DAG  attributes #[[ATTR8]] = { nomerge noreturn nounwind }
diff --git a/clang/test/CodeGen/pr53127.cpp b/clang/test/CodeGen/pr53127.cpp
index 5a52b4860eecd..473f4444410c7 100644
--- a/clang/test/CodeGen/pr53127.cpp
+++ b/clang/test/CodeGen/pr53127.cpp
@@ -15,6 +15,8 @@ void operator delete(void*);
 // CHECK-NEXT:    br i1 [[CALL]], label [[COND_TRUE:%.*]], label 
[[COND_FALSE:%.*]]
 // CHECK:       cond.true:
 // CHECK-NEXT:    call void @llvm.trap()
+// CHECK-NEXT:    unreachable
+// CHECK:       dead.trap:
 // CHECK-NEXT:    br label [[COND_END:%.*]]
 // CHECK:       cond.false:
 // CHECK-NEXT:    br label [[COND_END]]
diff --git a/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp 
b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp
index 80ea63e2a1e10..f0f46dcc9faf5 100644
--- a/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp
+++ b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp
@@ -41,6 +41,7 @@ void call_var_args() {
 }
 
 // CHECK-LABEL: define dso_local void @"?call_var_args@@YAXXZ"()
+// FIXME all of these are after the trap so they should be gone.
 // CHECK: call void {{.*varargs_zero.*}}(ptr inalloca(<{ %struct.A }>) %{{.*}})
 // CHECK: call void {{.*varargs_one.*}}(ptr inalloca(<{ i32, %struct.A }>) 
%{{.*}})
 // CHECK: call void {{.*varargs_two.*}}(ptr inalloca(<{ i32, i32, %struct.A 
}>) %{{.*}})
diff --git a/clang/test/CodeGenCXX/trap-fnattr.cpp 
b/clang/test/CodeGenCXX/trap-fnattr.cpp
index ed7162fc43a6c..0b377813fa89b 100644
--- a/clang/test/CodeGenCXX/trap-fnattr.cpp
+++ b/clang/test/CodeGenCXX/trap-fnattr.cpp
@@ -30,7 +30,7 @@ int test_add_overflow(int a, int b) {
   return a + b;
 }
 
-// TRAPFUNC: attributes [[ATTR0]] = { {{.*}}"trap-func-name"="mytrap" }
+// TRAPFUNC: attributes [[ATTR0]] = { noreturn no unwind 
"trap-func-name"="mytrap" }
 // TRAPFUNC: attributes [[ATTR1]] = { {{.*}}"trap-func-name"="mytrap" }
 
 // NOOPTION-NOT: attributes [[ATTR2]] = { {{.*}}"trap-func-name"="mytrap" }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to