xref: /llvm-project/clang/test/Analysis/copypaste/asm.cpp (revision 561f0de6d96eff6efc53e6e8b07bc9408304b381)
1 // RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
2 
3 // expected-no-diagnostics
4 
foo1(int src)5 int foo1(int src) {
6   int dst = src;
7   if (src < 100 && src > 0) {
8 
9     asm ("mov %1, %0\n\t"
10          "add $1, %0"
11          : "=r" (dst)
12          : "r" (src));
13 
14   }
15   return dst;
16 }
17 
18 // Identical to foo1 except that it adds two instead of one, so it's no clone.
foo2(int src)19 int foo2(int src) {
20   int dst = src;
21   if (src < 100 && src > 0) {
22 
23     asm ("mov %1, %0\n\t"
24          "add $2, %0"
25          : "=r" (dst)
26          : "r" (src));
27 
28   }
29   return dst;
30 }
31 
32 // Identical to foo1 except that its a volatile asm statement, so it's no clone.
foo3(int src)33 int foo3(int src) {
34   int dst = src;
35   if (src < 100 && src > 0) {
36 
37     asm volatile ("mov %1, %0\n\t"
38          "add $1, %0"
39          : "=r" (dst)
40          : "r" (src));
41 
42   }
43   return dst;
44 }
45