1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/Transforms/JumpThreading/ne-undef.ll
Florian Hahn 4271526a2f [ValueLattice] Add new state for undef constants.
This patch adds a new undef lattice state, which is used to represent
UndefValue constants or instructions producing undef.

The main difference to the unknown state is that merging undef values
with constants (or single element constant ranges) produces  the
constant/constant range, assuming all uses of the merge result will be
replaced by the found constant.

Contrary, merging non-single element ranges with undef needs to go to
overdefined. Using unknown for UndefValues currently causes mis-compiles
in CVP/LVI (PR44949) and will become problematic once we use
ValueLatticeElement for SCCP.

Reviewers: efriedma, reames, davide, nikic

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D75120
2020-03-14 17:19:59 +00:00

62 lines
1.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -jump-threading -S %s | FileCheck %s
declare i1 @cond()
define hidden void @hoge(i1 %c1, i32 %x) {
; CHECK-LABEL: @hoge(
; CHECK-NEXT: bb:
; CHECK-NEXT: br label [[BB13:%.*]]
; CHECK: bb4:
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP7:%.*]], undef
; CHECK-NEXT: br i1 [[TMP3]], label [[BB5:%.*]], label [[BB13]]
; CHECK: bb5:
; CHECK-NEXT: br label [[BB6:%.*]]
; CHECK: bb6:
; CHECK-NEXT: [[TMP7]] = phi i32 [ [[TMP7]], [[BB5]] ], [ [[X:%.*]], [[BB8:%.*]] ]
; CHECK-NEXT: [[C:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C]], label [[BB4:%.*]], label [[BB8]]
; CHECK: bb8:
; CHECK-NEXT: br label [[BB6]]
; CHECK: bb13:
; CHECK-NEXT: ret void
;
bb:
br i1 false, label %bb1, label %bb13
bb1: ; preds = %bb
br label %bb2
bb2: ; preds = %bb12, %bb1
%tmp = phi i32 [ 10, %bb1 ], [ %tmp7, %bb12 ]
%tmp3 = icmp ne i32 %tmp, undef
br label %bb4
bb4: ; preds = %bb2
br i1 %tmp3, label %bb5, label %bb13
bb5: ; preds = %bb4
br label %bb6
bb6: ; preds = %bb8, %bb5
%tmp7 = phi i32 [ %tmp, %bb5 ], [ %x, %bb8 ]
%c = call i1 @cond()
br i1 %c, label %bb9, label %bb8
bb8: ; preds = %bb6
br label %bb6
bb9: ; preds = %bb6
br label %bb10
bb10: ; preds = %bb9
br label %bb12
bb12: ; preds = %bb10
br label %bb2
bb13: ; preds = %bb4
ret void
}