| /* { dg-do assemble { target x86_64-*-* } } */ |
| |
| #include "analyzer-decls.h" |
| |
| int test_out (void) |
| { |
| int dst_a, dst_b; |
| asm ("mov 42, %0" |
| : "=r" (dst_a)); |
| asm ("mov 42, %0" |
| : "=r" (dst_b)); |
| __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */ |
| return dst_a; |
| } |
| |
| int test_out_in (int src_a) |
| { |
| int dst_a, dst_b; |
| asm ("mov %1, %0" |
| : "=r" (dst_a) |
| : "r" (src_a)); |
| asm ("mov %1, %0" |
| : "=r" (dst_b) |
| : "r" (src_a)); |
| __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */ |
| return dst_a; |
| } |
| |
| int test_out_in_in (int src_a, int src_b) |
| { |
| int dst_a, dst_b; |
| asm ("mov %1, %0;\n" |
| "add %2, %0" |
| : "=r" (dst_a) |
| : "r" (src_a), |
| "r" (src_b)); |
| asm ("mov %1, %0;\n" |
| "add %2, %0" |
| : "=r" (dst_b) |
| : "r" (src_a), |
| "r" (src_b)); |
| __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */ |
| return dst_a; |
| } |
| |
| void test_inout_1 (int v) |
| { |
| int saved = v; |
| int result_a, result_b; |
| asm ("dec %0" |
| : "+r" (v)); |
| result_a = v; |
| |
| asm ("dec %0" |
| : "+r" (v)); |
| result_b = v; |
| |
| __analyzer_eval (v == saved); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (v == result_a); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (v == result_b); /* { dg-warning "TRUE" } */ |
| } |
| |
| void test_inout_2 (void) |
| { |
| int v; |
| int result_a, result_b; |
| asm ("dec %0" /* { dg-warning "use of uninitialized value 'v'" } */ |
| : "+r" (v)); |
| } |