Test source: git
Source: <stdin> ---------------------------------------- define * @caller(* %a, * %b) { %Top: %c = icmp eq * %a, null br i1 %c, label %Tail, label %TBB %TBB: %c2 = icmp eq * %b, null br i1 %c2, label %Tail, label %End %End: ret * null %Tail: %ca = call * @callee(* %a, * %b) %cb = bitcast * %ca to * ret * %cb } => define * @caller(* %a, * %b) { %Top: %c = icmp eq * %a, null br i1 %c, label %Top.split, label %TBB %TBB: %c2 = icmp eq * %b, null br i1 %c2, label %TBB.split, label %End %TBB.split: %ca3 = call * @callee(nonnull * %a, * null) %cb4 = bitcast * %ca3 to * ret * %cb4 %End: ret * null %Top.split: %ca1 = call * @callee(* null, * %b) %cb2 = bitcast * %ca1 to * ret * %cb2 } Transformation doesn't verify! ERROR: Source is more defined than target Example: * %a = pointer(non-local, block_id=1, offset=4) * %b = poison Source: i1 %c = #x1 (1) i1 %c2 = poison * %ca = poison * %cb = poison SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 1 alloc type: 0 address: 0 Block 1 > size: 0 align: 2 alloc type: 0 address: 12 Block 2 > size: 7 align: 2 alloc type: 0 address: 1 Block 3 > size: 0 align: 2 alloc type: 0 address: 8 Block 4 > size: 0 align: 2 alloc type: 0 Target: i1 %c = #x1 (1) i1 %c2 = poison * %ca3 = poison * %cb4 = poison * %ca1 = poison * %cb2 = poison ------------------- SMT STATS ------------------- Num queries: 8 Num invalid: 0 Num skips: 0 Num trivial: 3 (27.3%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 8 (100.0%) Num UNSAT: 0 (0.0%) Alive2: Transform doesn't verify; aborting!
+ : 'RUN: at line 1' + /home/nlopes/alive2/build/opt-alive.sh -callsite-splitting -verify-dom-info -S + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/CallSiteSplitting/musttail.ll FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/CallSiteSplitting/musttail.ll