[PATCH] D111836: [indvars] Use fact loop must exit to canonicalize to unsigned conditions

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 25 06:23:46 PDT 2021


spatel added a comment.

This patch causes an infinite loop in a compiled program:
https://llvm.org/PR52276

Here's an IR reduction of that example that shows what appears to be a miscompile with "opt -indvars" :

  define i32 @PR52276(i32 %a, i32* %p) {
  entry:
    %cmp = icmp sgt i32 %a, 0
    %conv = zext i1 %cmp to i32
    %neg = xor i32 %a, -1
    %cmp1 = icmp slt i32 %conv, %neg ; !!! This compare changes to ult
    br i1 %cmp1, label %ph, label %exit
  
  ph:
    %b = load i32, i32* %p, align 4
    br label %loop
  
  loop:
    %inc1 = phi i32 [ %b, %ph ], [ %inc, %loop ]
    %inc = add nsw i32 %inc1, 1
    br i1 %cmp1, label %loop, label %crit_edge, !llvm.loop !0
  
  crit_edge:
    %inc2 = phi i32 [ %inc, %loop ]
    store i32 %inc2, i32* %p, align 4
    br label %exit
  
  exit:
    ret i32 0
  }
  
  !0 = distinct !{!0, !1}
  !1 = !{!"llvm.loop.mustprogress"}


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111836/new/

https://reviews.llvm.org/D111836



More information about the llvm-commits mailing list