1  /* { dg-do compile { target x86_64-*-* } } */
       2  
       3  #include "analyzer-decls.h"
       4  
       5  int test_out (void)
       6  {
       7    int dst_a, dst_b;
       8    asm ("mov 42, %0"
       9         : "=r" (dst_a));
      10    asm ("mov 42, %0"
      11         : "=r" (dst_b));
      12    __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */
      13    return dst_a;
      14  }
      15  
      16  int test_out_in (int src_a)
      17  {
      18    int dst_a, dst_b;
      19    asm ("mov %1, %0"
      20         : "=r" (dst_a)
      21         : "r" (src_a));
      22    asm ("mov %1, %0"
      23         : "=r" (dst_b)
      24         : "r" (src_a));
      25    __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */
      26    return dst_a;
      27  }
      28  
      29  int test_out_in_in (int src_a, int src_b)
      30  {
      31    int dst_a, dst_b;
      32    asm ("mov %1, %0;\n"
      33         "add %2, %0"
      34         : "=r" (dst_a)
      35         : "r" (src_a),
      36  	 "r" (src_b));
      37    asm ("mov %1, %0;\n"
      38         "add %2, %0"
      39         : "=r" (dst_b)
      40         : "r" (src_a),
      41  	 "r" (src_b));
      42    __analyzer_eval (dst_a == dst_b); /* { dg-warning "TRUE" } */
      43    return dst_a;
      44  }
      45  
      46  void test_inout_1 (int v)
      47  {
      48    int saved = v;
      49    int result_a, result_b;
      50    asm ("dec %0"
      51         : "+r" (v));
      52    result_a = v;
      53  
      54    asm ("dec %0"
      55         : "+r" (v));
      56    result_b = v;
      57  
      58    __analyzer_eval (v == saved); /* { dg-warning "UNKNOWN" } */
      59    __analyzer_eval (v == result_a); /* { dg-warning "UNKNOWN" } */
      60    __analyzer_eval (v == result_b); /* { dg-warning "TRUE" } */
      61  }
      62  
      63  void test_inout_2 (void)
      64  {
      65    int v;
      66    int result_a, result_b;
      67    asm ("dec %0" /* { dg-warning "use of uninitialized value 'v'" } */
      68         : "+r" (v));
      69  }