Test source: git
Comments: Alive2 bug with fn calls memory comparison
Source: /bitbucket/nlopes/llvm/llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll -- 1. ModuleToFunctionPassAdaptor ERROR: Unsupported instruction: invoke void @clobber() to label %bb2 unwind label %bb5 ERROR: Unsupported attribute: noalias -- 1. PassManager<Function> : Skipping NOP -- 2. DSEPass ---------------------------------------- define i32 @other_value_escapes_before_call() { %entry: %v1 = alloca i64 4, align 4 %v2 = alloca i64 4, align 4 store i32 0, ptr %v1, align 4 call void @escape(nonnull ptr %v1) store i32 55555, ptr %v2, align 4 %call = call i32 @getval() store i32 %call, ptr %v2, align 4 call void @escape(nonnull ptr %v2) %load.v2 = load i32, ptr %v2, align 4 %load.v1 = load i32, ptr %v1, align 4 %add = add nsw i32 %load.v2, %load.v1 ret i32 %add } Transformation seems to be correct! (syntactically equal) -- 3. DSEPass ---------------------------------------- define i32 @other_value_escapes_before_call() { %entry: %v1 = alloca i64 4, align 4 %v2 = alloca i64 4, align 4 store i32 0, ptr %v1, align 4 call void @escape(nonnull ptr %v1) store i32 55555, ptr %v2, align 4 %call = call i32 @getval() store i32 %call, ptr %v2, align 4 call void @escape(nonnull ptr %v2) %load.v2 = load i32, ptr %v2, align 4 %load.v1 = load i32, ptr %v1, align 4 %add = add nsw i32 %load.v2, %load.v1 ret i32 %add } => define i32 @other_value_escapes_before_call() { %entry: %v1 = alloca i64 4, align 4 %v2 = alloca i64 4, align 4 store i32 0, ptr %v1, align 4 call void @escape(nonnull ptr %v1) %call = call i32 @getval() store i32 %call, ptr %v2, align 4 call void @escape(nonnull ptr %v2) %load.v2 = load i32, ptr %v2, align 4 %load.v1 = load i32, ptr %v1, align 4 %add = add nsw i32 %load.v2, %load.v1 ret i32 %add } Transformation seems to be correct! -- 4. PassManager<Function> : Skipping NOP -- 5. PassManager<Function> : Skipping NOP -- 6. DSEPass ---------------------------------------- define i32 @test_not_captured_before_call_same_bb() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r } Transformation seems to be correct! (syntactically equal) -- 7. DSEPass ---------------------------------------- define i32 @test_not_captured_before_call_same_bb() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r } => define i32 @test_not_captured_before_call_same_bb() { %0: %a = alloca i64 4, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r } Transformation seems to be correct! -- 8. PassManager<Function> : Skipping NOP -- 9. PassManager<Function> : Skipping NOP -- 10. DSEPass ---------------------------------------- define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r %unreach: call void @escape_and_clobber(ptr %a) ret i32 0 } Transformation seems to be correct! (syntactically equal) -- 11. DSEPass ---------------------------------------- define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r } => define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block() { %0: %a = alloca i64 4, align 4 %r = call i32 @getval() store i32 99, ptr %a, align 4 call void @escape_and_clobber(ptr %a) ret i32 %r } Transformation seems to be correct! -- 12. PassManager<Function> : Skipping NOP -- 13. PassManager<Function> : Skipping NOP -- 14. DSEPass ---------------------------------------- define i32 @test_captured_and_clobbered_after_load_same_bb_2() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() call void @escape_and_clobber(ptr %a) store i32 99, ptr %a, align 4 call void @clobber() ret i32 %r } Transformation seems to be correct! (syntactically equal) -- 15. DSEPass ---------------------------------------- define i32 @test_captured_and_clobbered_after_load_same_bb_2() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() call void @escape_and_clobber(ptr %a) store i32 99, ptr %a, align 4 call void @clobber() ret i32 %r } Transformation seems to be correct! (syntactically equal) -- 16. PassManager<Function> : Skipping NOP -- 17. PassManager<Function> : Skipping NOP -- 18. DSEPass ---------------------------------------- define i32 @test_captured_after_call_same_bb_2_clobbered_later() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() call void @escape_writeonly(ptr %a) memory(write) store i32 99, ptr %a, align 4 call void @clobber() ret i32 %r } Transformation seems to be correct! (syntactically equal) -- 19. DSEPass ---------------------------------------- define i32 @test_captured_after_call_same_bb_2_clobbered_later() { %0: %a = alloca i64 4, align 4 store i32 55, ptr %a, align 4 %r = call i32 @getval() call void @escape_writeonly(ptr %a) memory(write) store i32 99, ptr %a, align 4 call void @clobber() ret i32 %r } => define i32 @test_captured_after_call_same_bb_2_clobbered_later() { %0: %a = alloca i64 4, align 4 %r = call i32 @getval() call void @escape_writeonly(ptr %a) memory(write) store i32 99, ptr %a, align 4 call void @clobber() ret i32 %r } Transformation doesn't verify! (unsound) ERROR: Source is more defined than target Example: Source: ptr %a = null i32 %r = poison void = function did not return! SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 4 alloc type: 0 address: 0 Block 1 > size: 0 align: 4 alloc type: 0 address: 0 LOCAL BLOCKS: Block 2 > size: 0 align: 4 alloc type: 0 address: 0 Target: ptr %a = null i32 %r = poison Function @escape_writeonly triggered UB void = UB triggered! TARGET MEMORY STATE =================== LOCAL BLOCKS: Block 2 > size: 0 align: 4 alloc type: 0 address: 0 Pass: DSEPass 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=dse' '-S' '/bitbucket/nlopes/llvm/llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll' '-tv-smt-to=20000' '-tv-report-dir=/home/nlopes/alive2/build/logs' '-tv-smt-stats' Wrote bitcode to: "/home/nlopes/alive2/build/logs/captures-before-call_M1MID5RC_n4uc.bc" ------------------- SMT STATS ------------------- Num queries: 15 Num invalid: 0 Num skips: 0 Num trivial: 20 (57.1%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 15 (100.0%) Num UNSAT: 0 (0.0%) Alive2: Transform doesn't verify; aborting!
+ : 'RUN: at line 2' + /home/nlopes/alive2/build/opt-alive.sh -passes=dse -S /bitbucket/nlopes/llvm/llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll + /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll FileCheck error: '<stdin>' is empty. FileCheck command line: /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/DeadStoreElimination/captures-before-call.ll