| // RUN: %clang_analyze_cc1 -triple i386-pc-linux-gnu -analyzer-checker=debug.DumpCFG %s 2>&1 | FileCheck %s | |
| // RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=debug.DumpCFG %s 2>&1 | FileCheck %s | |
| int foo(int cond) | |
| { | |
| label_true: | |
| asm goto("testl %0, %0; jne %l1;" :: "r"(cond)::label_true, loop); | |
| return 0; | |
| loop: | |
| return 0; | |
| } | |
| // CHECK-LABEL: loop | |
| // CHECK-NEXT: 0 | |
| // CHECK-NEXT: return | |
| // CHECK-NEXT: Preds (1): B3 | |
| // CHECK-NEXT: Succs (1): B0 | |
| // CHECK-LABEL: label_true | |
| // CHECK-NEXT: cond | |
| // CHECK-NEXT: [B3.1] | |
| // CHECK-NEXT: T: asm goto | |
| // CHECK-NEXT: Preds (2): B3 B4 | |
| // CHECK-NEXT: Succs (3): B2 B3 B1 | |
| int bar(int cond) | |
| { | |
| asm goto("testl %0, %0; jne %l1;" :: "r"(cond)::L1, L2); | |
| return 0; | |
| L1: | |
| L2: | |
| return 0; | |
| } | |
| // CHECK: [B4] | |
| // CHECK-NEXT: cond | |
| // CHECK-NEXT: [B4.1] | |
| // CHECK-NEXT: T: asm goto | |
| // CHECK-NEXT: Preds (1): B5 | |
| // CHECK-NEXT: Succs (3): B3 B2 B1 | |
| int zoo(int n) | |
| { | |
| A5: | |
| A1: | |
| asm goto("testl %0, %0; jne %l1;" :: "r"(n)::A1, A2, A3, A4, A5); | |
| A2: | |
| A3: | |
| A4: | |
| return 0; | |
| } | |
| // CHECK-LABEL: A1 | |
| // CHECK-NEXT: n | |
| // CHECK-NEXT: [B4.1] | |
| // CHECK-NEXT: T: asm goto | |
| // CHECK-NEXT: Preds (2): B5 B4 | |
| // CHECK-NEXT: Succs (5): B3 B4 B2 B1 B5 | |
| void baz(void) | |
| { | |
| asm goto("" :: "r"(1 ? 2 : 0 << -1) :: error); | |
| error:; | |
| } | |
| // CHECK: [B2] | |
| // CHECK-NEXT: 1: [B5.2] ? [B3.1] : [B4.4] | |
| // CHECK-NEXT: T: asm goto ("" : : "r" ([B2.1]) : : error); | |
| // CHECK-NEXT: Preds (2): B3 B4 | |
| // CHECK-NEXT: Succs (1): B1 |