[clang] 0d15d46 - [ubsan] Change ubsan-unique-traps to use nomerge instead of counter (#117651)

via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 26 21:13:03 PST 2024


Author: Thurston Dang
Date: 2024-11-26T21:13:00-08:00
New Revision: 0d15d46362bd6ab5a9a2165805adaab13a7689f4

URL: https://github.com/llvm/llvm-project/commit/0d15d46362bd6ab5a9a2165805adaab13a7689f4
DIFF: https://github.com/llvm/llvm-project/commit/0d15d46362bd6ab5a9a2165805adaab13a7689f4.diff

LOG: [ubsan] Change ubsan-unique-traps to use nomerge instead of counter (#117651)

https://github.com/llvm/llvm-project/pull/65972 (continuation of
https://reviews.llvm.org/D148654) had considered adding nomerge to
ubsantrap, but did not proceed with that because of
https://github.com/llvm/llvm-project/issues/53011. Instead, it added a
counter (based on TrapBB->getParent()->size()) to each ubsantrap call.
However, this counter is not guaranteed to be unique after inlining, as
shown by https://github.com/llvm/llvm-project/pull/83470, which can
result in ubsantraps being merged by the backend.

https://github.com/llvm/llvm-project/pull/101549 has since fixed the
nomerge limitation ("It sets nomerge flag for the node if the
instruction has nomerge arrtibute."). This patch therefore takes
advantage of nomerge instead of using the counter, guaranteeing that the
ubsantraps are not merged.

This patch is equivalent to
https://github.com/llvm/llvm-project/pull/83470 but also adds nomerge
and updates tests (https://github.com/llvm/llvm-project/pull/117649:
ubsan-trap-merge.c; https://github.com/llvm/llvm-project/pull/117657:
ubsan-trap-merge.ll, ubsan-trap-nomerge.ll; catch-undef-behavior.c).

Added: 
    

Modified: 
    clang/lib/CodeGen/CGExpr.cpp
    clang/test/CodeGen/bounds-checking.c
    clang/test/CodeGen/catch-undef-behavior.c
    clang/test/CodeGen/ubsan-trap-merge.c
    llvm/test/CodeGen/X86/ubsan-trap-merge.ll
    llvm/test/CodeGen/X86/ubsan-trap-nomerge.ll

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index d3f470d401b3d4..229f0e29f02341 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -3905,9 +3905,11 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
 
   llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
 
-  if (!ClSanitizeDebugDeoptimization &&
-      CGM.getCodeGenOpts().OptimizationLevel && TrapBB &&
-      (!CurCodeDecl || !CurCodeDecl->hasAttr<OptimizeNoneAttr>())) {
+  bool NoMerge = ClSanitizeDebugDeoptimization ||
+                 !CGM.getCodeGenOpts().OptimizationLevel ||
+                 (CurCodeDecl && CurCodeDecl->hasAttr<OptimizeNoneAttr>());
+
+  if (TrapBB && !NoMerge) {
     auto Call = TrapBB->begin();
     assert(isa<llvm::CallInst>(Call) && "Expected call in trap BB");
 
@@ -3919,18 +3921,17 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
     Builder.CreateCondBr(Checked, Cont, TrapBB);
     EmitBlock(TrapBB);
 
-    llvm::CallInst *TrapCall = Builder.CreateCall(
-        CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
-        llvm::ConstantInt::get(CGM.Int8Ty,
-                               ClSanitizeDebugDeoptimization
-                                   ? TrapBB->getParent()->size()
-                                   : static_cast<uint64_t>(CheckHandlerID)));
+    llvm::CallInst *TrapCall =
+        Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
+                           llvm::ConstantInt::get(CGM.Int8Ty, CheckHandlerID));
 
     if (!CGM.getCodeGenOpts().TrapFuncName.empty()) {
       auto A = llvm::Attribute::get(getLLVMContext(), "trap-func-name",
                                     CGM.getCodeGenOpts().TrapFuncName);
       TrapCall->addFnAttr(A);
     }
+    if (NoMerge)
+      TrapCall->addFnAttr(llvm::Attribute::NoMerge);
     TrapCall->setDoesNotReturn();
     TrapCall->setDoesNotThrow();
     Builder.CreateUnreachable();

diff  --git a/clang/test/CodeGen/bounds-checking.c b/clang/test/CodeGen/bounds-checking.c
index 8100e30d0650ad..f6c4880e70a150 100644
--- a/clang/test/CodeGen/bounds-checking.c
+++ b/clang/test/CodeGen/bounds-checking.c
@@ -74,11 +74,11 @@ char B2[10];
 // CHECK-LABEL: @f8
 void f8(int i, int k) {
   // NOOPTLOCAL: call void @llvm.ubsantrap(i8 3)
-  // NOOPTARRAY: call void @llvm.ubsantrap(i8 2)
+  // NOOPTARRAY: call void @llvm.ubsantrap(i8 18)
   B[i] = '\0';
 
   // NOOPTLOCAL: call void @llvm.ubsantrap(i8 5)
-  // NOOPTARRAY: call void @llvm.ubsantrap(i8 4)
+  // NOOPTARRAY: call void @llvm.ubsantrap(i8 18)
   B2[k] = '\0';
 }
 

diff  --git a/clang/test/CodeGen/catch-undef-behavior.c b/clang/test/CodeGen/catch-undef-behavior.c
index af37ef9e8565b1..7580290b0b0333 100644
--- a/clang/test/CodeGen/catch-undef-behavior.c
+++ b/clang/test/CodeGen/catch-undef-behavior.c
@@ -470,4 +470,4 @@ void call_nonnull_variadic(int a, int *b) {
 
 // CHECK-UBSAN: ![[WEIGHT_MD]] = !{!"branch_weights", i32 1048575, i32 1}
 
-// CHECK-TRAP: attributes [[NR_NUW]] = { noreturn nounwind }
+// CHECK-TRAP: attributes [[NR_NUW]] = { nomerge noreturn nounwind }

diff  --git a/clang/test/CodeGen/ubsan-trap-merge.c b/clang/test/CodeGen/ubsan-trap-merge.c
index 0f50d8c1ff47f2..dccce0ce4c56b6 100644
--- a/clang/test/CodeGen/ubsan-trap-merge.c
+++ b/clang/test/CodeGen/ubsan-trap-merge.c
@@ -1,6 +1,6 @@
 // NOTE: Assertions have mostly been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
 // The most important assertion is the attributes at the end of the file, which
-// shows that ubsan does not currently attach 'nomerge'.
+// shows that -ubsan-unique-traps attaches 'nomerge' to each ubsantrap intrinsic.
 //
 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow -O3 -mllvm -ubsan-unique-traps %s -o - \
 // RUN:     | FileCheck %s
@@ -14,7 +14,7 @@
 // CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[CONT]]:
 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
@@ -31,7 +31,7 @@ int f(int x) {
 // CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[CONT]]:
 // CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
@@ -48,14 +48,14 @@ int g(int x) {
 // CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[CONT]]:
 // CHECK-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
 // 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 4) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[CONT2]]:
 // CHECK-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
@@ -76,14 +76,14 @@ int h(int x, int y) {
 // CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP_I]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[F_EXIT]]:
 // CHECK-NEXT:    [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
 // CHECK-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP_I2]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[G_EXIT]]:
 // CHECK-NEXT:    [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
@@ -92,7 +92,7 @@ int h(int x, int y) {
 // CHECK-NEXT:    [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
 // CHECK-NEXT:    br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR4]], !nosanitize [[META2]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
 // CHECK:       [[CONT]]:
 // CHECK-NEXT:    [[TMP8:%.*]] = extractvalue { i32, i1 } [[TMP6]], 0, !nosanitize [[META2]]
@@ -102,4 +102,4 @@ int m(int x, int y) {
   return f(x) + g(y);
 }
 //.
-// CHECK: attributes #[[ATTR4]] = { noreturn nounwind }	
+// CHECK: attributes #[[ATTR4]] = { nomerge noreturn nounwind }

diff  --git a/llvm/test/CodeGen/X86/ubsan-trap-merge.ll b/llvm/test/CodeGen/X86/ubsan-trap-merge.ll
index b96c85473e5387..878260cbcaec2f 100644
--- a/llvm/test/CodeGen/X86/ubsan-trap-merge.ll
+++ b/llvm/test/CodeGen/X86/ubsan-trap-merge.ll
@@ -4,7 +4,8 @@
 ; This test shows that ubsantrap can, in the absence of nomerge, be merged by
 ; the backend into a single ud1 instruction (thus making debugging 
diff icult).
 ;
-; The LLVM IR was generated from clang/test/CodeGen/ubsan-trap-merge.c.
+; The LLVM IR was generated from clang/test/CodeGen/ubsan-trap-merge.c with
+; 'nomerge' manually removed from ubsantraps.
 ;
 ; ModuleID = '../clang/test/CodeGen/ubsan-trap-merge.c'
 source_filename = "../clang/test/CodeGen/ubsan-trap-merge.c"
@@ -21,14 +22,14 @@ define dso_local range(i32 -2147483523, -2147483648) i32 @f(i32 noundef %x) loca
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB0_1: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 125), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -52,14 +53,14 @@ define dso_local range(i32 -2147483521, -2147483648) i32 @g(i32 noundef %x) loca
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB1_1: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 127), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -75,23 +76,21 @@ define dso_local range(i32 -2147483521, -2147483648) i32 @h(i32 noundef %x, i32
 ; CHECK-NEXT:    jo .LBB2_3
 ; CHECK-NEXT:  # %bb.1: # %cont
 ; CHECK-NEXT:    addl $129, %esi
-; CHECK-NEXT:    jo .LBB2_4
+; CHECK-NEXT:    jo .LBB2_3
 ; CHECK-NEXT:  # %bb.2: # %cont2
 ; CHECK-NEXT:    cmpl %esi, %edi
 ; CHECK-NEXT:    cmovll %edi, %esi
 ; CHECK-NEXT:    movl %esi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB2_3: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
-; CHECK-NEXT:  .LBB2_4: # %trap1
-; CHECK-NEXT:    ud1l 4(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 127), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -100,7 +99,7 @@ cont:                                             ; preds = %entry
   br i1 %3, label %trap1, label %cont2, !nosanitize !5
 
 trap1:                                            ; preds = %cont
-  tail call void @llvm.ubsantrap(i8 4) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont2:                                            ; preds = %cont
@@ -126,14 +125,14 @@ define dso_local noundef i32 @m(i32 noundef %x, i32 noundef %y) local_unnamed_ad
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB3_4: # %trap.i
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 125), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap.i, label %f.exit, !nosanitize !5
 
 trap.i:                                           ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 f.exit:                                           ; preds = %entry
@@ -142,7 +141,7 @@ f.exit:                                           ; preds = %entry
   br i1 %3, label %trap.i2, label %g.exit, !nosanitize !5
 
 trap.i2:                                          ; preds = %f.exit
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 g.exit:                                           ; preds = %f.exit
@@ -153,7 +152,7 @@ g.exit:                                           ; preds = %f.exit
   br i1 %7, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %g.exit
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %g.exit

diff  --git a/llvm/test/CodeGen/X86/ubsan-trap-nomerge.ll b/llvm/test/CodeGen/X86/ubsan-trap-nomerge.ll
index 683e318011b8e0..ffcbaac382d56c 100644
--- a/llvm/test/CodeGen/X86/ubsan-trap-nomerge.ll
+++ b/llvm/test/CodeGen/X86/ubsan-trap-nomerge.ll
@@ -4,8 +4,7 @@
 ; This tests that the nomerge attribute for ubsantrap works correctly i.e.,
 ; they are lowered to separate ud1 instructions.
 ;
-; The LLVM IR was generated from clang/test/CodeGen/ubsan-trap-merge.c with
-; 'nomerge' manually added to ubsantraps.
+; The LLVM IR was generated from clang/test/CodeGen/ubsan-trap-merge.c.
 ;
 ; ModuleID = '../clang/test/CodeGen/ubsan-trap-merge.c'
 source_filename = "../clang/test/CodeGen/ubsan-trap-merge.c"
@@ -22,14 +21,14 @@ define dso_local range(i32 -2147483523, -2147483648) i32 @f(i32 noundef %x) loca
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB0_1: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 125), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -53,14 +52,14 @@ define dso_local range(i32 -2147483521, -2147483648) i32 @g(i32 noundef %x) loca
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB1_1: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 127), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -83,16 +82,16 @@ define dso_local range(i32 -2147483521, -2147483648) i32 @h(i32 noundef %x, i32
 ; CHECK-NEXT:    movl %esi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB2_3: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 ; CHECK-NEXT:  .LBB2_4: # %trap1
-; CHECK-NEXT:    ud1l 4(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 127), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %entry
@@ -101,7 +100,7 @@ cont:                                             ; preds = %entry
   br i1 %3, label %trap1, label %cont2, !nosanitize !5
 
 trap1:                                            ; preds = %cont
-  tail call void @llvm.ubsantrap(i8 4) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont2:                                            ; preds = %cont
@@ -127,18 +126,18 @@ define dso_local noundef i32 @m(i32 noundef %x, i32 noundef %y) local_unnamed_ad
 ; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
 ; CHECK-NEXT:  .LBB3_4: # %trap.i
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 ; CHECK-NEXT:  .LBB3_5: # %trap.i2
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 ; CHECK-NEXT:  .LBB3_6: # %trap
-; CHECK-NEXT:    ud1l 2(%eax), %eax
+; CHECK-NEXT:    ud1l (%eax), %eax
 entry:
   %0 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %x, i32 125), !nosanitize !5
   %1 = extractvalue { i32, i1 } %0, 1, !nosanitize !5
   br i1 %1, label %trap.i, label %f.exit, !nosanitize !5
 
 trap.i:                                           ; preds = %entry
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 f.exit:                                           ; preds = %entry
@@ -147,7 +146,7 @@ f.exit:                                           ; preds = %entry
   br i1 %3, label %trap.i2, label %g.exit, !nosanitize !5
 
 trap.i2:                                          ; preds = %f.exit
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 g.exit:                                           ; preds = %f.exit
@@ -158,7 +157,7 @@ g.exit:                                           ; preds = %f.exit
   br i1 %7, label %trap, label %cont, !nosanitize !5
 
 trap:                                             ; preds = %g.exit
-  tail call void @llvm.ubsantrap(i8 2) #4, !nosanitize !5
+  tail call void @llvm.ubsantrap(i8 0) #4, !nosanitize !5
   unreachable, !nosanitize !5
 
 cont:                                             ; preds = %g.exit


        


More information about the cfe-commits mailing list