Test source: git
Source: <stdin> ---------------------------------------- define i32 @main(* %p, i32 %x, i32 %y) { %block1: %z = load i32, * %p, align 4 %cmp = icmp eq i32 %x, %y br i1 %cmp, label %block2, label %block3 %block3: %b = bitcast i32 0 to i32 store i32 %b, * %p, align 4 br label %block4 %block2: br label %block4 %block4: %DEAD = load i32, * %p, align 4 ret i32 %DEAD } => define i32 @main(* %p, i32 %x, i32 %y) { %block1: %cmp = icmp eq i32 %x, %y br i1 %cmp, label %block2, label %block3 %block3: store i32 0, * %p, align 4 br label %block4 %block2: %DEAD.pre = load i32, * %p, align 4 br label %block4 %block4: %DEAD = phi i32 [ 0, %block3 ], [ %DEAD.pre, %block2 ] ret i32 %DEAD } Transformation doesn't verify! ERROR: Source is more defined than target Example: * %p = pointer(non-local, block_id=1, offset=0) i32 %x = any i32 %y = undef Source: i32 %z = poison i1 %cmp = any i32 %b = #x00000000 (0) i32 %DEAD = poison SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 1 alloc type: 0 Block 1 > size: 8 align: 4 alloc type: 0 Target: i1 %cmp = any i32 %DEAD.pre = poison i32 %DEAD = poison ------------------- SMT STATS ------------------- Num queries: 5 Num invalid: 0 Num skips: 0 Num trivial: 0 (0.0%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 2 (40.0%) Num UNSAT: 3 (60.0%)
+ : 'RUN: at line 1' + /home/nlopes/alive2/scripts/opt-alive.sh -basic-aa -gvn -S + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/GVN/PRE/rle-semidominated.ll Alive2: Transform doesn't verify; aborting! FileCheck error: '<stdin>' is empty. FileCheck command line: /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/GVN/PRE/rle-semidominated.ll
NOTE: This test would pass if undef didn't exist!