Test source: git
Comments: LLVM PR51669
Source: <stdin> -- 1. ModuleToFunctionPassAdaptor -- 1. PassManager<Function> : Skipping NOP -- 2. FunctionToLoopPassAdaptor ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 3. PassManager<Function> : Skipping NOP -- 4. LoopSimplifyPass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 5. LoopSimplifyPass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 6. LCSSAPass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 7. LCSSAPass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 8. PassManager<Function> : Skipping NOP -- 9. PassManager<Loop, AnalysisManager<Loop, LoopStandardAnalysisResults&>, LoopStandardAnalysisResults&, LPMUpdater&> : Skipping NOP -- 10. LoopIdiomRecognizePass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation seems to be correct! (syntactically equal) -- 11. LoopIdiomRecognizePass ---------------------------------------- declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: br label %loop loop: %iv = phi i8 [ %start, %entry ], [ %iv.next, %loop ] %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %val.shifted.iszero = icmp eq i8 %val.shifted, 0 %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %val.shifted.iszero, i8 %iv.next) br i1 %val.shifted.iszero, label %end, label %loop end: %iv.res = phi i8 [ %iv, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %val.shifted.iszero, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } => declare void @escape_inner(i8, i8, i8, i1, i8) declare void @escape_outer(i8, i8, i8, i1, i8) define i8 @p0(i8 %val, i8 %start, i8 %extraoffset) { entry: %val.numleadingzeros = ctlz i8 %val, 0 %val.numactivebits = sub nsw nuw i8 8, %val.numleadingzeros %#0 = sub i8 0, %extraoffset %val.numactivebits.offset = add nsw i8 %val.numactivebits, %#0 %iv.final = smax i8 %val.numactivebits.offset, %start %loop.backedgetakencount = sub nsw i8 %iv.final, %start %loop.tripcount = add nsw nuw i8 %loop.backedgetakencount, 1 br label %loop loop: %loop.iv = phi i8 [ 0, %entry ], [ %loop.iv.next, %loop ] %loop.iv.next = add nsw nuw i8 %loop.iv, 1 %loop.ivcheck = icmp eq i8 %loop.iv.next, %loop.tripcount %iv = add nsw i8 %loop.iv, %start %nbits = add nsw i8 %iv, %extraoffset %val.shifted = lshr i8 %val, %nbits %iv.next = add i8 %iv, 1 call void @escape_inner(i8 %iv, i8 %nbits, i8 %val.shifted, i1 %loop.ivcheck, i8 %iv.next) br i1 %loop.ivcheck, label %end, label %loop end: %iv.res = phi i8 [ %iv.final, %loop ] %nbits.res = phi i8 [ %nbits, %loop ] %val.shifted.res = phi i8 [ %val.shifted, %loop ] %val.shifted.iszero.res = phi i1 [ %loop.ivcheck, %loop ] %iv.next.res = phi i8 [ %iv.next, %loop ] call void @escape_outer(i8 %iv.res, i8 %nbits.res, i8 %val.shifted.res, i1 %val.shifted.iszero.res, i8 %iv.next.res) ret i8 %iv.res } Transformation doesn't verify! (unsound) ERROR: Source is more defined than target Example: i8 %val = #x02 (2) i8 %start = #x7f (127) i8 %extraoffset = #x82 (130, -126) Source: >> Jump to %loop i8 %iv = #x7f (127) i8 %nbits = #x01 (1) i8 %val.shifted = #x01 (1) i1 %val.shifted.iszero = #x0 (0) i8 %iv.next = #x80 (128, -128) 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: 1 align: 34359738368 alloc type: 0 alive: true address: 8 Target: i8 %val.numleadingzeros = #x06 (6) i8 %val.numactivebits = #x02 (2) i8 %#0 = #x7e (126) i8 %val.numactivebits.offset = poison i8 %iv.final = poison i8 %loop.backedgetakencount = poison i8 %loop.tripcount = poison >> Jump to %loop i8 %loop.iv = #x00 (0) i8 %loop.iv.next = #x01 (1) i1 %loop.ivcheck = poison i8 %iv = #x7f (127) i8 %nbits = #x01 (1) i8 %val.shifted = #x01 (1) i8 %iv.next = #x80 (128, -128) void = function did not return! Pass: LoopIdiomRecognizePass 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=loop-idiom' '-mtriple=x86_64' '-mcpu=core-avx2' '-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_eBsV4wqj_RrZu.bc" ------------------- SMT STATS ------------------- Num queries: 42 Num invalid: 0 Num skips: 0 Num trivial: 17 (28.8%) Num timeout: 0 (0.0%) Num errors: 0 (0.0%) Num SAT: 35 (83.3%) Num UNSAT: 7 (16.7%) Alive2: Transform doesn't verify; aborting!
RUN: at line 2: /home/nlopes/alive2/build/opt-alive.sh -passes=loop-idiom -mtriple=x86_64 -mcpu=corei7 < /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll -S | /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll --check-prefixes=CHECK,NOLZCNT + /home/nlopes/alive2/build/opt-alive.sh -passes=loop-idiom -mtriple=x86_64 -mcpu=corei7 -S + /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll --check-prefixes=CHECK,NOLZCNT RUN: at line 3: /home/nlopes/alive2/build/opt-alive.sh -passes=loop-idiom -mtriple=x86_64 -mcpu=core-avx2 < /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll -S | /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll --check-prefixes=CHECK,LZCNT + /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll --check-prefixes=CHECK,LZCNT + /home/nlopes/alive2/build/opt-alive.sh -passes=loop-idiom -mtriple=x86_64 -mcpu=core-avx2 -S FileCheck error: '<stdin>' is empty. FileCheck command line: /bitbucket/nlopes/llvm/build/bin/FileCheck /bitbucket/nlopes/llvm/llvm/test/Transforms/LoopIdiom/X86/logical-right-shift-until-zero.ll --check-prefixes=CHECK,LZCNT