Test source: git
Source: <stdin>
-- 1. ModuleToFunctionPassAdaptor
ERROR: Unsupported instruction: %y = load atomic i32, ptr %atomic_ptr acquire, align 4
-- 1. PassManager<Function> : Skipping NOP
-- 2. InstCombinePass
----------------------------------------
define i32 @test1(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB2:
ret i32 %A
BB1:
%B = phi i32 [ %A, %BB0 ]
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 3. InstCombinePass
----------------------------------------
define i32 @test1(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB2:
ret i32 %A
BB1:
%B = phi i32 [ %A, %BB0 ]
ret i32 %B
}
=>
define i32 @test1(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB2:
ret i32 %A
BB1:
ret i32 %A
}
Transformation seems to be correct!
-- 4. PassManager<Function> : Skipping NOP
-- 5. PassManager<Function> : Skipping NOP
-- 6. InstCombinePass
----------------------------------------
define i32 @test2(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
%B = phi i32 [ %A, %BB0 ], [ %A, %BB1 ]
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 7. InstCombinePass
----------------------------------------
define i32 @test2(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
%B = phi i32 [ %A, %BB0 ], [ %A, %BB1 ]
ret i32 %B
}
=>
define i32 @test2(i32 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
ret i32 %A
}
Transformation seems to be correct!
-- 8. PassManager<Function> : Skipping NOP
-- 9. PassManager<Function> : Skipping NOP
-- 10. InstCombinePass
----------------------------------------
define i32 @test3(i32 %A, i1 %b) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %B, %Loop ]
br i1 %b, label %Loop, label %Exit
Exit:
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 11. InstCombinePass
----------------------------------------
define i32 @test3(i32 %A, i1 %b) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %B, %Loop ]
br i1 %b, label %Loop, label %Exit
Exit:
ret i32 %B
}
=>
define i32 @test3(i32 %A, i1 %b) {
BB0:
br label %Loop
Loop:
br i1 %b, label %Loop, label %Exit
Exit:
ret i32 %A
}
Transformation seems to be correct!
-- 12. PassManager<Function> : Skipping NOP
-- 13. PassManager<Function> : Skipping NOP
-- 14. InstCombinePass
----------------------------------------
define i32 @test4(i1 %b) {
BB0:
ret i32 7
Loop:
%B = phi i32 [ %B, %L2 ], [ %B, %Loop ]
br i1 %b, label %L2, label %Loop
L2:
br label %Loop
}
Transformation seems to be correct! (syntactically equal)
-- 15. InstCombinePass
----------------------------------------
define i32 @test4(i1 %b) {
BB0:
ret i32 7
}
=>
define i32 @test4(i1 %b) {
BB0:
ret i32 7
}
Transformation seems to be correct!
-- 16. PassManager<Function> : Skipping NOP
-- 17. PassManager<Function> : Skipping NOP
-- 18. InstCombinePass
----------------------------------------
define i32 @test5_undef(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ undef, %Loop ]
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 19. InstCombinePass
----------------------------------------
define i32 @test5_undef(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ undef, %Loop ]
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 20. PassManager<Function> : Skipping NOP
-- 21. PassManager<Function> : Skipping NOP
-- 22. InstCombinePass
----------------------------------------
define i32 @test5_poison(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ poison, %Loop ]
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 %B
}
Transformation seems to be correct! (syntactically equal)
-- 23. InstCombinePass
----------------------------------------
define i32 @test5_poison(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ poison, %Loop ]
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 %B
}
=>
define i32 @test5_poison(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 %A
}
Transformation seems to be correct!
-- 24. PassManager<Function> : Skipping NOP
-- 25. PassManager<Function> : Skipping NOP
-- 26. InstCombinePass
----------------------------------------
define i32 @test6(i16 %A, i1 %b) {
BB0:
%X = zext i16 %A to i32
br i1 %b, label %BB1, label %BB2
BB1:
%Y = zext i16 %A to i32
br label %BB2
BB2:
%c = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
ret i32 %c
}
Transformation seems to be correct! (syntactically equal)
-- 27. InstCombinePass
----------------------------------------
define i32 @test6(i16 %A, i1 %b) {
BB0:
%X = zext i16 %A to i32
br i1 %b, label %BB1, label %BB2
BB1:
%Y = zext i16 %A to i32
br label %BB2
BB2:
%c = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
ret i32 %c
}
=>
define i32 @test6(i16 %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
%c = zext i16 %A to i32
ret i32 %c
}
Transformation seems to be correct!
-- 28. PassManager<Function> : Skipping NOP
-- 29. PassManager<Function> : Skipping NOP
-- 30. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]
%C = add i32 %B, 123
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 31. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]
%C = add i32 %B, 123
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
=>
define i32 @test_dead_cycle(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct!
-- 32. PassManager<Function> : Skipping NOP
-- 33. PassManager<Function> : Skipping NOP
-- 34. InstCombinePass
----------------------------------------
define i32 @test_dead_UnaryOp_cycle(double %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi double [ %A, %BB0 ], [ %C, %Loop ]
%C = fneg double %B
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 35. InstCombinePass
----------------------------------------
define i32 @test_dead_UnaryOp_cycle(double %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi double [ %A, %BB0 ], [ %C, %Loop ]
%C = fneg double %B
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
=>
define i32 @test_dead_UnaryOp_cycle(double %A, i1 %cond) {
BB0:
br label %Loop
Loop:
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct!
-- 36. PassManager<Function> : Skipping NOP
-- 37. PassManager<Function> : Skipping NOP
-- 38. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle_two_insts(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %D, %Loop ]
%C = add i32 %B, 123
%D = lshr i32 %C, 1
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 39. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle_two_insts(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %D, %Loop ]
%C = add i32 %B, 123
%D = lshr i32 %C, 1
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 40. PassManager<Function> : Skipping NOP
-- 41. PassManager<Function> : Skipping NOP
-- 42. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle_intrin(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]
%C = uadd_sat i32 %B, 123
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 43. InstCombinePass
----------------------------------------
define i32 @test_dead_cycle_intrin(i32 %A, i1 %cond) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ %C, %Loop ]
%C = uadd_sat i32 %B, 123
br i1 %cond, label %Loop, label %Exit
Exit:
ret i32 0
}
Transformation seems to be correct! (syntactically equal)
-- 44. PassManager<Function> : Skipping NOP
-- 45. PassManager<Function> : Skipping NOP
-- 46. InstCombinePass
----------------------------------------
define ptr @test8(ptr %A, i1 %b) {
BB0:
%X = gep inbounds ptr %A, 8 x i32 0, 1 x i64 4
br i1 %b, label %BB1, label %BB2
BB1:
%Y = gep ptr %A, 8 x i32 0, 1 x i64 4
br label %BB2
BB2:
%c = phi ptr [ %X, %BB0 ], [ %Y, %BB1 ]
ret ptr %c
}
Transformation seems to be correct! (syntactically equal)
-- 47. InstCombinePass
----------------------------------------
define ptr @test8(ptr %A, i1 %b) {
BB0:
%X = gep inbounds ptr %A, 8 x i32 0, 1 x i64 4
br i1 %b, label %BB1, label %BB2
BB1:
%Y = gep ptr %A, 8 x i32 0, 1 x i64 4
br label %BB2
BB2:
%c = phi ptr [ %X, %BB0 ], [ %Y, %BB1 ]
ret ptr %c
}
=>
define ptr @test8(ptr %A, i1 %b) {
BB0:
br i1 %b, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
%c = gep ptr %A, 1 x i64 4
ret ptr %c
}
Transformation seems to be correct!
-- 48. PassManager<Function> : Skipping NOP
-- 49. PassManager<Function> : Skipping NOP
-- 50. InstCombinePass
----------------------------------------
define i32 @test9(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
%C = load i32, ptr %B, align 1
br label %bb2
bb1:
%D = load i32, ptr %A, align 1
br label %bb2
bb2:
%E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
ret i32 %E
}
Transformation seems to be correct! (syntactically equal)
-- 51. InstCombinePass
----------------------------------------
define i32 @test9(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
%C = load i32, ptr %B, align 1
br label %bb2
bb1:
%D = load i32, ptr %A, align 1
br label %bb2
bb2:
%E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
ret i32 %E
}
=>
define i32 @test9(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
br label %bb2
bb1:
br label %bb2
bb2:
%E.in = phi ptr [ %B, %bb ], [ %A, %bb1 ]
%E = load i32, ptr %E.in, align 1
ret i32 %E
}
Transformation seems to be correct!
-- 52. PassManager<Function> : Skipping NOP
-- 53. PassManager<Function> : Skipping NOP
-- 54. InstCombinePass
----------------------------------------
define i32 @test10(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
%C = load i32, ptr %B, align 16
br label %bb2
bb1:
%D = load i32, ptr %A, align 32
br label %bb2
bb2:
%E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
ret i32 %E
}
Transformation seems to be correct! (syntactically equal)
-- 55. InstCombinePass
----------------------------------------
define i32 @test10(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
%C = load i32, ptr %B, align 16
br label %bb2
bb1:
%D = load i32, ptr %A, align 32
br label %bb2
bb2:
%E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
ret i32 %E
}
=>
define i32 @test10(ptr %A, ptr %B) {
entry:
%c = icmp eq ptr %A, null
br i1 %c, label %bb1, label %bb
bb:
br label %bb2
bb1:
br label %bb2
bb2:
%E.in = phi ptr [ %B, %bb ], [ %A, %bb1 ]
%E = load i32, ptr %E.in, align 16
ret i32 %E
}
Transformation seems to be correct!
-- 56. PassManager<Function> : Skipping NOP
-- 57. PassManager<Function> : Skipping NOP
-- 58. InstCombinePass
----------------------------------------
declare i1 @test11a()
define i1 @test11() {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test11a()
br i1 %b, label %one, label %two
one:
%x = phi i64 [ %i, %entry ], [ %y, %two ]
%c = call i1 @test11a()
br i1 %c, label %two, label %end
two:
%y = phi i64 [ %i, %entry ], [ %x, %one ]
%d = call i1 @test11a()
br i1 %d, label %one, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test11a()
ret i1 %z
}
Transformation seems to be correct! (syntactically equal)
-- 59. InstCombinePass
----------------------------------------
declare i1 @test11a()
define i1 @test11() {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test11a()
br i1 %b, label %one, label %two
one:
%x = phi i64 [ %i, %entry ], [ %y, %two ]
%c = call i1 @test11a()
br i1 %c, label %two, label %end
two:
%y = phi i64 [ %i, %entry ], [ %x, %one ]
%d = call i1 @test11a()
br i1 %d, label %one, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test11a()
ret i1 %z
}
=>
declare i1 @test11a()
define i1 @test11() {
entry:
%b = call i1 @test11a()
br i1 %b, label %one, label %two
one:
%c = call i1 @test11a()
br i1 %c, label %two, label %end
two:
%d = call i1 @test11a()
br i1 %d, label %one, label %end
end:
%z = call i1 @test11a()
ret i1 %z
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 60. PassManager<Function> : Skipping NOP
-- 61. PassManager<Function> : Skipping NOP
-- 62. InstCombinePass
----------------------------------------
define i64 @test12(i1 %cond, ptr %Ptr, i64 %Val) {
entry:
%t41 = ptrtoint ptr %Ptr to i64
%t42 = zext i64 %t41 to i128
br i1 %cond, label %end, label %two
two:
%t36 = zext i64 %Val to i128
%t37 = shl i128 %t36, 64
%ins39 = or i128 %t42, %t37
br label %end
end:
%t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]
%t32 = trunc i128 %t869.0 to i64
%t29 = lshr i128 %t869.0, 64
%t30 = trunc i128 %t29 to i64
%t2 = add i64 %t32, %t30
ret i64 %t2
}
Transformation seems to be correct! (syntactically equal)
-- 63. InstCombinePass
----------------------------------------
define i64 @test12(i1 %cond, ptr %Ptr, i64 %Val) {
entry:
%t41 = ptrtoint ptr %Ptr to i64
%t42 = zext i64 %t41 to i128
br i1 %cond, label %end, label %two
two:
%t36 = zext i64 %Val to i128
%t37 = shl i128 %t36, 64
%ins39 = or i128 %t42, %t37
br label %end
end:
%t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]
%t32 = trunc i128 %t869.0 to i64
%t29 = lshr i128 %t869.0, 64
%t30 = trunc i128 %t29 to i64
%t2 = add i64 %t32, %t30
ret i64 %t2
}
=>
define i64 @test12(i1 %cond, ptr %Ptr, i64 %Val) {
entry:
br i1 %cond, label %end, label %two
two:
br label %end
end:
%t869.0.off64 = phi i64 [ 0, %entry ], [ %Val, %two ]
%t41 = ptrtoint ptr %Ptr to i64
%t2 = add i64 %t869.0.off64, %t41
ret i64 %t2
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 64. PassManager<Function> : Skipping NOP
-- 65. PassManager<Function> : Skipping NOP
-- 66. InstCombinePass
----------------------------------------
declare void @test13f(double, i32)
define void @test13(i1 %cond, i32 %V1, double %Vald) {
entry:
%t42 = zext i32 %V1 to i128
br i1 %cond, label %end, label %two
two:
%Val = bitcast double %Vald to i64
%t36 = zext i64 %Val to i128
%t37 = shl i128 %t36, 64
%ins39 = or i128 %t42, %t37
br label %end
end:
%t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]
%t32 = trunc i128 %t869.0 to i32
%t29 = lshr i128 %t869.0, 64
%t30 = trunc i128 %t29 to i64
%t31 = bitcast i64 %t30 to double
call void @test13f(double %t31, i32 %t32)
ret void
}
Transformation seems to be correct! (syntactically equal)
-- 67. InstCombinePass
----------------------------------------
declare void @test13f(double, i32)
define void @test13(i1 %cond, i32 %V1, double %Vald) {
entry:
%t42 = zext i32 %V1 to i128
br i1 %cond, label %end, label %two
two:
%Val = bitcast double %Vald to i64
%t36 = zext i64 %Val to i128
%t37 = shl i128 %t36, 64
%ins39 = or i128 %t42, %t37
br label %end
end:
%t869.0 = phi i128 [ %t42, %entry ], [ %ins39, %two ]
%t32 = trunc i128 %t869.0 to i32
%t29 = lshr i128 %t869.0, 64
%t30 = trunc i128 %t29 to i64
%t31 = bitcast i64 %t30 to double
call void @test13f(double %t31, i32 %t32)
ret void
}
=>
declare void @test13f(double, i32)
define void @test13(i1 %cond, i32 %V1, double %Vald) {
entry:
br i1 %cond, label %end, label %two
two:
br label %end
end:
%t31 = phi double [ 0.000000, %entry ], [ %Vald, %two ]
call void @test13f(double %t31, i32 %V1)
ret void
}
Transformation seems to be correct!
-- 68. PassManager<Function> : Skipping NOP
-- 69. PassManager<Function> : Skipping NOP
-- 70. InstCombinePass
----------------------------------------
define i640 @test14a(i320 %A, i320 %B, i1 %b1) {
BB0:
%a = zext i320 %A to i640
%b = zext i320 %B to i640
br label %Loop
Loop:
%C = phi i640 [ %a, %BB0 ], [ %b, %Loop ]
br i1 %b1, label %Loop, label %Exit
Exit:
ret i640 %C
}
Transformation seems to be correct! (syntactically equal)
-- 71. InstCombinePass
----------------------------------------
define i640 @test14a(i320 %A, i320 %B, i1 %b1) {
BB0:
%a = zext i320 %A to i640
%b = zext i320 %B to i640
br label %Loop
Loop:
%C = phi i640 [ %a, %BB0 ], [ %b, %Loop ]
br i1 %b1, label %Loop, label %Exit
Exit:
ret i640 %C
}
=>
define i640 @test14a(i320 %A, i320 %B, i1 %b1) {
BB0:
br label %Loop
Loop:
%C.in = phi i320 [ %A, %BB0 ], [ %B, %Loop ]
br i1 %b1, label %Loop, label %Exit
Exit:
%C = zext i320 %C.in to i640
ret i640 %C
}
Transformation seems to be correct!
-- 72. PassManager<Function> : Skipping NOP
-- 73. PassManager<Function> : Skipping NOP
-- 74. InstCombinePass
----------------------------------------
define i160 @test14b(i320 %pA, i320 %pB, i1 %b1) {
BB0:
%a = trunc i320 %pA to i160
%b = trunc i320 %pB to i160
br label %Loop
Loop:
%C = phi i160 [ %a, %BB0 ], [ %b, %Loop ]
br i1 %b1, label %Loop, label %Exit
Exit:
ret i160 %C
}
Transformation seems to be correct! (syntactically equal)
-- 75. InstCombinePass
----------------------------------------
define i160 @test14b(i320 %pA, i320 %pB, i1 %b1) {
BB0:
%a = trunc i320 %pA to i160
%b = trunc i320 %pB to i160
br label %Loop
Loop:
%C = phi i160 [ %a, %BB0 ], [ %b, %Loop ]
br i1 %b1, label %Loop, label %Exit
Exit:
ret i160 %C
}
Transformation seems to be correct! (syntactically equal)
-- 76. PassManager<Function> : Skipping NOP
-- 77. PassManager<Function> : Skipping NOP
-- 78. InstCombinePass
----------------------------------------
declare i64 @test15a(i64)
define i64 @test15b(i64 %A, i1 %b) {
entry:
%i0 = zext i64 %A to i128
%i1 = shl i128 %i0, 64
%i = or i128 %i1, %i0
br i1 %b, label %one, label %two
one:
%x = phi i128 [ %i, %entry ], [ %y, %two ]
%x1 = lshr i128 %x, 64
%x2 = trunc i128 %x1 to i64
%c = call i64 @test15a(i64 %x2)
%c1 = zext i64 %c to i128
br label %two
two:
%y = phi i128 [ %i, %entry ], [ %c1, %one ]
%y1 = lshr i128 %y, 64
%y2 = trunc i128 %y1 to i64
%d = call i64 @test15a(i64 %y2)
%d1 = trunc i64 %d to i1
br i1 %d1, label %one, label %end
end:
%g = trunc i128 %y to i64
ret i64 %g
}
Transformation seems to be correct! (syntactically equal)
-- 79. InstCombinePass
----------------------------------------
declare i64 @test15a(i64)
define i64 @test15b(i64 %A, i1 %b) {
entry:
%i0 = zext i64 %A to i128
%i1 = shl i128 %i0, 64
%i = or i128 %i1, %i0
br i1 %b, label %one, label %two
one:
%x = phi i128 [ %i, %entry ], [ %y, %two ]
%x1 = lshr i128 %x, 64
%x2 = trunc i128 %x1 to i64
%c = call i64 @test15a(i64 %x2)
%c1 = zext i64 %c to i128
br label %two
two:
%y = phi i128 [ %i, %entry ], [ %c1, %one ]
%y1 = lshr i128 %y, 64
%y2 = trunc i128 %y1 to i64
%d = call i64 @test15a(i64 %y2)
%d1 = trunc i64 %d to i1
br i1 %d1, label %one, label %end
end:
%g = trunc i128 %y to i64
ret i64 %g
}
=>
declare i64 @test15a(i64)
define i64 @test15b(i64 %A, i1 %b) {
entry:
br i1 %b, label %one, label %two
one:
%x.off64 = phi i64 [ %A, %entry ], [ %y.off64, %two ]
%c = call i64 @test15a(i64 %x.off64)
br label %two
two:
%y.off0 = phi i64 [ %A, %entry ], [ %c, %one ]
%y.off64 = phi i64 [ %A, %entry ], [ 0, %one ]
%d = call i64 @test15a(i64 %y.off64)
%d1 = trunc i64 %d to i1
br i1 %d1, label %one, label %end
end:
ret i64 %y.off0
}
Transformation seems to be correct!
-- 80. PassManager<Function> : Skipping NOP
-- 81. PassManager<Function> : Skipping NOP
-- 82. InstCombinePass
-- 83. InstCombinePass
-- 84. PassManager<Function> : Skipping NOP
-- 85. PassManager<Function> : Skipping NOP
-- 86. InstCombinePass
----------------------------------------
declare i32 @ext()
define i32 @test17(i1 %a) {
entry:
br i1 %a, label %bb1, label %bb2
bb1:
%#0 = tail call i32 @ext()
br label %bb2
bb2:
%cond = phi i1 [ 1, %bb1 ], [ 0, %entry ]
%val = phi i32 [ %#0, %bb1 ], [ 0, %entry ]
%res = select i1 %cond, i32 %val, i32 0
ret i32 %res
}
Transformation seems to be correct! (syntactically equal)
-- 87. InstCombinePass
----------------------------------------
declare i32 @ext()
define i32 @test17(i1 %a) {
entry:
br i1 %a, label %bb1, label %bb2
bb1:
%#0 = tail call i32 @ext()
br label %bb2
bb2:
%cond = phi i1 [ 1, %bb1 ], [ 0, %entry ]
%val = phi i32 [ %#0, %bb1 ], [ 0, %entry ]
%res = select i1 %cond, i32 %val, i32 0
ret i32 %res
}
=>
declare i32 @ext()
define i32 @test17(i1 %a) {
entry:
br i1 %a, label %bb1, label %bb2
bb1:
%#0 = tail call i32 @ext()
br label %bb2
bb2:
%res = phi i32 [ %#0, %bb1 ], [ 0, %entry ]
ret i32 %res
}
Transformation seems to be correct!
-- 88. PassManager<Function> : Skipping NOP
-- 89. PassManager<Function> : Skipping NOP
ERROR: Unsupported instruction: %y = load atomic i32, ptr %atomic_ptr acquire, align 4
-- 90. InstCombinePass
ERROR: Unsupported instruction: %y = load atomic i32, ptr %atomic_ptr acquire, align 4
-- 91. InstCombinePass
ERROR: Unsupported instruction: %y = load atomic i32, ptr %atomic_ptr acquire, align 4
-- 92. PassManager<Function> : Skipping NOP
ERROR: Unsupported instruction: %y = load atomic i32, ptr %atomic_ptr acquire, align 4
-- 93. PassManager<Function> : Skipping NOP
-- 94. InstCombinePass
----------------------------------------
define i1 @test18(i1 %cond) {
#0:
%zero = alloca i64 4, align 4
%one = alloca i64 4, align 4
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%ptr = phi ptr [ %zero, %true ], [ %one, %false ]
%isnull = icmp eq ptr %ptr, null
ret i1 %isnull
}
Transformation seems to be correct! (syntactically equal)
-- 95. InstCombinePass
----------------------------------------
define i1 @test18(i1 %cond) {
#0:
%zero = alloca i64 4, align 4
%one = alloca i64 4, align 4
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%ptr = phi ptr [ %zero, %true ], [ %one, %false ]
%isnull = icmp eq ptr %ptr, null
ret i1 %isnull
}
=>
define i1 @test18(i1 %cond) {
#0:
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
ret i1 0
}
Transformation seems to be correct!
-- 96. PassManager<Function> : Skipping NOP
-- 97. PassManager<Function> : Skipping NOP
-- 98. InstCombinePass
----------------------------------------
define i1 @test19(i1 %cond, double %x) {
#0:
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%p = phi double [ %x, %true ], [ inf, %false ]
%cmp = fcmp ule double %x, %p
ret i1 %cmp
}
Transformation seems to be correct! (syntactically equal)
-- 99. InstCombinePass
----------------------------------------
define i1 @test19(i1 %cond, double %x) {
#0:
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%p = phi double [ %x, %true ], [ inf, %false ]
%cmp = fcmp ule double %x, %p
ret i1 %cmp
}
=>
define i1 @test19(i1 %cond, double %x) {
#0:
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
ret i1 1
}
Transformation seems to be correct!
-- 100. PassManager<Function> : Skipping NOP
-- 101. PassManager<Function> : Skipping NOP
-- 102. InstCombinePass
----------------------------------------
define i1 @test20(i1 %cond) {
#0:
%a = alloca i64 4, align 4
%b = alloca i64 4, align 4
%c = alloca i64 4, align 4
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%p = phi ptr [ %a, %true ], [ %b, %false ]
%r = icmp eq ptr %p, %c
ret i1 %r
}
Transformation seems to be correct! (syntactically equal)
-- 103. InstCombinePass
----------------------------------------
define i1 @test20(i1 %cond) {
#0:
%a = alloca i64 4, align 4
%b = alloca i64 4, align 4
%c = alloca i64 4, align 4
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
%p = phi ptr [ %a, %true ], [ %b, %false ]
%r = icmp eq ptr %p, %c
ret i1 %r
}
=>
define i1 @test20(i1 %cond) {
#0:
br i1 %cond, label %true, label %false
false:
br label %ret
true:
br label %ret
ret:
ret i1 0
}
Transformation seems to be correct!
-- 104. PassManager<Function> : Skipping NOP
-- 105. PassManager<Function> : Skipping NOP
-- 106. InstCombinePass
----------------------------------------
define i1 @test21(i1 %c1, i1 %c2) {
#0:
%a = alloca i64 4, align 4
%b = alloca i64 4, align 4
%c = alloca i64 4, align 4
br i1 %c1, label %true, label %false
false:
br label %loop
true:
br label %loop
loop:
%p = phi ptr [ %a, %true ], [ %b, %false ], [ %p, %loop ]
%r = icmp eq ptr %p, %c
br i1 %c2, label %ret, label %loop
ret:
ret i1 %r
}
Transformation seems to be correct! (syntactically equal)
-- 107. InstCombinePass
----------------------------------------
define i1 @test21(i1 %c1, i1 %c2) {
#0:
%a = alloca i64 4, align 4
%b = alloca i64 4, align 4
%c = alloca i64 4, align 4
br i1 %c1, label %true, label %false
false:
br label %loop
true:
br label %loop
loop:
%p = phi ptr [ %a, %true ], [ %b, %false ], [ %p, %loop ]
%r = icmp eq ptr %p, %c
br i1 %c2, label %ret, label %loop
ret:
ret i1 %r
}
=>
define i1 @test21(i1 %c1, i1 %c2) {
#0:
br i1 %c1, label %true, label %false
false:
br label %loop
true:
br label %loop
loop:
br i1 %c2, label %ret, label %loop
ret:
ret i1 0
}
Transformation seems to be correct!
-- 108. PassManager<Function> : Skipping NOP
-- 109. PassManager<Function> : Skipping NOP
-- 110. InstCombinePass
----------------------------------------
define void @test22() {
entry:
br label %loop
loop:
%phi = phi i32 [ 0, %entry ], [ %y, %loop ]
%y = add i32 %phi, 1
%o = or i32 %y, %phi
%e = icmp eq i32 %o, %y
br i1 %e, label %loop, label %ret
ret:
ret void
}
Transformation seems to be correct! (syntactically equal)
-- 111. InstCombinePass
----------------------------------------
define void @test22() {
entry:
br label %loop
loop:
%phi = phi i32 [ 0, %entry ], [ %y, %loop ]
%y = add i32 %phi, 1
%o = or i32 %y, %phi
%e = icmp eq i32 %o, %y
br i1 %e, label %loop, label %ret
ret:
ret void
}
Transformation seems to be correct! (syntactically equal)
-- 112. PassManager<Function> : Skipping NOP
-- 113. PassManager<Function> : Skipping NOP
-- 114. InstCombinePass
----------------------------------------
define i32 @test23(i32 %A, i1 %pb, ptr %P) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ 42, %Loop ]
%D = add i32 %B, 19
store i32 %D, ptr %P, align 4
br i1 %pb, label %Loop, label %Exit
Exit:
%E = add i32 %B, 19
ret i32 %E
}
Transformation seems to be correct! (syntactically equal)
-- 115. InstCombinePass
----------------------------------------
define i32 @test23(i32 %A, i1 %pb, ptr %P) {
BB0:
br label %Loop
Loop:
%B = phi i32 [ %A, %BB0 ], [ 42, %Loop ]
%D = add i32 %B, 19
store i32 %D, ptr %P, align 4
br i1 %pb, label %Loop, label %Exit
Exit:
%E = add i32 %B, 19
ret i32 %E
}
=>
define i32 @test23(i32 %A, i1 %pb, ptr %P) {
BB0:
%#0 = add i32 %A, 19
br label %Loop
Loop:
%B = phi i32 [ %#0, %BB0 ], [ 61, %Loop ]
store i32 %B, ptr %P, align 4
br i1 %pb, label %Loop, label %Exit
Exit:
ret i32 %B
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 116. PassManager<Function> : Skipping NOP
-- 117. PassManager<Function> : Skipping NOP
-- 118. InstCombinePass
----------------------------------------
define i32 @test24(i32 %A, i1 %cond) {
BB0:
%X = add nsw nuw i32 %A, 1
br i1 %cond, label %BB1, label %BB2
BB1:
%Y = add nuw i32 %A, 1
br label %BB2
BB2:
%C = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
ret i32 %C
}
Transformation seems to be correct! (syntactically equal)
-- 119. InstCombinePass
----------------------------------------
define i32 @test24(i32 %A, i1 %cond) {
BB0:
%X = add nsw nuw i32 %A, 1
br i1 %cond, label %BB1, label %BB2
BB1:
%Y = add nuw i32 %A, 1
br label %BB2
BB2:
%C = phi i32 [ %X, %BB0 ], [ %Y, %BB1 ]
ret i32 %C
}
=>
define i32 @test24(i32 %A, i1 %cond) {
BB0:
br i1 %cond, label %BB1, label %BB2
BB1:
br label %BB2
BB2:
%C = add nuw i32 %A, 1
ret i32 %C
}
Transformation seems to be correct!
-- 120. PassManager<Function> : Skipping NOP
-- 121. PassManager<Function> : Skipping NOP
-- 122. InstCombinePass
----------------------------------------
declare i1 @test25a()
define i1 @test25() {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test25a()
br i1 %b, label %one, label %two
one:
%x = phi i64 [ %y, %two ], [ %i, %entry ]
%c = call i1 @test25a()
br i1 %c, label %two, label %end
two:
%y = phi i64 [ %x, %one ], [ %i, %entry ]
%d = call i1 @test25a()
br i1 %d, label %one, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test25a()
ret i1 %z
}
Transformation seems to be correct! (syntactically equal)
-- 123. InstCombinePass
----------------------------------------
declare i1 @test25a()
define i1 @test25() {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test25a()
br i1 %b, label %one, label %two
one:
%x = phi i64 [ %y, %two ], [ %i, %entry ]
%c = call i1 @test25a()
br i1 %c, label %two, label %end
two:
%y = phi i64 [ %x, %one ], [ %i, %entry ]
%d = call i1 @test25a()
br i1 %d, label %one, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test25a()
ret i1 %z
}
=>
declare i1 @test25a()
define i1 @test25() {
entry:
%b = call i1 @test25a()
br i1 %b, label %one, label %two
one:
%c = call i1 @test25a()
br i1 %c, label %two, label %end
two:
%d = call i1 @test25a()
br i1 %d, label %one, label %end
end:
%z = call i1 @test25a()
ret i1 %z
}
Transformation seems to be correct!
-- 124. PassManager<Function> : Skipping NOP
-- 125. PassManager<Function> : Skipping NOP
-- 126. InstCombinePass
----------------------------------------
declare i1 @test25a()
define i1 @test25b(i1 %ci, i64 %ai, i64 %bi) {
entry:
br i1 %ci, label %then, label %else
then:
br label %else
else:
%i = phi i64 [ %ai, %entry ], [ %bi, %then ]
%b = call i1 @test25a()
br i1 %b, label %one, label %two
two:
%y = phi i64 [ %x, %one ], [ %i, %else ]
%d = call i1 @test25a()
br i1 %d, label %one, label %end
one:
%x = phi i64 [ %y, %two ], [ %i, %else ]
%c = call i1 @test25a()
br i1 %c, label %two, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test25a()
ret i1 %z
}
Transformation seems to be correct! (syntactically equal)
-- 127. InstCombinePass
----------------------------------------
declare i1 @test25a()
define i1 @test25b(i1 %ci, i64 %ai, i64 %bi) {
entry:
br i1 %ci, label %then, label %else
then:
br label %else
else:
%i = phi i64 [ %ai, %entry ], [ %bi, %then ]
%b = call i1 @test25a()
br i1 %b, label %one, label %two
two:
%y = phi i64 [ %x, %one ], [ %i, %else ]
%d = call i1 @test25a()
br i1 %d, label %one, label %end
one:
%x = phi i64 [ %y, %two ], [ %i, %else ]
%c = call i1 @test25a()
br i1 %c, label %two, label %end
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test25a()
ret i1 %z
}
=>
declare i1 @test25a()
define i1 @test25b(i1 %ci, i64 %ai, i64 %bi) {
entry:
br i1 %ci, label %then, label %else
then:
br label %else
else:
%i = phi i64 [ %ai, %entry ], [ %bi, %then ]
%b = call i1 @test25a()
br i1 %b, label %one, label %two
two:
%d = call i1 @test25a()
br i1 %d, label %one, label %end
one:
%c = call i1 @test25a()
br i1 %c, label %two, label %end
end:
%g = int2ptr i64 %i to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test25a()
ret i1 %z
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 128. PassManager<Function> : Skipping NOP
-- 129. PassManager<Function> : Skipping NOP
-- 130. InstCombinePass
----------------------------------------
declare i1 @test26a()
define i1 @test26(i32 %n) {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test26a()
br label %one
one:
%x = phi i64 [ %y, %two ], [ %w, %three ], [ %i, %entry ]
%c = call i1 @test26a()
switch i32 %n, label %end [
i32 2, label %two
i32 3, label %three
]
three:
%w = phi i64 [ %y, %two ], [ %x, %one ]
%e = call i1 @test26a()
br i1 %e, label %one, label %two
two:
%y = phi i64 [ %x, %one ], [ %w, %three ]
%d = call i1 @test26a()
switch i32 %n, label %end [
i32 10, label %one
i32 30, label %three
]
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test26a()
ret i1 %z
}
Transformation seems to be correct! (syntactically equal)
-- 131. InstCombinePass
----------------------------------------
declare i1 @test26a()
define i1 @test26(i32 %n) {
entry:
%a = alloca i64 4, align 4
%i = ptrtoint ptr %a to i64
%b = call i1 @test26a()
br label %one
one:
%x = phi i64 [ %y, %two ], [ %w, %three ], [ %i, %entry ]
%c = call i1 @test26a()
switch i32 %n, label %end [
i32 2, label %two
i32 3, label %three
]
three:
%w = phi i64 [ %y, %two ], [ %x, %one ]
%e = call i1 @test26a()
br i1 %e, label %one, label %two
two:
%y = phi i64 [ %x, %one ], [ %w, %three ]
%d = call i1 @test26a()
switch i32 %n, label %end [
i32 10, label %one
i32 30, label %three
]
end:
%f = phi i64 [ %x, %one ], [ %y, %two ]
%g = int2ptr i64 %f to ptr
store i32 10, ptr %g, align 4
%z = call i1 @test26a()
ret i1 %z
}
=>
declare i1 @test26a()
define i1 @test26(i32 %n) {
entry:
%b = call i1 @test26a()
br label %one
one:
%c = call i1 @test26a()
switch i32 %n, label %end [
i32 2, label %two
i32 3, label %three
]
three:
%e = call i1 @test26a()
br i1 %e, label %one, label %two
two:
%d = call i1 @test26a()
switch i32 %n, label %end [
i32 10, label %one
i32 30, label %three
]
end:
%z = call i1 @test26a()
ret i1 %z
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 132. PassManager<Function> : Skipping NOP
-- 133. PassManager<Function> : Skipping NOP
-- 134. InstCombinePass
----------------------------------------
define i32 @test27(i1 %b) {
entry:
br label %done
done:
%y = phi i32 [ undef, %entry ]
ret i32 %y
}
Transformation seems to be correct! (syntactically equal)
-- 135. InstCombinePass
----------------------------------------
define i32 @test27(i1 %b) {
entry:
br label %done
done:
%y = phi i32 [ undef, %entry ]
ret i32 %y
}
=>
define i32 @test27(i1 %b) {
entry:
br label %done
done:
ret i32 undef
}
Transformation seems to be correct!
-- 136. PassManager<Function> : Skipping NOP
-- 137. PassManager<Function> : Skipping NOP
-- 138. InstCombinePass
----------------------------------------
define i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
Transformation seems to be correct! (syntactically equal)
-- 139. InstCombinePass
----------------------------------------
define i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
=>
define i1 @PR24766(i8 %x1, i8 %x2, i8 %condition) {
entry:
switch i8 %condition, label %epilog [
i8 0, label %sw1
i8 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
br label %epilog
epilog:
%conditionMet.shrunk = phi i1 [ 0, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ]
ret i1 %conditionMet.shrunk
}
Transformation seems to be correct!
-- 140. PassManager<Function> : Skipping NOP
-- 141. PassManager<Function> : Skipping NOP
-- 142. InstCombinePass
----------------------------------------
define i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condition) {
entry:
%frombool0 = zext i1 %another_condition to i8
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ %frombool0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
Transformation seems to be correct! (syntactically equal)
-- 143. InstCombinePass
----------------------------------------
define i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condition) {
entry:
%frombool0 = zext i1 %another_condition to i8
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ %frombool0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
=>
define i1 @PR24766_no_constants(i8 %x1, i8 %x2, i8 %condition, i1 %another_condition) {
entry:
switch i8 %condition, label %epilog [
i8 0, label %sw1
i8 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
br label %epilog
epilog:
%conditionMet.in = phi i1 [ %another_condition, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ]
ret i1 %conditionMet.in
}
Transformation seems to be correct!
-- 144. PassManager<Function> : Skipping NOP
-- 145. PassManager<Function> : Skipping NOP
-- 146. InstCombinePass
----------------------------------------
define i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ 1, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
Transformation seems to be correct! (syntactically equal)
-- 147. InstCombinePass
----------------------------------------
define i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
]
sw2:
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ 1, %sw2 ], [ %frombool1, %sw1 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
=>
define i1 @PR24766_two_constants(i8 %x1, i8 %x2, i8 %condition) {
entry:
switch i8 %condition, label %epilog [
i8 0, label %sw1
i8 1, label %sw2
]
sw2:
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
br label %epilog
epilog:
%conditionMet = phi i1 [ 0, %entry ], [ 1, %sw2 ], [ %cmp1, %sw1 ]
ret i1 %conditionMet
}
Transformation seems to be correct!
-- 148. PassManager<Function> : Skipping NOP
-- 149. PassManager<Function> : Skipping NOP
-- 150. InstCombinePass
----------------------------------------
define i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
i32 2, label %sw3
]
sw3:
%cmp3 = icmp sge i8 %x1, %x2
%frombool3 = zext i1 %cmp3 to i8
br label %epilog
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ], [ 1, %sw3 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
Transformation seems to be correct! (syntactically equal)
-- 151. InstCombinePass
----------------------------------------
define i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) {
entry:
%conv = sext i8 %condition to i32
switch i32 %conv, label %epilog [
i32 0, label %sw1
i32 1, label %sw2
i32 2, label %sw3
]
sw3:
br label %epilog
sw2:
%cmp2 = icmp sle i8 %x1, %x2
%frombool2 = zext i1 %cmp2 to i8
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
%frombool1 = zext i1 %cmp1 to i8
br label %epilog
epilog:
%conditionMet = phi i8 [ 0, %entry ], [ %frombool2, %sw2 ], [ %frombool1, %sw1 ], [ 1, %sw3 ]
%tobool = icmp ne i8 %conditionMet, 0
ret i1 %tobool
}
=>
define i1 @PR24766_two_constants_two_var(i8 %x1, i8 %x2, i8 %condition) {
entry:
switch i8 %condition, label %epilog [
i8 0, label %sw1
i8 1, label %sw2
i8 2, label %sw3
]
sw3:
br label %epilog
sw2:
%cmp2 = icmp sle i8 %x1, %x2
br label %epilog
sw1:
%cmp1 = icmp eq i8 %x1, %x2
br label %epilog
epilog:
%conditionMet.shrunk = phi i1 [ 0, %entry ], [ %cmp2, %sw2 ], [ %cmp1, %sw1 ], [ 1, %sw3 ]
ret i1 %conditionMet.shrunk
}
Transformation seems to be correct!
-- 152. PassManager<Function> : Skipping NOP
-- 153. PassManager<Function> : Skipping NOP
-- 154. InstCombinePass
----------------------------------------
declare void @dummy()
define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
%x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ]
%or = or i32 %x.0, %a
%cmp1 = icmp eq i32 %or, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 155. InstCombinePass
----------------------------------------
declare void @dummy()
define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
%x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ]
%or = or i32 %x.0, %a
%cmp1 = icmp eq i32 %or, 0
ret i1 %cmp1
}
=>
declare void @dummy()
define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
ret i1 0
}
Transformation seems to be correct!
-- 156. PassManager<Function> : Skipping NOP
-- 157. PassManager<Function> : Skipping NOP
-- 158. InstCombinePass
----------------------------------------
declare void @dummy()
define i1 @phi_allnonzerononconstant(i1 %c, i32 %a, ptr nonnull %b1, ptr nonnull %b2) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
%x.0 = phi ptr [ nonnull %b1, %if.then ], [ nonnull %b2, %if.else ]
%cmp1 = icmp eq ptr %x.0, null
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 159. InstCombinePass
----------------------------------------
declare void @dummy()
define i1 @phi_allnonzerononconstant(i1 %c, i32 %a, ptr nonnull %b1, ptr nonnull %b2) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
%x.0 = phi ptr [ nonnull %b1, %if.then ], [ nonnull %b2, %if.else ]
%cmp1 = icmp eq ptr %x.0, null
ret i1 %cmp1
}
=>
declare void @dummy()
define i1 @phi_allnonzerononconstant(i1 %c, i32 %a, ptr nonnull %b1, ptr nonnull %b2) {
entry:
br i1 %c, label %if.then, label %if.else
if.else:
call void @dummy()
br label %if.end
if.then:
br label %if.end
if.end:
ret i1 0
}
Transformation seems to be correct!
-- 160. PassManager<Function> : Skipping NOP
-- 161. PassManager<Function> : Skipping NOP
-- 162. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.then ], [ %n, %entry ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 163. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.then ], [ %n, %entry ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_eq(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%a.0 = phi i32 [ 1, %if.then ], [ %n, %entry ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 164. PassManager<Function> : Skipping NOP
-- 165. PassManager<Function> : Skipping NOP
-- 166. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.then ], [ %n, %entry ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 167. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.then ], [ %n, %entry ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_ne(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%a.0 = phi i32 [ 1, %if.then ], [ %n, %entry ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 168. PassManager<Function> : Skipping NOP
-- 169. PassManager<Function> : Skipping NOP
-- 170. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
%tobool2 = icmp slt i32 %n, %s
br i1 %tobool2, label %if.else, label %if.end
if.else:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.else ], [ %n, %entry ], [ 2, %if.then ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 171. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
%tobool2 = icmp slt i32 %n, %s
br i1 %tobool2, label %if.else, label %if.end
if.else:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.else ], [ %n, %entry ], [ 2, %if.then ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_eq_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
br i1 1, label %if.else, label %if.end
if.else:
br label %if.end
if.end:
%a.0 = phi i32 [ 1, %if.else ], [ %n, %entry ], [ poison, %if.then ]
%cmp1 = icmp eq i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 172. PassManager<Function> : Skipping NOP
-- 173. PassManager<Function> : Skipping NOP
-- 174. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
%tobool2 = icmp slt i32 %n, %s
br i1 %tobool2, label %if.else, label %if.end
if.else:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.else ], [ %n, %entry ], [ 2, %if.then ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 175. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
%tobool2 = icmp slt i32 %n, %s
br i1 %tobool2, label %if.else, label %if.end
if.else:
%#0 = load i32, ptr nocapture nowrite %P, align 4
%cmp = icmp eq i32 %n, %#0
%#1 = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%a.0 = phi i32 [ %#1, %if.else ], [ %n, %entry ], [ 2, %if.then ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_ne_2(i32 %n, i32 %s, ptr nocapture nowrite %P) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.then, label %if.end
if.then:
br i1 1, label %if.else, label %if.end
if.else:
br label %if.end
if.end:
%a.0 = phi i32 [ 1, %if.else ], [ %n, %entry ], [ poison, %if.then ]
%cmp1 = icmp ne i32 %a.0, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 176. PassManager<Function> : Skipping NOP
-- 177. PassManager<Function> : Skipping NOP
-- 178. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 179. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_eq_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 180. PassManager<Function> : Skipping NOP
-- 181. PassManager<Function> : Skipping NOP
-- 182. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 183. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_eq_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 184. PassManager<Function> : Skipping NOP
-- 185. PassManager<Function> : Skipping NOP
-- 186. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_or_disjoint_icmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or disjoint i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 187. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_or_disjoint_icmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or disjoint i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_eq_or_disjoint_icmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 188. PassManager<Function> : Skipping NOP
-- 189. PassManager<Function> : Skipping NOP
-- 190. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 191. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_ne_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 192. PassManager<Function> : Skipping NOP
-- 193. PassManager<Function> : Skipping NOP
-- 194. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct! (syntactically equal)
-- 195. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
=>
define i1 @phi_knownnonzero_ne_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp ne i32 %orphi, 0
ret i1 %cmp1
}
Transformation seems to be correct!
-- 196. PassManager<Function> : Skipping NOP
-- 197. PassManager<Function> : Skipping NOP
-- 198. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_multiuse_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct! (syntactically equal)
-- 199. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_multiuse_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
=>
define i1 @phi_knownnonzero_eq_multiuse_oricmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %phi, %val
%cmp1 = icmp eq i32 %orphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ 0, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct!
-- 200. PassManager<Function> : Skipping NOP
-- 201. PassManager<Function> : Skipping NOP
-- 202. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_multiuse_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp ne i32 %orphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct! (syntactically equal)
-- 203. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_multiuse_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1 = icmp ne i32 %orphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
=>
define i1 @phi_knownnonzero_ne_multiuse_oricmp_commuted(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
br label %if.end
if.end:
%phi = phi i32 [ 1, %if.then ], [ %n, %entry ]
%orphi = or i32 %val, %phi
%cmp1.not = icmp eq i32 %orphi, 0
br i1 %cmp1.not, label %cleanup, label %next
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ 0, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct!
-- 204. PassManager<Function> : Skipping NOP
-- 205. PassManager<Function> : Skipping NOP
-- 206. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1 = icmp eq i32 %andphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct! (syntactically equal)
-- 207. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_eq_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1 = icmp eq i32 %andphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
=>
define i1 @phi_knownnonzero_eq_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1 = icmp eq i32 %andphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp eq i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ 0, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct!
-- 208. PassManager<Function> : Skipping NOP
-- 209. PassManager<Function> : Skipping NOP
-- 210. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1 = icmp ne i32 %andphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct! (syntactically equal)
-- 211. InstCombinePass
----------------------------------------
define i1 @phi_knownnonzero_ne_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1 = icmp ne i32 %andphi, 0
br i1 %cmp1, label %next, label %cleanup
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ %cmp1, %if.end ], [ %bool2, %next ]
ret i1 %final
}
=>
define i1 @phi_knownnonzero_ne_multiuse_andicmp(i32 %n, i32 %s, ptr %P, i32 %val) {
entry:
%tobool = icmp slt i32 %n, %s
br i1 %tobool, label %if.end, label %if.then
if.then:
%load = load i32, ptr %P, align 4
%cmp = icmp eq i32 %n, %load
%sel = select i1 %cmp, i32 1, i32 2
br label %if.end
if.end:
%phi = phi i32 [ %sel, %if.then ], [ %n, %entry ]
%andphi = and i32 %phi, %val
%cmp1.not = icmp eq i32 %andphi, 0
br i1 %cmp1.not, label %cleanup, label %next
next:
%bool2 = icmp ne i32 %phi, 0
br label %cleanup
cleanup:
%final = phi i1 [ 0, %if.end ], [ %bool2, %next ]
ret i1 %final
}
Transformation seems to be correct!
-- 212. PassManager<Function> : Skipping NOP
-- 213. PassManager<Function> : Skipping NOP
-- 214. InstCombinePass
----------------------------------------
define void @main(i1 %cond, i16 %x) {
entry:
br label %for.cond
g.exit:
br label %for.cond
for.cond:
%p = phi double [ %conv, %g.exit ], [ undef, %entry ]
br i1 %cond, label %for.end, label %for.body
for.end:
store double %p, ptr undef, align 8
ret void
for.body:
%conv = sitofp i16 %x to double
assume i1 0
}
Transformation seems to be correct! (syntactically equal)
-- 215. InstCombinePass
----------------------------------------
define void @main(i1 %cond, i16 %x) {
entry:
br label %for.cond
for.cond:
%p = phi double [ undef, %entry ]
br i1 %cond, label %for.end, label %for.body
for.end:
store double %p, ptr undef, align 8
ret void
for.body:
assume i1 0
}
=>
define void @main(i1 %cond, i16 %x) {
entry:
br label %for.cond
for.cond:
br i1 %cond, label %for.end, label %for.body
for.end:
store double undef, ptr undef, align 8
ret void
for.body:
assume i1 0
}
****************************************
WARNING: Source function is always UB.
It can be refined by any target function.
Please make sure this is what you wanted.
****************************************
Transformation seems to be correct!
-- 216. PassManager<Function> : Skipping NOP
-- 217. PassManager<Function> : Skipping NOP
-- 218. InstCombinePass
----------------------------------------
define i1 @pr57488_icmp_of_phi(ptr %ptr.base, i64 %len) {
start:
%end = gep inbounds ptr %ptr.base, 8 x i64 %len
%len.zero = icmp eq i64 %len, 0
br i1 %len.zero, label %exit, label %loop
loop:
%accum = phi i8 [ %accum.next, %loop ], [ 1, %start ]
%ptr = phi ptr [ %ptr.next, %loop ], [ %ptr.base, %start ]
%ptr.next = gep inbounds ptr %ptr, 8 x i64 1
%accum.bool = icmp ne i8 %accum, 0
%val = load i64, ptr %ptr, align 8
%val.zero = icmp eq i64 %val, 0
%and = and i1 %accum.bool, %val.zero
%accum.next = zext i1 %and to i8
%exit.cond = icmp eq ptr %ptr.next, %end
br i1 %exit.cond, label %exit, label %loop
exit:
%res = phi i1 [ 1, %start ], [ %and, %loop ]
ret i1 %res
}
Transformation seems to be correct! (syntactically equal)
-- 219. InstCombinePass
----------------------------------------
define i1 @pr57488_icmp_of_phi(ptr %ptr.base, i64 %len) {
start:
%end = gep inbounds ptr %ptr.base, 8 x i64 %len
%len.zero = icmp eq i64 %len, 0
br i1 %len.zero, label %exit, label %loop
loop:
%accum = phi i8 [ %accum.next, %loop ], [ 1, %start ]
%ptr = phi ptr [ %ptr.next, %loop ], [ %ptr.base, %start ]
%ptr.next = gep inbounds ptr %ptr, 8 x i64 1
%accum.bool = icmp ne i8 %accum, 0
%val = load i64, ptr %ptr, align 8
%val.zero = icmp eq i64 %val, 0
%and = and i1 %accum.bool, %val.zero
%accum.next = zext i1 %and to i8
%exit.cond = icmp eq ptr %ptr.next, %end, offsetonly
br i1 %exit.cond, label %exit, label %loop
exit:
%res = phi i1 [ 1, %start ], [ %and, %loop ]
ret i1 %res
}
=>
define i1 @pr57488_icmp_of_phi(ptr %ptr.base, i64 %len) {
start:
%end = gep inbounds ptr %ptr.base, 8 x i64 %len
%len.zero = icmp eq i64 %len, 0
br i1 %len.zero, label %exit, label %loop
loop:
%accum = phi i1 [ %and, %loop ], [ 1, %start ]
%ptr = phi ptr [ %ptr.next, %loop ], [ %ptr.base, %start ]
%ptr.next = gep inbounds ptr %ptr, 1 x i64 8
%val = load i64, ptr %ptr, align 8
%val.zero = icmp eq i64 %val, 0
%and = and i1 %accum, %val.zero
%exit.cond = icmp eq ptr %ptr.next, %end, offsetonly
br i1 %exit.cond, label %exit, label %loop
exit:
%res = phi i1 [ 1, %start ], [ %and, %loop ]
ret i1 %res
}
Transformation seems to be correct!
-- 220. PassManager<Function> : Skipping NOP
-- 221. PassManager<Function> : Skipping NOP
-- 222. InstCombinePass
----------------------------------------
declare void @use(i32)
define i32 @phi_op_self_simplify() {
entry:
br label %loop
loop:
%iv = phi i32 [ 1, %entry ], [ %iv.add2, %loop ]
%iv.add = xor i32 %iv, 4294967295
call void @use(i32 %iv.add)
%iv.add2 = xor i32 %iv, 4294967295
br label %loop
}
Transformation seems to be correct! (syntactically equal)
-- 223. InstCombinePass
----------------------------------------
declare void @use(i32)
define i32 @phi_op_self_simplify() {
entry:
br label %loop
loop:
%iv = phi i32 [ 1, %entry ], [ %iv.add2, %loop ]
%iv.add = xor i32 %iv, 4294967295
call void @use(i32 %iv.add)
%iv.add2 = xor i32 %iv, 4294967295
br label %loop
}
Transformation seems to be correct! (syntactically equal)
-- 224. PassManager<Function> : Skipping NOP
-- 225. PassManager<Function> : Skipping NOP
-- 226. InstCombinePass
----------------------------------------
declare i1 @get.i1()
define i32 @phi_op_self_simplify_2(i32 %x) {
entry:
br label %loop
loop:
%phi = phi i32 [ %x, %entry ], [ %or, %loop ], [ 10, %loop.latch ]
%or = or i32 %phi, 1
%c1 = call i1 @get.i1()
br i1 %c1, label %loop.latch, label %loop
loop.latch:
%c2 = call i1 @get.i1()
br i1 %c2, label %exit, label %loop
exit:
ret i32 %or
}
Transformation seems to be correct! (syntactically equal)
-- 227. InstCombinePass
----------------------------------------
declare i1 @get.i1()
define i32 @phi_op_self_simplify_2(i32 %x) {
entry:
br label %loop
loop:
%phi = phi i32 [ %x, %entry ], [ %or, %loop ], [ 10, %loop.latch ]
%or = or i32 %phi, 1
%c1 = call i1 @get.i1()
br i1 %c1, label %loop.latch, label %loop
loop.latch:
%c2 = call i1 @get.i1()
br i1 %c2, label %exit, label %loop
exit:
ret i32 %or
}
=>
declare i1 @get.i1()
define i32 @phi_op_self_simplify_2(i32 %x) {
entry:
%#0 = or i32 %x, 1
br label %loop
loop:
%phi = phi i32 [ %#0, %entry ], [ %phi, %loop ], [ 11, %loop.latch ]
%c1 = call i1 @get.i1()
br i1 %c1, label %loop.latch, label %loop
loop.latch:
%c2 = call i1 @get.i1()
br i1 %c2, label %exit, label %loop
exit:
ret i32 %phi
}
Transformation doesn't verify! (not unsound)
ERROR: Timeout
-- 228. PassManager<Function> : Skipping NOP
-- 229. PassManager<Function> : Skipping NOP
-- 230. InstCombinePass
----------------------------------------
define i64 @inttoptr_of_phi(i1 %c, ptr %arg.ptr, ptr %arg.ptr2) {
entry:
br i1 %c, label %if, label %else
else:
%arg.int.ptr = ptrtoint ptr %arg.ptr to i64
br label %join
if:
%arg.ptr2.val = load i64, ptr %arg.ptr2, align 8
br label %join
join:
%int.ptr = phi i64 [ %arg.ptr2.val, %if ], [ %arg.int.ptr, %else ]
%ptr = int2ptr i64 %int.ptr to ptr
%v = load i64, ptr %ptr, align 8
ret i64 %v
}
Transformation seems to be correct! (syntactically equal)
-- 231. InstCombinePass
----------------------------------------
define i64 @inttoptr_of_phi(i1 %c, ptr %arg.ptr, ptr %arg.ptr2) {
entry:
br i1 %c, label %if, label %else
else:
%arg.int.ptr = ptrtoint ptr %arg.ptr to i64
br label %join
if:
%arg.ptr2.val = load i64, ptr %arg.ptr2, align 8
br label %join
join:
%int.ptr = phi i64 [ %arg.ptr2.val, %if ], [ %arg.int.ptr, %else ]
%ptr = int2ptr i64 %int.ptr to ptr
%v = load i64, ptr %ptr, align 8
ret i64 %v
}
=>
define i64 @inttoptr_of_phi(i1 %c, ptr %arg.ptr, ptr %arg.ptr2) {
entry:
br i1 %c, label %if, label %else
else:
br label %join
if:
%arg.ptr2.val = load i64, ptr %arg.ptr2, align 8
%arg.ptr2.val.ptr = int2ptr i64 %arg.ptr2.val to ptr
br label %join
join:
%int.ptr.ptr = phi ptr [ %arg.ptr2.val.ptr, %if ], [ %arg.ptr, %else ]
%v = load i64, ptr %int.ptr.ptr, align 8
ret i64 %v
}
Transformation doesn't verify! (unsound)
ERROR: Source is more defined than target
Example:
i1 %c = #x0 (0)
ptr %arg.ptr = null
ptr %arg.ptr2 = poison
Source:
>> Jump to %else
i64 %arg.int.ptr = #x0000000000000000 (0)
>> Jump to %join
i64 %int.ptr = #x0000000000000000 (0)
ptr %ptr = 0x0
i64 %v = poison
SOURCE MEMORY STATE
===================
NON-LOCAL BLOCKS:
Block 0 > size: 0 align: 8 alloc type: 0 alive: false address: 0
Block 1 > size: 0 align: 1 alloc type: 0 alive: true address: 10
Block 2 > size: 0 align: 1 alloc type: 0 alive: true address: 11
Block 3 > size: 8 align: 8 alloc type: 0 alive: true address: 0
Target:
>> Jump to %else
>> Jump to %join
ptr %int.ptr.ptr = null
i64 %v = UB triggered!
Pass: InstCombinePass
Command line: '/home/nlopes/llvm/build/bin/opt' '-load=/home/nlopes/alive2/build/tv/tv.so' '-load-pass-plugin=/home/nlopes/alive2/build/tv/tv.so' '-tv-exit-on-error' '-passes=instcombine' '-S' '-tv-smt-to=20000' '-tv-report-dir=/home/nlopes/alive2/build/logs' '-tv-smt-stats'
Wrote bitcode to: "/home/nlopes/alive2/build/logs/in_KgWn4BCN_IF6x.bc"
------------------- SMT STATS -------------------
Num queries: 269
Num invalid: 0
Num skips: 0
Num trivial: 162 (37.6%)
Num timeout: 6 (2.2%)
Num errors: 0 (0.0%)
Num SAT: 143 (53.2%)
Num UNSAT: 120 (44.6%)
Alive2: Transform doesn't verify; aborting!
RUN: at line 2: /home/nlopes/alive2/build/opt-alive.sh < /bitbucket/nlopes/llvm/llvm/test/Transforms/InstCombine/phi.ll -passes=instcombine -S | /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/InstCombine/phi.ll + /home/nlopes/alive2/build/opt-alive.sh -passes=instcombine -S + /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/InstCombine/phi.ll FileCheck error: '<stdin>' is empty. FileCheck command line: /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/InstCombine/phi.ll