llvm-project/llvm/test/Transforms/ConstraintElimination/pr54228-variable-name-order.ll
Florian Hahn 542c335159
[ConstraintElimination] Remove dead variables when dropping constraints.
This patch extends ConstraintElimination to also remove dead variables
when removing a constraint. When a constraint is removed because it is
out of scope, all new variables added for this constraint can also be
removed.

This keeps the total size of the systems much smaller, because it
reduces the number of variables drastically.

It also fixes a bug where variables where removed incorrectly.

Fixes https://github.com/llvm/llvm-project/issues/54228
2022-03-07 09:04:07 +00:00

56 lines
1.9 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
declare void @fn()
define i1 @test_pr54228(i32 %a, i32 %b, i1 %i.0, i1 %i.1) {
; CHECK-LABEL: @test_pr54228(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 [[I_0:%.*]], label [[PH_1:%.*]], label [[LOOP_HEADER:%.*]]
; CHECK: ph.1:
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A:%.*]], 0
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
; CHECK-NEXT: br label [[LOOP_HEADER]]
; CHECK: loop.header:
; CHECK-NEXT: br i1 [[I_1:%.*]], label [[LOOP_THEN:%.*]], label [[LOOP_LATCH:%.*]]
; CHECK: loop.then:
; CHECK-NEXT: call void @fn()
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i32 [[B:%.*]], 0
; CHECK-NEXT: call void @llvm.assume(i1 [[C_2]])
; CHECK-NEXT: br label [[LOOP_LATCH]]
; CHECK: loop.latch:
; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[B]], 1
; CHECK-NEXT: br i1 [[C_3]], label [[EXIT:%.*]], label [[LOOP_HEADER]]
; CHECK: exit:
; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[A]], 0
; CHECK-NEXT: ret i1 [[C_4]]
;
entry:
br i1 %i.0, label %ph.1, label %loop.header
ph.1: ; preds = %entry
%c.1 = icmp eq i32 %a, 0
call void @llvm.assume(i1 %c.1)
br label %loop.header
loop.header: ; preds = %loop.latch, %ph.1, %entry
br i1 %i.1, label %loop.then, label %loop.latch
loop.then: ; preds = %loop.header
call void @fn()
%c.2 = icmp eq i32 %b, 0
call void @llvm.assume(i1 %c.2)
br label %loop.latch
loop.latch: ; preds = %loop.then, %loop.header
%c.3 = icmp eq i32 %b, 1
br i1 %c.3, label %exit, label %loop.header
exit: ; preds = %loop.latch
%c.4 = icmp eq i32 %a, 0
ret i1 %c.4
}
declare void @llvm.assume(i1 noundef)