Test source: git
Source: <stdin> ---------------------------------------- define void @test_chr_1(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 1 %2 = icmp eq i32 %1, 0 br i1 %2, label %bb1, label %bb0 %bb0: call void @foo() br label %bb1 %bb1: %3 = and i32 %0, 2 %4 = icmp eq i32 %3, 0 br i1 %4, label %bb3, label %bb2 %bb2: call void @foo() br label %bb3 %bb3: ret void } => define void @test_chr_1(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 3 %2 = icmp eq i32 %1, 3 br i1 %2, label %bb0, label %entry.split.nonchr %entry.split.nonchr: %3 = and i32 %0, 1 %.not = icmp eq i32 %3, 0 br i1 %.not, label %bb1.nonchr, label %bb0.nonchr %bb0.nonchr: call void @foo() br label %bb1.nonchr %bb1.nonchr: %4 = and i32 %0, 2 %5 = icmp eq i32 %4, 0 br i1 %5, label %bb3, label %bb2.nonchr %bb2.nonchr: call void @foo() br label %bb3 %bb0: call void @foo() call void @foo() br label %bb3 %bb3: ret void } Transformation seems to be correct! ---------------------------------------- define void @test_chr_1_1(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 1 %2 = icmp eq i32 %1, 0 br i1 %2, label %bb1, label %bb0 %bb0: call void @foo() br label %bb1 %bb1: %3 = and i32 %0, 2 %4 = icmp eq i32 %3, 0 br i1 %4, label %bb2, label %bb3 %bb2: call void @bar() br label %bb3 %bb3: %5 = and i32 %0, 4 %6 = icmp eq i32 %5, 0 br i1 %6, label %bb5, label %bb4 %bb4: call void @foo() br label %bb5 %bb5: ret void } => define void @test_chr_1_1(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 7 %2 = icmp eq i32 %1, 7 br i1 %2, label %bb0, label %entry.split.nonchr %entry.split.nonchr: %3 = and i32 %0, 1 %.not = icmp eq i32 %3, 0 br i1 %.not, label %bb1.nonchr, label %bb0.nonchr %bb0.nonchr: call void @foo() br label %bb1.nonchr %bb1.nonchr: %4 = and i32 %0, 2 %5 = icmp eq i32 %4, 0 br i1 %5, label %bb2.nonchr, label %bb3.nonchr %bb2.nonchr: call void @bar() br label %bb3.nonchr %bb3.nonchr: %6 = and i32 %0, 4 %7 = icmp eq i32 %6, 0 br i1 %7, label %bb5, label %bb4.nonchr %bb4.nonchr: call void @foo() br label %bb5 %bb0: call void @foo() call void @foo() br label %bb5 %bb5: ret void } Transformation seems to be correct! ---------------------------------------- define void @test_chr_2(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 255 %2 = icmp eq i32 %1, 0 br i1 %2, label %bb4, label %bb0 %bb0: %3 = and i32 %0, 1 %4 = icmp eq i32 %3, 0 br i1 %4, label %bb2, label %bb1 %bb1: call void @foo() br label %bb2 %bb2: %5 = and i32 %0, 2 %6 = icmp eq i32 %5, 0 br i1 %6, label %bb4, label %bb3 %bb3: call void @foo() br label %bb4 %bb4: ret void } => define void @test_chr_2(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 3 %2 = icmp eq i32 %1, 3 br i1 %2, label %bb1, label %entry.split.nonchr %entry.split.nonchr: %3 = and i32 %0, 255 %.not = icmp eq i32 %3, 0 br i1 %.not, label %bb4, label %bb0.nonchr %bb0.nonchr: %4 = and i32 %0, 1 %5 = icmp eq i32 %4, 0 br i1 %5, label %bb2.nonchr, label %bb1.nonchr %bb1.nonchr: call void @foo() br label %bb2.nonchr %bb2.nonchr: %6 = and i32 %0, 2 %7 = icmp eq i32 %6, 0 br i1 %7, label %bb4, label %bb3.nonchr %bb3.nonchr: call void @foo() br label %bb4 %bb1: call void @foo() call void @foo() br label %bb4 %bb4: ret void } Transformation seems to be correct! ---------------------------------------- define void @test_chr_3(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 1 %2 = icmp eq i32 %1, 0 br i1 %2, label %bb1, label %bb0 %bb0: call void @foo() br label %bb1 %bb1: %3 = and i32 %0, 2 %4 = icmp eq i32 %3, 0 br i1 %4, label %bb3, label %bb2 %bb2: call void @foo() br label %bb3 %bb3: %5 = load i32, * %i, align 4 %6 = and i32 %5, 4 %7 = icmp eq i32 %6, 0 br i1 %7, label %bb5, label %bb4 %bb4: call void @foo() br label %bb5 %bb5: %8 = and i32 %5, 8 %9 = icmp eq i32 %8, 0 br i1 %9, label %bb7, label %bb6 %bb6: call void @foo() br label %bb7 %bb7: ret void } => define void @test_chr_3(* %i) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 3 %2 = icmp eq i32 %1, 3 br i1 %2, label %bb0, label %entry.split.nonchr %entry.split.nonchr: %3 = and i32 %0, 1 %.not = icmp eq i32 %3, 0 br i1 %.not, label %bb1.nonchr, label %bb0.nonchr %bb0.nonchr: call void @foo() br label %bb1.nonchr %bb1.nonchr: %4 = and i32 %0, 2 %5 = icmp eq i32 %4, 0 br i1 %5, label %bb3, label %bb2.nonchr %bb2.nonchr: call void @foo() br label %bb3 %bb0: call void @foo() call void @foo() br label %bb3 %bb3: %6 = load i32, * %i, align 4 %7 = and i32 %6, 12 %8 = icmp eq i32 %7, 12 br i1 %8, label %bb4, label %bb3.split.nonchr %bb4: call void @foo() call void @foo() br label %bb7 %bb3.split.nonchr: %9 = and i32 %6, 4 %.not1 = icmp eq i32 %9, 0 br i1 %.not1, label %bb5.nonchr, label %bb4.nonchr %bb4.nonchr: call void @foo() br label %bb5.nonchr %bb5.nonchr: %10 = and i32 %6, 8 %11 = icmp eq i32 %10, 0 br i1 %11, label %bb7, label %bb6.nonchr %bb6.nonchr: call void @foo() br label %bb7 %bb7: ret void } Transformation doesn't verify! ERROR: Timeout ---------------------------------------- define i32 @test_chr_4(* %i, i32 %sum0) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 1 %2 = icmp eq i32 %1, 0 %3 = add i32 %sum0, 42 %sum1 = select i1 %2, i32 %sum0, i32 %3 %4 = and i32 %0, 2 %5 = icmp eq i32 %4, 0 %6 = add i32 %sum1, 43 %sum2 = select i1 %5, i32 %sum1, i32 %6 ret i32 %sum2 } => define i32 @test_chr_4(* %i, i32 %sum0) { %entry: %0 = load i32, * %i, align 4 %1 = and i32 %0, 3 %2 = icmp eq i32 %1, 3 br i1 %2, label %entry.split, label %entry.split.nonchr %entry.split.nonchr: %3 = add i32 %sum0, 42 %4 = and i32 %0, 1 %.not = icmp eq i32 %4, 0 %sum1.nonchr = select i1 %.not, i32 %sum0, i32 %3 %5 = and i32 %0, 2 %6 = icmp eq i32 %5, 0 %7 = add i32 %sum1.nonchr, 43 %sum2.nonchr = select i1 %6, i32 %sum1.nonchr, i32 %7 ret i32 %sum2.nonchr %entry.split: %8 = add i32 %sum0, 85 ret i32 %8 } Transformation doesn't verify! ERROR: Source is more defined than target Example: * %i = pointer(non-local, block_id=1, offset=0) i32 %sum0 = poison Source: i32 %0 = poison i32 %1 = poison i1 %2 = poison i32 %3 = poison i32 %sum1 = poison i32 %4 = poison i1 %5 = poison i32 %6 = poison i32 %sum2 = poison SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 4 alloc type: 0 Block 1 > size: 8 align: 65536 alloc type: 0 Target: i32 %0 = poison i32 %1 = poison i1 %2 = poison i32 %3 = poison i32 %4 = poison i1 %.not = poison i32 %sum1.nonchr = poison i32 %5 = #x00000000 (0) i1 %6 = #x1 (1) i32 %7 = poison i32 %sum2.nonchr = poison i32 %8 = poison ------------------- SMT STATS ------------------- Num queries: 13 Num invalid: 0 Num skips: 0 Num trivial: 12 (48.0%) Num timeout: 1 (7.7%) Num errors: 0 (0.0%) Num SAT: 6 (46.2%) Num UNSAT: 6 (46.2%)
+ : 'RUN: at line 2' + /home/nlopes/alive2/build/opt-alive.sh -chr -instcombine -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -enable-new-pm=0 + /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/PGOProfile/chr.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/PGOProfile/chr.ll