//#Safe type _SIZE_T_TYPE = bv32; const _WATCHED_OFFSET: bv32; const {:__enabled} __enabled: bool; const {:global_offset_x} global_offset_x: bv32; const {:global_offset_y} global_offset_y: bv32; const {:global_offset_z} global_offset_z: bv32; const {:group_size_x} group_size_x: bv32; const {:group_size_y} group_size_y: bv32; const {:group_size_z} group_size_z: bv32; const {:num_groups_x} num_groups_x: bv32; const {:num_groups_y} num_groups_y: bv32; const {:num_groups_z} num_groups_z: bv32; function __other_bool(bool) : bool; function __other_bv32(bv32) : bv32; function {:builtin "bvor"} BV32_OR(bv32, bv32) : bv32; function {:builtin "bvsgt"} BV32_SGT(bv32, bv32) : bool; function {:builtin "bvshl"} BV32_SHL(bv32, bv32) : bv32; function {:builtin "bvslt"} BV32_SLT(bv32, bv32) : bool; function {:builtin "zero_extend 31"} BV1_ZEXT32(bv1) : bv32; procedure {:source_name "bar"} $bar($x: bv32); requires (if BV32_SGT($x, 0bv32) then 1bv1 else 0bv1) != 0bv1; requires BV32_SGT(group_size_x, 0bv32); requires BV32_SGT(num_groups_x, 0bv32); requires BV32_SGE(group_id_x$1, 0bv32); requires BV32_SGE(group_id_x$2, 0bv32); requires BV32_SLT(group_id_x$1, num_groups_x); requires BV32_SLT(group_id_x$2, num_groups_x); requires BV32_SGE(local_id_x$1, 0bv32); requires BV32_SGE(local_id_x$2, 0bv32); requires BV32_SLT(local_id_x$1, group_size_x); requires BV32_SLT(local_id_x$2, group_size_x); requires BV32_SGT(group_size_y, 0bv32); requires BV32_SGT(num_groups_y, 0bv32); requires BV32_SGE(group_id_y$1, 0bv32); requires BV32_SGE(group_id_y$2, 0bv32); requires BV32_SLT(group_id_y$1, num_groups_y); requires BV32_SLT(group_id_y$2, num_groups_y); requires BV32_SGE(local_id_y$1, 0bv32); requires BV32_SGE(local_id_y$2, 0bv32); requires BV32_SLT(local_id_y$1, group_size_y); requires BV32_SLT(local_id_y$2, group_size_y); requires BV32_SGT(group_size_z, 0bv32); requires BV32_SGT(num_groups_z, 0bv32); requires BV32_SGE(group_id_z$1, 0bv32); requires BV32_SGE(group_id_z$2, 0bv32); requires BV32_SLT(group_id_z$1, num_groups_z); requires BV32_SLT(group_id_z$2, num_groups_z); requires BV32_SGE(local_id_z$1, 0bv32); requires BV32_SGE(local_id_z$2, 0bv32); requires BV32_SLT(local_id_z$1, group_size_z); requires BV32_SLT(local_id_z$2, group_size_z); requires group_id_x$1 == group_id_x$2 && group_id_y$1 == group_id_y$2 && group_id_z$1 == group_id_z$2 ==> local_id_x$1 != local_id_x$2 || local_id_y$1 != local_id_y$2 || local_id_z$1 != local_id_z$2; implementation {:source_name "bar"} $bar($x: bv32) { $entry: return; } procedure {:source_name "foo"} ULTIMATE.start(); requires BV32_SGT(group_size_x, 0bv32); requires BV32_SGT(num_groups_x, 0bv32); requires BV32_SGE(group_id_x$1, 0bv32); requires BV32_SGE(group_id_x$2, 0bv32); requires BV32_SLT(group_id_x$1, num_groups_x); requires BV32_SLT(group_id_x$2, num_groups_x); requires BV32_SGE(local_id_x$1, 0bv32); requires BV32_SGE(local_id_x$2, 0bv32); requires BV32_SLT(local_id_x$1, group_size_x); requires BV32_SLT(local_id_x$2, group_size_x); requires BV32_SGT(group_size_y, 0bv32); requires BV32_SGT(num_groups_y, 0bv32); requires BV32_SGE(group_id_y$1, 0bv32); requires BV32_SGE(group_id_y$2, 0bv32); requires BV32_SLT(group_id_y$1, num_groups_y); requires BV32_SLT(group_id_y$2, num_groups_y); requires BV32_SGE(local_id_y$1, 0bv32); requires BV32_SGE(local_id_y$2, 0bv32); requires BV32_SLT(local_id_y$1, group_size_y); requires BV32_SLT(local_id_y$2, group_size_y); requires BV32_SGT(group_size_z, 0bv32); requires BV32_SGT(num_groups_z, 0bv32); requires BV32_SGE(group_id_z$1, 0bv32); requires BV32_SGE(group_id_z$2, 0bv32); requires BV32_SLT(group_id_z$1, num_groups_z); requires BV32_SLT(group_id_z$2, num_groups_z); requires BV32_SGE(local_id_z$1, 0bv32); requires BV32_SGE(local_id_z$2, 0bv32); requires BV32_SLT(local_id_z$1, group_size_z); requires BV32_SLT(local_id_z$2, group_size_z); requires group_id_x$1 == group_id_x$2 && group_id_y$1 == group_id_y$2 && group_id_z$1 == group_id_z$2 ==> local_id_x$1 != local_id_x$2 || local_id_y$1 != local_id_y$2 || local_id_z$1 != local_id_z$2; implementation {:source_name "foo"} ULTIMATE.start() { var $d.0: bv32; var v0: bool; $entry: $d.0 := 1bv32; assume {:captureState "loop_entry_state_0_0"} true; goto $while.cond; $while.cond: assume {:captureState "loop_head_state_0"} true; assert {:block_sourceloc} {:sourceloc_num 3} true; assert {:originated_from_invariant} {:sourceloc_num 4} {:thread 1} (if BV1_ZEXT32((if true then 1bv1 else 0bv1)) == BV1_ZEXT32((if true then 1bv1 else 0bv1)) then 1bv1 else 0bv1) != 0bv1; assert {:originated_from_invariant} {:sourceloc_num 5} {:thread 1} (if $d.0 == $d.0 then 1bv1 else 0bv1) != 0bv1; assert {:originated_from_invariant} {:sourceloc_num 6} {:thread 1} (if true ==> BV32_OR(BV32_OR(BV32_OR(BV32_OR(BV32_OR(BV32_OR(BV1_ZEXT32((if $d.0 == 1bv32 then 1bv1 else 0bv1)), BV1_ZEXT32((if $d.0 == 2bv32 then 1bv1 else 0bv1))), BV1_ZEXT32((if $d.0 == 4bv32 then 1bv1 else 0bv1))), BV1_ZEXT32((if $d.0 == 8bv32 then 1bv1 else 0bv1))), BV1_ZEXT32((if $d.0 == 16bv32 then 1bv1 else 0bv1))), BV1_ZEXT32((if $d.0 == 32bv32 then 1bv1 else 0bv1))), BV1_ZEXT32((if $d.0 == 64bv32 then 1bv1 else 0bv1))) != 0bv32 then 1bv1 else 0bv1) != 0bv1; v0 := BV32_SLT($d.0, 64bv32); goto $truebb, $falsebb; $falsebb: assume {:partition} !v0; return; $truebb: assume {:partition} v0; call $bar($d.0); assume {:captureState "call_return_state_0"} {:procedureName "$bar"} true; $d.0 := BV32_SHL($d.0, 1bv32); assume {:captureState "loop_back_edge_state_0_0"} true; goto $while.cond; } axiom (if group_size_y == 1bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if group_size_z == 1bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if num_groups_z == 1bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if group_size_x == 64bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if num_groups_x == 64bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if num_groups_y == 64bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if global_offset_x == 0bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if global_offset_y == 0bv32 then 1bv1 else 0bv1) != 0bv1; axiom (if global_offset_z == 0bv32 then 1bv1 else 0bv1) != 0bv1; const {:local_id_x} local_id_x$1: bv32; const {:local_id_x} local_id_x$2: bv32; const {:local_id_y} local_id_y$1: bv32; const {:local_id_y} local_id_y$2: bv32; const {:local_id_z} local_id_z$1: bv32; const {:local_id_z} local_id_z$2: bv32; const {:group_id_x} group_id_x$1: bv32; const {:group_id_x} group_id_x$2: bv32; const {:group_id_y} group_id_y$1: bv32; const {:group_id_y} group_id_y$2: bv32; const {:group_id_z} group_id_z$1: bv32; const {:group_id_z} group_id_z$2: bv32; var _TRACKING: bool; function {:builtin "bvsge"} BV32_SGE(bv32, bv32) : bool;