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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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, ptr %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(ptr %i) {
%entry:
  %0 = load i32, ptr %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, ptr %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(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %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(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %i, align 4
  %.fr2 = freeze i32 %0
  %1 = and i32 %.fr2, 3
  %2 = icmp eq i32 %1, 3
  br i1 %2, label %entry.split, label %entry.split.nonchr

%entry.split.nonchr:
  %3 = and i32 %.fr2, 1
  %.not = icmp eq i32 %3, 0
  %4 = add i32 %sum0, 42
  %sum1.nonchr = select i1 %.not, i32 %sum0, i32 %4
  %5 = and i32 %.fr2, 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 seems to be correct!


----------------------------------------
define i32 @test_chr_5(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %i, align 4
  %1 = and i32 %0, 255
  %2 = icmp eq i32 %1, 0
  br i1 %2, label %bb3, label %bb0

%bb0:
  %3 = and i32 %0, 1
  %4 = icmp eq i32 %3, 0
  %5 = add i32 %sum0, 42
  %sum1 = select i1 %4, i32 %sum0, i32 %5
  %6 = and i32 %0, 2
  %7 = icmp eq i32 %6, 0
  %8 = add i32 %sum1, 43
  %sum2 = select i1 %7, i32 %sum1, i32 %8
  %9 = and i32 %0, 4
  %10 = icmp eq i32 %9, 0
  br i1 %10, label %bb2, label %bb1

%bb1:
  %sum3 = add i32 %sum2, 44
  %11 = and i32 %0, 8
  %12 = icmp eq i32 %11, 0
  %13 = add i32 %sum3, 44
  %sum4 = select i1 %12, i32 %sum3, i32 %13
  br label %bb2

%bb2:
  %sum5 = phi i32 [ %sum2, %bb0 ], [ %sum4, %bb1 ]
  br label %bb3

%bb3:
  %sum6 = phi i32 [ %sum0, %entry ], [ %sum5, %bb2 ]
  ret i32 %sum6
}
=>
define i32 @test_chr_5(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %i, align 4
  %.fr3 = freeze i32 %0
  %1 = and i32 %.fr3, 15
  %2 = icmp eq i32 %1, 15
  br i1 %2, label %bb0, label %entry.split.nonchr

%entry.split.nonchr:
  %3 = and i32 %.fr3, 255
  %.not = icmp eq i32 %3, 0
  br i1 %.not, label %bb3, label %bb0.nonchr

%bb0.nonchr:
  %4 = and i32 %.fr3, 1
  %5 = icmp eq i32 %4, 0
  %6 = add i32 %sum0, 42
  %sum1.nonchr = select i1 %5, i32 %sum0, i32 %6
  %7 = and i32 %.fr3, 2
  %8 = icmp eq i32 %7, 0
  %9 = add i32 %sum1.nonchr, 43
  %sum2.nonchr = select i1 %8, i32 %sum1.nonchr, i32 %9
  %10 = and i32 %.fr3, 4
  %11 = icmp eq i32 %10, 0
  %12 = and i32 %.fr3, 8
  %13 = icmp eq i32 %12, 0
  %sum4.nonchr.v = select i1 %13, i32 44, i32 88
  %sum4.nonchr = add i32 %sum2.nonchr, %sum4.nonchr.v
  %sum5.nonchr = select i1 %11, i32 %sum2.nonchr, i32 %sum4.nonchr
  br label %bb3

%bb0:
  %14 = add i32 %sum0, 85
  %15 = add i32 %sum0, 173
  br label %bb3

%bb3:
  %sum6 = phi i32 [ %15, %bb0 ], [ %sum0, %entry.split.nonchr ], [ %sum5.nonchr, %bb0.nonchr ]
  ret i32 %sum6
}
Transformation seems to be correct!


----------------------------------------
define i32 @test_chr_5_1(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %i, align 4
  %1 = and i32 %0, 255
  %2 = icmp eq i32 %1, 0
  br i1 %2, label %bb3, label %bb0

%bb0:
  %3 = and i32 %0, 1
  %4 = icmp eq i32 %3, 0
  %5 = add i32 %sum0, 42
  %sum1 = select i1 %4, i32 %sum0, i32 %5
  %6 = and i32 %0, 2
  %7 = icmp eq i32 %6, 0
  %8 = add i32 %sum1, 43
  %sum2 = select i1 %7, i32 %sum1, i32 %8
  %9 = and i32 %sum0, 4
  %10 = icmp eq i32 %9, 0
  br i1 %10, label %bb2, label %bb1

%bb1:
  %sum3 = add i32 %sum2, 44
  %11 = and i32 %0, 8
  %12 = icmp eq i32 %11, 0
  %13 = add i32 %sum3, 44
  %sum4 = select i1 %12, i32 %sum3, i32 %13
  br label %bb2

%bb2:
  %sum5 = phi i32 [ %sum2, %bb0 ], [ %sum4, %bb1 ]
  br label %bb3

%bb3:
  %sum6 = phi i32 [ %sum0, %entry ], [ %sum5, %bb2 ]
  ret i32 %sum6
}
=>
define i32 @test_chr_5_1(ptr %i, i32 %sum0) {
%entry:
  %0 = load i32, ptr %i, align 4
  %.fr3 = freeze i32 %0
  %1 = and i32 %sum0, 4
  %2 = icmp ne i32 %1, 0
  %3 = and i32 %.fr3, 11
  %4 = icmp eq i32 %3, 11
  %5 = and i1 %4, %2
  br i1 %5, label %bb0, label %entry.split.nonchr

%entry.split.nonchr:
  %6 = and i32 %.fr3, 255
  %.not = icmp eq i32 %6, 0
  br i1 %.not, label %bb3, label %bb0.nonchr

%bb0.nonchr:
  %7 = and i32 %.fr3, 1
  %8 = icmp eq i32 %7, 0
  %9 = add i32 %sum0, 42
  %sum1.nonchr = select i1 %8, i32 %sum0, i32 %9
  %10 = and i32 %.fr3, 2
  %11 = icmp eq i32 %10, 0
  %12 = add i32 %sum1.nonchr, 43
  %sum2.nonchr = select i1 %11, i32 %sum1.nonchr, i32 %12
  %13 = and i32 %sum0, 4
  %14 = icmp eq i32 %13, 0
  %15 = and i32 %.fr3, 8
  %16 = icmp eq i32 %15, 0
  %sum4.nonchr.v = select i1 %16, i32 44, i32 88
  %sum4.nonchr = add i32 %sum2.nonchr, %sum4.nonchr.v
  %sum5.nonchr = select i1 %14, i32 %sum2.nonchr, i32 %sum4.nonchr
  br label %bb3

%bb0:
  %17 = add i32 %sum0, 85
  %18 = add i32 %sum0, 173
  br label %bb3

%bb3:
  %sum6 = phi i32 [ %18, %bb0 ], [ %sum0, %entry.split.nonchr ], [ %sum5.nonchr, %bb0.nonchr ]
  ret i32 %sum6
}
Transformation doesn't verify!
ERROR: Source is more defined than target

Example:
ptr %i = pointer(non-local, block_id=1, offset=0)
i32 %sum0 = poison

Source:
i32 %0 = #x00000000 (0)
i32 %1 = #x00000000 (0)
i1 %2 = #x1 (1)
  >> Jump to %bb3
i32 %sum6 = poison

SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 >	size: 0	align: 4	alloc type: 0
Block 1 >	size: 4	align: 4	alloc type: 0

Target:
i32 %0 = #x00000000 (0)
i32 %.fr3 = #x00000000 (0)
i32 %1 = poison
i1 %2 = poison
i32 %3 = #x00000000 (0)
i1 %4 = #x0 (0)
i1 %5 = poison
UB triggered on br



------------------- SMT STATS -------------------
Num queries: 40
Num invalid: 0
Num skips:   0
Num trivial: 21 (34.4%)
Num timeout: 1 (2.5%)
Num errors:  0 (0.0%)
Num SAT:     22 (55.0%)
Num UNSAT:   17 (42.5%)
Alive2: Transform doesn't verify; aborting!

stderr:

+ : 'RUN: at line 2'
+ /home/nlopes/llvm/build/bin/FileCheck /home/nlopes/llvm/llvm/test/Transforms/PGOProfile/chr.ll
+ /home/nlopes/alive2/build/opt-alive.sh -chr -instcombine -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -enable-new-pm=0

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

 

<-- Back