[klee-dev] Number of paths in presence of 'select' instruction

Andrew Santosa asantosa1999 at gmail.com
Sun May 6 14:48:51 BST 2018


Hi Boris,

The select instruction can typically be handled by an SMT solver primitive, usually called "ite",
hence it seems advantageous in terms of efficiency not to fork a new branch for it.

It looks benign enough to remove the whole statement

pm3.add(createCFGSimplificationPass());
in KModule::prepare(). If I were you I would just try it out.

Best,
Andrew
 

    On Monday, 16 April 2018, 6:37:14 pm GMT+8, Boris Yakobowski <yakobowski at adacore.com> wrote:  
 
 Hi,

I've been trying to use Klee on top of gnat-llvm, an experimental Ada to 
LLVM bitcode compiler which is being developed right now. I've ported 
the example of the Sign tutorial to Ada, but the results are not exactly 
what we expected. This is the intermediate IL produced by the compiler 
for the sign function:

define i32 @get_sign(i32 %x) !dbg !9 {
entry:
   %0 = icmp eq i32 %x, 0, !dbg !11
   br i1 %0, label %true, label %false, !dbg !11

true:                                             ; preds = %entry
   ret i32 0, !dbg !12

false:                                            ; preds = %entry
   %1 = icmp slt i32 %x, 0, !dbg !13
   br i1 %1, label %true1, label %false2, !dbg !13

true1:                                            ; preds = %false
   ret i32 -1, !dbg !14

false2:                                           ; preds = %false
   ret i32 1, !dbg !15

end:                                              ; preds = 
%unreachable4, %unreachable3, %unreachable
   unreachable, !dbg !15

unreachable:                                      ; No predecessors!
   br label %end, !dbg !12

unreachable3:                                     ; No predecessors!
   br label %end, !dbg !14

unreachable4:                                     ; No predecessors!
   br label %end, !dbg !15
}

This is significantly more optimized than what is obtained by default 
with clang, and Klee is apparently smart enough to further simplify 
this. This is what I get using -debug-print-instructions=all:stderr:

      sign.adb:8:21:  %0 = icmp eq i32 %x, 0, !dbg !31
      sign.adb:10:22:  %1 = icmp slt i32 %x, 0, !dbg !32
      sign.adb:10:23:  %. = select i1 %1, i32 -1, i32 1
      sign.adb:8:24:  %merge = select i1 %0, i32 0, i32 %., !dbg !31
      sign.adb:9:25:  ret i32 %merge, !dbg !33

The 'br' instructions have been transformed into a 'select', and Klee 
finds only 1 path, instead of the expected 3. I found this related 
question 
https://mailman.ic.ac.uk/mailman/htdig/klee-dev/2016-April/001332.html, 
and removing the call to createCFGSimplificationPass() in 
KModule::prepare is enough. But I still have two questions:

- why is the 'select' instruction not recognized as creating paths?
- is it safe to remove this particular call to createCFGSimplificationPass.

(All this has been done with LLVM 5.0, in case this makes a difference.)

Thanks for any input!

-- 
Boris Yakobowski


_______________________________________________
klee-dev mailing list
klee-dev at imperial.ac.uk
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev
  
-------------- next part --------------
HTML attachment scrubbed and removed


More information about the klee-dev mailing list