Files
clang-p2996/llvm/test/Transforms/EarlyCSE/conditional.ll
Nikita Popov 3c514d31d7 [EarlyCSE] Update tests to use opaque pointers (NFC)
Update the EarlyCSE tests to use opaque pointers.

Worth noting that this leaves some bitcast ptr to ptr instructions
in the input IR behind which are no longer necessary. This is
because these use numbered instructions, so it's hard to drop them
in an automated fashion (as it would require renumbering all other
instructions as well). I'm leaving that as a problem for another day.

The test updates have been performed using
https://gist.github.com/nikic/98357b71fd67756b0f064c9517b62a34.

Differential Revision: https://reviews.llvm.org/D127278
2022-06-10 09:53:35 +02:00

109 lines
2.1 KiB
LLVM

; RUN: opt -early-cse -earlycse-debug-hash -S < %s | FileCheck %s
; RUN: opt -basic-aa -early-cse-memssa -S < %s | FileCheck %s
; Can we CSE a known condition to a constant?
define i1 @test(ptr %p) {
; CHECK-LABEL: @test
entry:
%cnd1 = icmp eq ptr %p, null
br i1 %cnd1, label %taken, label %untaken
taken:
; CHECK-LABEL: taken:
; CHECK-NEXT: ret i1 true
%cnd2 = icmp eq ptr %p, null
ret i1 %cnd2
untaken:
; CHECK-LABEL: untaken:
; CHECK-NEXT: ret i1 false
%cnd3 = icmp eq ptr %p, null
ret i1 %cnd3
}
; We can CSE the condition, but we *don't* know it's value after the merge
define i1 @test_neg1(ptr %p) {
; CHECK-LABEL: @test_neg1
entry:
%cnd1 = icmp eq ptr %p, null
br i1 %cnd1, label %taken, label %untaken
taken:
br label %merge
untaken:
br label %merge
merge:
; CHECK-LABEL: merge:
; CHECK-NEXT: ret i1 %cnd1
%cnd3 = icmp eq ptr %p, null
ret i1 %cnd3
}
; Check specifically for a case where we have a unique predecessor, but
; not a single predecessor. We can not know the value of the condition here.
define i1 @test_neg2(ptr %p) {
; CHECK-LABEL: @test_neg2
entry:
%cnd1 = icmp eq ptr %p, null
br i1 %cnd1, label %merge, label %merge
merge:
; CHECK-LABEL: merge:
; CHECK-NEXT: ret i1 %cnd1
%cnd3 = icmp eq ptr %p, null
ret i1 %cnd3
}
; Replace a use rather than CSE
define i1 @test2(ptr %p) {
; CHECK-LABEL: @test2
entry:
%cnd = icmp eq ptr %p, null
br i1 %cnd, label %taken, label %untaken
taken:
; CHECK-LABEL: taken:
; CHECK-NEXT: ret i1 true
ret i1 %cnd
untaken:
; CHECK-LABEL: untaken:
; CHECK-NEXT: ret i1 false
ret i1 %cnd
}
; Not legal to replace use given it's not dominated by edge
define i1 @test2_neg1(ptr %p) {
; CHECK-LABEL: @test2_neg1
entry:
%cnd1 = icmp eq ptr %p, null
br i1 %cnd1, label %taken, label %untaken
taken:
br label %merge
untaken:
br label %merge
merge:
; CHECK-LABEL: merge:
; CHECK-NEXT: ret i1 %cnd1
ret i1 %cnd1
}
; Another single predecessor test, but for dominated use
define i1 @test2_neg2(ptr %p) {
; CHECK-LABEL: @test2_neg2
entry:
%cnd1 = icmp eq ptr %p, null
br i1 %cnd1, label %merge, label %merge
merge:
; CHECK-LABEL: merge:
; CHECK-NEXT: ret i1 %cnd1
ret i1 %cnd1
}