Closed
Description
Description
The backend hangs with the following input during CodeGenPrepare
when targeting x86_64
/ i386
.
Minimal Reproduction
https://godbolt.org/z/373K8TdhM
Code
define i32 @f(i32 %0) {
BB:
%P0 = alloca i32, i32 8
%P1 = getelementptr i32, ptr %P0, i32 1
%B0 = icmp eq i32 %0, 0
br label %BB1
BB1: ; preds = %BB1, %BB
%P2 = getelementptr i1, ptr %P1, i1 %B0
br i1 false, label %BB1, label %BB2
BB2: ; preds = %BB1
%P3 = select i1 %B0, ptr %P1, ptr %P2
%L1 = load i32, ptr %P3
ret i32 %L1
}
Cause
sinkCmpExpression
keeps adding code for every CodeGenPrepare
iteration so the loop is never broken.
llvm-project/llvm/lib/CodeGen/CodeGenPrepare.cpp
Lines 1674 to 1738 in dacfdbc
Dump of IR for each iteration of CodeGenPrepare
:
; Original
define i32 @f() {
BB:
%RP = alloca i32, i32 20, align 4
%L = load i32, ptr %RP, align 4
%G = getelementptr i32, ptr %RP, i32 1
%C4 = icmp eq i32 %L, 0
%G3 = getelementptr i32, ptr %G, i32 4
br label %BB3
BB3: ; preds = %BB3, %BB
%G1 = getelementptr i1, ptr %G3, i1 %C4
br i1 false, label %BB3, label %BB1
BB1: ; preds = %BB3
%S = select i1 %C4, ptr %G3, ptr %G1
%L1 = load i32, ptr %S, align 4
ret i32 %L1
}
; Iteration 1
define i32 @f() {
BB:
%RP = alloca i32, i32 20, align 4
%L = load i32, ptr %RP, align 4
%G = getelementptr i32, ptr %RP, i32 1
%G3 = getelementptr i32, ptr %G, i32 4
br label %BB3
BB3: ; preds = %BB3, %BB
%0 = icmp eq i32 %L, 0
%G1 = getelementptr i1, ptr %G3, i1 %0
br i1 false, label %BB3, label %BB1
BB1: ; preds = %BB3
%1 = icmp eq i32 %L, 0
%S1 = select i1 %1, i1 false, i1 %0
%S = select i1 %1, ptr %G3, ptr %G1
%L1 = load i32, ptr %S, align 4
ret i32 %L1
}
; Iteration 2
define i32 @f() {
BB:
%RP = alloca i32, i32 20, align 4
%L = load i32, ptr %RP, align 4
%G = getelementptr i32, ptr %RP, i32 1
%G3 = getelementptr i32, ptr %G, i32 4
br label %BB3
BB3: ; preds = %BB3, %BB
%0 = icmp eq i32 %L, 0
%G1 = getelementptr i1, ptr %G3, i1 %0
br i1 false, label %BB3, label %BB1
BB1: ; preds = %BB3
%1 = icmp eq i32 %L, 0
%2 = icmp eq i32 %L, 0
%S1 = select i1 %2, i1 false, i1 %1
%S2 = select i1 %2, i1 false, i1 %0
%S = select i1 %2, ptr %G3, ptr %G1
%L1 = load i32, ptr %S, align 4
ret i32 %L1
}
; Iteration 3
define i32 @f() {
BB:
%RP = alloca i32, i32 20, align 4
%L = load i32, ptr %RP, align 4
%G = getelementptr i32, ptr %RP, i32 1
%G3 = getelementptr i32, ptr %G, i32 4
br label %BB3
BB3: ; preds = %BB3, %BB
%0 = icmp eq i32 %L, 0
%G1 = getelementptr i1, ptr %G3, i1 %0
br i1 false, label %BB3, label %BB1
BB1: ; preds = %BB3
%1 = icmp eq i32 %L, 0
%2 = icmp eq i32 %L, 0
%3 = icmp eq i32 %L, 0
%S1 = select i1 %3, i1 false, i1 %2
%S2 = select i1 %3, i1 false, i1 %1
%S3 = select i1 %3, i1 false, i1 %0
%S = select i1 %3, ptr %G3, ptr %G1
%L1 = load i32, ptr %S, align 4
ret i32 %L1
}
; Iteration 4
define i32 @f() {
BB:
%RP = alloca i32, i32 20, align 4
%L = load i32, ptr %RP, align 4
%G = getelementptr i32, ptr %RP, i32 1
%G3 = getelementptr i32, ptr %G, i32 4
br label %BB3
BB3: ; preds = %BB3, %BB
%0 = icmp eq i32 %L, 0
%G1 = getelementptr i1, ptr %G3, i1 %0
br i1 false, label %BB3, label %BB1
BB1: ; preds = %BB3
%1 = icmp eq i32 %L, 0
%2 = icmp eq i32 %L, 0
%3 = icmp eq i32 %L, 0
%4 = icmp eq i32 %L, 0
%S1 = select i1 %4, i1 false, i1 %3
%S2 = select i1 %4, i1 false, i1 %2
%S3 = select i1 %4, i1 false, i1 %1
%S4 = select i1 %4, i1 false, i1 %0
%S = select i1 %4, ptr %G3, ptr %G1
%L1 = load i32, ptr %S, align 4
ret i32 %L1
}