Skip to content

[InstCombine] InstCombine gets stuck when simplifying icmps  #82877

@dtcxzyw

Description

@dtcxzyw

Reduced test case: https://godbolt.org/z/dc6jnha5q

define i64 @func(i32 %p) {
entry:
  %not = xor i32 %p, -1
  br label %for.body

for.body:
  %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
  %p1 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
  %inc = add i32 %p1, 1
  %cmp1 = icmp ne i32 %inc, 0
  %cond = select i1 %cmp1, i32 0, i32 -1231558963
  %xor = xor i32 %cond, %p0
  %cmp2 = icmp ne i32 %xor, -2
  %conv = zext i1 %cmp2 to i32
  br i1 %cmp2, label %for.body, label %for.exit

for.exit:
  ret i64 0
}
IC: Visiting:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
IC: Visiting:   %cmp2 = icmp ne i32 %1, -2
ADD DEFERRED:   %2 = select i1 %cmp1.not, i32 1231558962, i32 -1
ADD DEFERRED:   %3 = xor i32 %2, %p0
IC: Old =   %cmp2 = icmp ne i32 %1, -2
    New =   <badref> = icmp ne i32 %3, 1
ADD:   %cmp2 = icmp ne i32 %3, 1
IC: ERASE   %4 = icmp ne i32 %1, -2
ADD DEFERRED:   %1 = xor i32 %0, %p0
IC: ERASE   %1 = xor i32 %0, %p0
ADD DEFERRED:   %0 = select i1 %cmp1.not, i32 -1231558963, i32 0
ADD DEFERRED:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
ADD:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
IC: ERASE   %0 = select i1 %cmp1.not, i32 -1231558963, i32 0
ADD DEFERRED:   %cmp1.not = icmp eq i32 %inc, 0
ADD:   %cmp1.not = icmp eq i32 %inc, 0
ADD:   %1 = xor i32 %0, %p0
ADD:   %0 = select i1 %cmp1.not, i32 1231558962, i32 -1
IC: Visiting:   %0 = select i1 %cmp1.not, i32 1231558962, i32 -1
IC: Visiting:   %1 = xor i32 %0, %p0
IC: Visiting:   %cmp1.not = icmp eq i32 %inc, 0
IC: Visiting:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
IC: Visiting:   %cmp2 = icmp ne i32 %1, 1
ADD DEFERRED:   %2 = select i1 %cmp1.not, i32 -1231558963, i32 0
ADD DEFERRED:   %3 = xor i32 %2, %p0
IC: Old =   %cmp2 = icmp ne i32 %1, 1
    New =   <badref> = icmp ne i32 %3, -2
ADD:   %cmp2 = icmp ne i32 %3, -2
IC: ERASE   %4 = icmp ne i32 %1, 1
ADD DEFERRED:   %1 = xor i32 %0, %p0
IC: ERASE   %1 = xor i32 %0, %p0
ADD DEFERRED:   %0 = select i1 %cmp1.not, i32 1231558962, i32 -1
ADD DEFERRED:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
ADD:   %p0 = phi i32 [ %not, %entry ], [ %conv, %for.body ]
IC: ERASE   %0 = select i1 %cmp1.not, i32 1231558962, i32 -1
ADD DEFERRED:   %cmp1.not = icmp eq i32 %inc, 0
ADD:   %cmp1.not = icmp eq i32 %inc, 0
ADD:   %1 = xor i32 %0, %p0
ADD:   %0 = select i1 %cmp1.not, i32 -1231558963, i32 0
IC: Visiting:   %0 = select i1 %cmp1.not, i32 -1231558963, i32 0
IC: Visiting:   %1 = xor i32 %0, %p0
IC: Visiting:   %cmp1.not = icmp eq i32 %inc, 0

Repeats multiple times...

Metadata

Metadata

Assignees

Labels

llvm:hangCompiler hang (infinite loop)llvm:instcombineCovers the InstCombine, InstSimplify and AggressiveInstCombine passes

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions