[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
@@ -100,9 +100,9 @@ using namespace llvm; namespace llvm { extern cl::opt PrintPipelinePasses; -cl::opt ClRemoveTraps("clang-remove-traps", cl::Optional, -cl::desc("Insert remove-traps pass."), -cl::init(false)); +static cl::opt ClRemoveTraps("clang-remove-traps", cl::Optional, + cl::desc("Insert remove-traps pass."), + cl::init(false)); MaskRay wrote: We usually omit `cl::init(false)` https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/vitalybuka edited https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/kstoimenov approved this pull request. https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
@@ -3805,6 +3812,12 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID) { llvm::BasicBlock *Cont = createBasicBlock("cont"); + if (ClSanitizeExpHot) { +Checked = +Builder.CreateOr(Checked, Builder.CreateCall(CGM.getIntrinsic( + llvm::Intrinsic::experimental_hot))); jroelofs wrote: This would be the moral equivalent of diagnose_if https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
@@ -3805,6 +3812,12 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID) { llvm::BasicBlock *Cont = createBasicBlock("cont"); + if (ClSanitizeExpHot) { +Checked = +Builder.CreateOr(Checked, Builder.CreateCall(CGM.getIntrinsic( + llvm::Intrinsic::experimental_hot))); jroelofs wrote: It might be helpful if there were a remark that fired when one of these were optimized out. Maybe we could get that with another intrinsic whose semantics are "print the message in a remark if this gets optimized out", and then stick one of those on the appropriate side of the condition, with an explanation on where it came from, and what the threshold was. https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/vitalybuka edited https://github.com/llvm/llvm-project/pull/84858 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Vitaly Buka (vitalybuka) Changes Intrinsic introduced with #84850. Using intrinsic improves performance by 3% comparing to removing traps (on "test-suite/MultiSource/Benchmarks" with PGO+ThinLTO). The pass will be renamed with #84852. --- Patch is 20.23 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/84858.diff 5 Files Affected: - (modified) clang/lib/CodeGen/BackendUtil.cpp (+3-3) - (modified) clang/lib/CodeGen/CGExpr.cpp (+14-1) - (modified) clang/test/CodeGen/remote-traps.c (+20-3) - (modified) llvm/lib/Transforms/Instrumentation/RemoveTrapsPass.cpp (+15-11) - (modified) llvm/test/Transforms/RemoveTraps/remove-traps.ll (+64-25) ``diff diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 82b30b8d815629..7e53469a48d42c 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -100,9 +100,9 @@ using namespace llvm; namespace llvm { extern cl::opt PrintPipelinePasses; -cl::opt ClRemoveTraps("clang-remove-traps", cl::Optional, -cl::desc("Insert remove-traps pass."), -cl::init(false)); +static cl::opt ClRemoveTraps("clang-remove-traps", cl::Optional, + cl::desc("Insert remove-traps pass."), + cl::init(false)); // Experiment to move sanitizers earlier. static cl::opt ClSanitizeOnOptimizerEarlyEP( diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 59a7fe8925001c..3a27622f165995 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -56,7 +56,14 @@ using namespace CodeGen; // Experiment to make sanitizers easier to debug static llvm::cl::opt ClSanitizeDebugDeoptimization( "ubsan-unique-traps", llvm::cl::Optional, -llvm::cl::desc("Deoptimize traps for UBSAN so there is 1 trap per check"), +llvm::cl::desc("Deoptimize traps for UBSAN so there is 1 trap per check."), +llvm::cl::init(false)); + +// TODO: Introduce frontend options to enabled per sanitizers, similar to +// `fsanitize-trap`. +static llvm::cl::opt ClSanitizeExpHot( +"ubsan-exp-hot", llvm::cl::Optional, +llvm::cl::desc("Pass UBSAN checks if `llvm.experimental.hot()` is true."), llvm::cl::init(false)); //======// @@ -3805,6 +3812,12 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID) { llvm::BasicBlock *Cont = createBasicBlock("cont"); + if (ClSanitizeExpHot) { +Checked = +Builder.CreateOr(Checked, Builder.CreateCall(CGM.getIntrinsic( + llvm::Intrinsic::experimental_hot))); + } + // If we're optimizing, collapse all calls to trap down to just one per // check-type per function to save on code size. if ((int)TrapBBs.size() <= CheckHandlerID) diff --git a/clang/test/CodeGen/remote-traps.c b/clang/test/CodeGen/remote-traps.c index 6751afb96d25f2..934b76fae0d2a5 100644 --- a/clang/test/CodeGen/remote-traps.c +++ b/clang/test/CodeGen/remote-traps.c @@ -1,5 +1,7 @@ -// RUN: %clang_cc1 -O1 -emit-llvm -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow %s -o - | FileCheck %s -// RUN: %clang_cc1 -O1 -emit-llvm -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow -mllvm -clang-remove-traps -mllvm -remove-traps-random-rate=1 %s -o - | FileCheck %s --implicit-check-not="call void @llvm.ubsantrap" --check-prefixes=REMOVE +// RUN: %clang_cc1 -O1 %s -o - -emit-llvm -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow -mllvm -ubsan-exp-hot | FileCheck %s +// RUN: %clang_cc1 -O1 %s -o - -emit-llvm -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow -mllvm -ubsan-exp-hot -mllvm -clang-remove-traps -mllvm -remove-traps-random-rate=1 %s -o - | FileCheck %s --check-prefixes=REMOVE + +#include int test(int x) { return x + 123; @@ -12,4 +14,19 @@ int test(int x) { // CHECK-NEXT: unreachable // REMOVE-LABEL: define {{.*}}i32 @test( -// REMOVE: call { i32, i1 } @llvm.sadd.with.overflow.i32( +// REMOVE: add i32 %x, 123 +// REMOVE-NEXT: ret i32 + + +bool experimental_hot() __asm("llvm.experimental.hot"); + +bool test_asm() { + return experimental_hot(); +} + +// CHECK-LABEL: define {{.*}}i1 @test_asm( +// CHECK: [[R:%.*]] = tail call zeroext i1 @llvm.experimental.hot() +// CHECK: ret i1 [[R]] + +// REMOVE-LABEL: define {{.*}}i1 @test_asm( +// REMOVE: ret i1 true diff --git a/llvm/lib/Transforms/Instrumentation/RemoveTrapsPass.cpp b/llvm/lib/Transforms/Instrumentation/RemoveTrapsPass.cpp index d87f7482a21d25..fa4716f2e7a403 100644 --- a/llvm/lib/Transforms/Instrumentation/RemoveTrapsPass.cpp +++ b/llvm/lib/Transforms/Instrumentation/RemoveTrapsPass.cpp @@
[llvm-branch-commits] [clang][ubsan] Switch UBSAN optimization to `llvm.experimental.hot` (PR #84858)
https://github.com/vitalybuka created https://github.com/llvm/llvm-project/pull/84858 Intrinsic introduced with #84850. Using intrinsic improves performance by 3% comparing to removing traps (on "test-suite/MultiSource/Benchmarks" with PGO+ThinLTO). The pass will be renamed with #84852. ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits