From 5107ce194c9b03c2f32eb1508df0c92b13b3e2fd Mon Sep 17 00:00:00 2001 From: Thurston Dang Date: Tue, 26 Nov 2024 21:07:48 +0000 Subject: [PATCH] Don't apply nomerge for the first instance of each TrapBB type, per Vitaly's feedback --- clang/lib/CodeGen/CGExpr.cpp | 4 +++- clang/test/CodeGen/ubsan-trap-merge.c | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 74e185c30c08787..5b669a980ec3e7b 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -3915,6 +3915,7 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, Builder.getCurrentDebugLocation()); Builder.CreateCondBr(Checked, Cont, TrapBB); } else { + bool NewTrapBB = (TrapBB == nullptr); TrapBB = createBasicBlock("trap"); Builder.CreateCondBr(Checked, Cont, TrapBB); EmitBlock(TrapBB); @@ -3928,7 +3929,8 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, CGM.getCodeGenOpts().TrapFuncName); TrapCall->addFnAttr(A); } - TrapCall->addFnAttr(llvm::Attribute::NoMerge); + if (!NewTrapBB) + TrapCall->addFnAttr(llvm::Attribute::NoMerge); TrapCall->setDoesNotReturn(); TrapCall->setDoesNotThrow(); Builder.CreateUnreachable(); diff --git a/clang/test/CodeGen/ubsan-trap-merge.c b/clang/test/CodeGen/ubsan-trap-merge.c index ef32605c73174ae..c8669b9dd3a0323 100644 --- a/clang/test/CodeGen/ubsan-trap-merge.c +++ b/clang/test/CodeGen/ubsan-trap-merge.c @@ -55,7 +55,7 @@ int g(int x) { // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]] // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !nosanitize [[META2]] // CHECK: [[TRAP1]]: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]] +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR5:[0-9]+]], !nosanitize [[META2]] // CHECK-NEXT: unreachable, !nosanitize [[META2]] // CHECK: [[CONT2]]: // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]] @@ -102,4 +102,5 @@ int m(int x, int y) { return f(x) + g(y); } //. -// CHECK: attributes #[[ATTR4]] = { nomerge noreturn nounwind } +// CHECK: attributes #[[ATTR4]] = { noreturn nounwind } +// CHECK: attributes #[[ATTR5]] = { nomerge noreturn nounwind }