https://github.com/IamYJLee updated 
https://github.com/llvm/llvm-project/pull/201481

>From a36709653a16ce9c90545e6f398d7910bde9677c Mon Sep 17 00:00:00 2001
From: LeeYoungJoon <[email protected]>
Date: Thu, 4 Jun 2026 09:14:15 +0900
Subject: [PATCH 1/4] [clang][AST] Fix StmtProfile handling of GCCAsmStmt asm
 strings and clobbers

 did not profile asm strings and clobbers because they are not child 
statements. As a result, different inline asm statements could produce the same 
profile.
This fixes a false positive in  where branches containing inline asm were 
incorrectly reported as identical.
---
 clang/lib/AST/StmtProfile.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index eb25e5260fd1a..9b64fda3bd339 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -329,7 +329,7 @@ void StmtProfiler::VisitGCCAsmStmt(const GCCAsmStmt *S) {
   VisitStmt(S);
   ID.AddBoolean(S->isVolatile());
   ID.AddBoolean(S->isSimple());
-  VisitExpr(S->getAsmStringExpr());
+  Visit(S->getAsmStringExpr());
   ID.AddInteger(S->getNumOutputs());
   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
     ID.AddString(S->getOutputName(I));
@@ -342,7 +342,7 @@ void StmtProfiler::VisitGCCAsmStmt(const GCCAsmStmt *S) {
   }
   ID.AddInteger(S->getNumClobbers());
   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
-    VisitExpr(S->getClobberExpr(I));
+    Visit(S->getClobberExpr(I));
   ID.AddInteger(S->getNumLabels());
   for (auto *L : S->labels())
     VisitDecl(L->getLabel());

>From 3486463fdab1cf12e4738d9ede2f184bd8a4ba24 Mon Sep 17 00:00:00 2001
From: LeeYoungJoon <[email protected]>
Date: Thu, 4 Jun 2026 16:58:21 +0900
Subject: [PATCH 2/4] Add test case for branch clone inline asm

---
 .../bugprone/branch-clone-inline-asm.cpp      | 75 +++++++++++++++++++
 1 file changed, 75 insertions(+)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp

diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
new file mode 100644
index 0000000000000..05027fb18b5ab
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
@@ -0,0 +1,75 @@
+// RUN: %check_clang_tidy %s bugprone-branch-clone %t --
+
+int test_asm1(int argc, char**) {
+  if (argc > 1) {
+// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else 
branches [bugprone-branch-clone]
+    __asm__ volatile(
+      "addi %0, %0, -1"
+      : "+r" (argc)
+      );
+  } else {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
+    __asm__ volatile(
+      "addi %0, %0, -1"
+      : "+r" (argc)
+      );
+  }
+  return argc;
+}
+
+int test_asm2(int argc, char**) {
+  if (argc > 1) { // no-warning
+    __asm__ volatile(
+      "addi %0, %0, -1"
+      : "+r" (argc)
+      );
+  } else {
+    __asm__ volatile(
+      "addi %0, %0, -2"
+      : "+r" (argc)
+      );
+  }
+  return argc;
+}
+
+int test_asm3(int argc, char**) {
+  int Test1 = 0;
+  if (argc > 1) {
+// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else 
branches [bugprone-branch-clone]
+    __asm__ volatile(
+      "add %w0, %w0, -1"
+      : "+r" (argc)
+      : "r" (Test1)
+      : "w0"
+      );
+  } else {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
+    __asm__ volatile(
+      "add %w0, %w0, -1"
+      : "+r" (argc)
+      : "r" (Test1)
+      : "w0"
+      );
+  }
+  return argc;
+}
+
+int test_asm4(int argc, char**) {
+  int Test1 = 0;
+  if (argc > 1) { // no-warning
+    __asm__ volatile(
+      "add %w0, %w0, -1"
+      : "+r" (argc)
+      : "r" (Test1)
+      : "w0"
+      );
+  } else {
+    __asm__ volatile(
+      "add %w0, %w0, -1" 
+      : "+r" (argc)
+      : "r" (Test1)
+      : "w1"
+      );
+  }
+  return argc;
+}
\ No newline at end of file

>From 0d0b11049a88fb1bdfa1249e1b0547ecdfbcf525 Mon Sep 17 00:00:00 2001
From: LeeYoungJoon <[email protected]>
Date: Wed, 10 Jun 2026 08:23:48 +0900
Subject: [PATCH 3/4] Fix test case to be target-independent

---
 .../bugprone/branch-clone-inline-asm.cpp      | 48 ++++---------------
 1 file changed, 8 insertions(+), 40 deletions(-)

diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
index 05027fb18b5ab..1e12cbe43632d 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
@@ -3,31 +3,19 @@
 int test_asm1(int argc, char**) {
   if (argc > 1) {
 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else 
branches [bugprone-branch-clone]
-    __asm__ volatile(
-      "addi %0, %0, -1"
-      : "+r" (argc)
-      );
+    __asm__ volatile("" : "+r" (argc));
   } else {
 // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
-    __asm__ volatile(
-      "addi %0, %0, -1"
-      : "+r" (argc)
-      );
+    __asm__ volatile("" : "+r" (argc));
   }
   return argc;
 }
 
 int test_asm2(int argc, char**) {
   if (argc > 1) { // no-warning
-    __asm__ volatile(
-      "addi %0, %0, -1"
-      : "+r" (argc)
-      );
+    __asm__ volatile("foo" : "+r" (argc));
   } else {
-    __asm__ volatile(
-      "addi %0, %0, -2"
-      : "+r" (argc)
-      );
+    __asm__ volatile("bar" : "+r" (argc));
   }
   return argc;
 }
@@ -36,20 +24,10 @@ int test_asm3(int argc, char**) {
   int Test1 = 0;
   if (argc > 1) {
 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: if with identical then and else 
branches [bugprone-branch-clone]
-    __asm__ volatile(
-      "add %w0, %w0, -1"
-      : "+r" (argc)
-      : "r" (Test1)
-      : "w0"
-      );
+    __asm__ volatile("" : "+r" (argc) : "r" (Test1) : "memory");
   } else {
 // CHECK-MESSAGES: :[[@LINE-1]]:5: note: else branch starts here
-    __asm__ volatile(
-      "add %w0, %w0, -1"
-      : "+r" (argc)
-      : "r" (Test1)
-      : "w0"
-      );
+    __asm__ volatile("" : "+r" (argc) : "r" (Test1) : "memory");
   }
   return argc;
 }
@@ -57,19 +35,9 @@ int test_asm3(int argc, char**) {
 int test_asm4(int argc, char**) {
   int Test1 = 0;
   if (argc > 1) { // no-warning
-    __asm__ volatile(
-      "add %w0, %w0, -1"
-      : "+r" (argc)
-      : "r" (Test1)
-      : "w0"
-      );
+    __asm__ volatile("" : "+r" (argc) : "r" (Test1) : "memory");
   } else {
-    __asm__ volatile(
-      "add %w0, %w0, -1" 
-      : "+r" (argc)
-      : "r" (Test1)
-      : "w1"
-      );
+    __asm__ volatile("" : "+r" (argc) : "r" (Test1) : "cc");
   }
   return argc;
 }
\ No newline at end of file

>From 8ddfa5ed461cb2632398519e71f81f14aba91530 Mon Sep 17 00:00:00 2001
From: LeeYoungJoon <[email protected]>
Date: Wed, 10 Jun 2026 16:58:16 +0900
Subject: [PATCH 4/4] [clang-tidy] Address review comments for inline asm test

---
 .../clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
index 1e12cbe43632d..daf9b539ae50a 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/branch-clone-inline-asm.cpp
@@ -1,4 +1,4 @@
-// RUN: %check_clang_tidy %s bugprone-branch-clone %t --
+// RUN: %check_clang_tidy %s bugprone-branch-clone %t
 
 int test_asm1(int argc, char**) {
   if (argc > 1) {
@@ -40,4 +40,4 @@ int test_asm4(int argc, char**) {
     __asm__ volatile("" : "+r" (argc) : "r" (Test1) : "cc");
   }
   return argc;
-}
\ No newline at end of file
+}

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

Reply via email to