// milena@jason:/opt/llvm-3.3/cbmc-5-5-linux-64$ time ./cbmc --div-by-zero-check --64 --function m branislava.c
// milena@jason:/opt/llvm-3.3/cbmc-5-5-linux-64$ time ./cbmc --div-by-zero-check --32 --function m branislava.c

int assume_lav(int);
int m(int a, int b, int c, int d)
{

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3); //kada se doda ova grupa, cbmc radi 12 sekundi za int 32, a 21 za int 64

  a = (b<<3)*((c>>2)/3); //naredna vremena su za int 32, za int 64 bi bila neuporedivo veca
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3); //kad se doda ova grupa, cbmc radi 55 sekundi

  a = (b<<3)*((c>>2)/3);  //kad se doda ova komanda, cbmc radi oko 90 sekundi  
  b = (a<<3)*((c>>2)/3);  //kad se doda ova komanda, cbmc radi oko 155 sekundi
  c = (b<<3)*((a>>2)/3);  //kad se doda ova komanda, cbmc radi oko 250 sekundi


  a = (b<<3)*((c>>2)/3);  //kad se doda ova komanda, probijamo vremensko ogranicenje, ukoliko se ono postavi na npr 5 minuta = 300 sekundi 
                          //cbmc radi oko 360 sekundi
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);
  b = (a<<3)*((c>>2)/3);
  c = (b<<3)*((a>>2)/3);

  a = (b<<3)*((c>>2)/3);

  assume_lav(c!=0 && a!=0 && d!=0);
  a = b/c + b/a + c/(++b);   
  b = a/d;
   
  return b;
}

