Test source: git
Source: <stdin> -- 1. ModuleToFunctionPassAdaptor -- 1. PassManager<Function> : Skipping NOP -- 2. FunctionToLoopPassAdaptor ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 3. PassManager<Function> : Skipping NOP -- 4. LoopSimplifyPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 5. LoopSimplifyPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 6. LCSSAPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 7. LCSSAPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 8. PassManager<Function> : Skipping NOP -- 9. PassManager<Loop, AnalysisManager<Loop, LoopStandardAnalysisResults&>, LoopStandardAnalysisResults&, LPMUpdater&> : Skipping NOP -- 10. LICMPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 4 store i32 34, ptr %p.copy, align 4 store i64 3689348814741910323, ptr %p.copy, align 4 %val = load i8, ptr %p2, align 1 call void @use(i8 %val) store i8 0, ptr %p2, align 1 br i1 %c, label %loop, label %exit exit: ret void } Transformation seems to be correct! (syntactically equal) -- 11. LICMPass ---------------------------------------- declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 br label %loop loop: store i32 286331153, ptr %p, align 8 store i32 34, ptr %p.copy, align 8 store i64 3689348814741910323, ptr %p.copy, align 8 %val = load i8, ptr %p2, align 4 call void @use(i8 %val) store i8 0, ptr %p2, align 4 br i1 %c, label %loop, label %exit exit: ret void } => declare void @use(i8) define void @test(i1 %c, i8 %x) { start: %a = alloca i64 16, align 8 %p = gep inbounds ptr %a, 1 x i64 8 %p.copy = gep inbounds ptr %a, 1 x i64 8 %p2 = gep inbounds ptr %a, 1 x i64 12 %p2.promoted = load i8, ptr %p2, align 4 br label %loop loop: %#0 = phi i8 [ 0, %loop ], [ %p2.promoted, %start ] store i32 286331153, ptr %p, align 8 store i32 34, ptr %p.copy, align 8 store i64 3689348814741910323, ptr %p.copy, align 8 call void @use(i8 %#0) br i1 %c, label %loop, label %exit exit: store i8 0, ptr %p2, align 4 ret void } Transformation doesn't verify! (unsound) ERROR: Source is more defined than target Example: i1 %c = poison i8 %x = poison Source: ptr %a = null ptr %p = pointer(local, block_id=2, offset=8) ptr %p.copy = pointer(local, block_id=2, offset=8) ptr %p2 = pointer(local, block_id=2, offset=12) >> Jump to %loop i8 %val = #x33 (51) void = function did not return! SOURCE MEMORY STATE =================== NON-LOCAL BLOCKS: Block 0 > size: 0 align: 1 alloc type: 0 alive: false address: 0 Block 1 > size: 0 align: 1 alloc type: 0 alive: true address: 0 LOCAL BLOCKS: Block 2 > size: 16 align: 8 alloc type: 1 alive: true Target: ptr %a = pointer(local, block_id=2, offset=0) ptr %p = pointer(local, block_id=2, offset=8) ptr %p.copy = pointer(local, block_id=2, offset=8) ptr %p2 = pointer(local, block_id=2, offset=12) i8 %p2.promoted = poison >> Jump to %loop i8 %#0 = poison Function @use triggered UB TARGET MEMORY STATE =================== LOCAL BLOCKS: Block 2 > size: 0 align: 1 alloc type: 0 alive: false address: 0 Pass: LICMPass 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' '-S' '-passes=licm' '-tv-smt-to=20000' '-tv-report-dir=/home/nlopes/alive2/build/logs' '-tv-smt-stats' Wrote bitcode to: "/home/nlopes/alive2/build/logs/in_hpBUtvCK_i1YG.bc" ------------------- SMT STATS ------------------- Num queries: 12 Num invalid: 0 Num skips: 0 Num trivial: 9 (42.9%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 12 (100.0%) Num UNSAT: 0 (0.0%) Alive2: Transform doesn't verify; aborting!
RUN: at line 2: /home/nlopes/alive2/build/opt-alive.sh -S -passes=licm < /bitbucket/nlopes/llvm/llvm/test/Transforms/LICM/pr64897.ll | /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LICM/pr64897.ll + /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LICM/pr64897.ll + /home/nlopes/alive2/build/opt-alive.sh -S -passes=licm FileCheck error: '<stdin>' is empty. FileCheck command line: /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LICM/pr64897.ll