Test Failure: Transforms/PGOProfile/chr.ll

Test source: git

Log:

Source: <stdin>
ERROR: Unsupported instruction:   indirectbr i8* %pc, [label %bb3, label %bb3]
ERROR: Unsupported instruction:   indirectbr i8* %pc, [label %bb5, label %bb5]

----------------------------------------
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
  br label %common.ret

%entry.split:
  %8 = add i32 %sum0, 85
  br label %common.ret

%common.ret:
  %common.ret.op = phi i32 [ %8, %entry.split ], [ %sum2.nonchr, %entry.split.nonchr ]
  ret i32 %common.ret.op
}
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: 256	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
i32 %common.ret.op = poison



------------------- SMT STATS -------------------
Num queries: 17
Num invalid: 0
Num skips:   0
Num trivial: 15 (46.9%)
Num timeout: 1 (5.9%)
Num errors:  0 (0.0%)
Num SAT:     10 (58.8%)
Num UNSAT:   6 (35.3%)
Alive2: Transform doesn't verify; aborting!

stderr:

+ : '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

FileCheck error: '<stdin>' is empty.
FileCheck command line:  /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/PGOProfile/chr.ll

 

<-- Back