Files
clang-p2996/llvm/test/Transforms/EarlyCSE/const-speculation.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

43 lines
1.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -early-cse -earlycse-debug-hash -S %s | FileCheck %s
%mystruct = type { i32 }
; @var is global so that *every* GEP argument is Constant.
@var = external global %mystruct
; Control flow is to make the dominance tree consider the final icmp before it
; gets to simplify the purely constant one (%tst). Since that icmp uses the
; select that gets considered next. Finally the select simplification looks at
; the %tst icmp and we don't want it to speculate about what happens if "i32 0"
; is actually "i32 1", broken universes are automatic UB.
;
; In this case doing the speculation would create an invalid GEP(@var, 0, 1) and
; crash.
define i1 @test_constant_speculation() {
; CHECK-LABEL: @test_constant_speculation(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 undef, label [[END:%.*]], label [[SELECT:%.*]]
; CHECK: select:
; CHECK-NEXT: br label [[END]]
; CHECK: end:
; CHECK-NEXT: [[TMP:%.*]] = phi ptr [ null, [[ENTRY:%.*]] ], [ @var, [[SELECT]] ]
; CHECK-NEXT: [[RES:%.*]] = icmp eq ptr [[TMP]], null
; CHECK-NEXT: ret i1 [[RES]]
;
entry:
br i1 undef, label %end, label %select
select:
%tst = icmp eq i32 1, 0
%sel = select i1 %tst, ptr null, ptr @var
br label %end
end:
%tmp = phi ptr [null, %entry], [%sel, %select]
%res = icmp eq ptr %tmp, null
ret i1 %res
}