mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
7f2a42d49c
Normal dead code elimination ignores assume intrinsics, so we fail to delete assumes that are not meaningful (and potentially worse if they cause conflicts with other assumptions). The motivating example in https://llvm.org/PR47416 suggests that we might have problems upstream from here (difference between C and C++), but this should be a cheap way to make sure we remove more dead code. Differential Revision: https://reviews.llvm.org/D87149
52 lines
1.7 KiB
LLVM
52 lines
1.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -instcombine %s -o - | FileCheck %s
|
|
|
|
; All the "useless" instructions should be removed and we shouldn't crash.
|
|
|
|
target datalayout = "p:16:16"
|
|
|
|
%i64_t = type i64
|
|
|
|
@a = external global i16
|
|
@b = external global i16*
|
|
|
|
define void @f(i1 %cond) {
|
|
; CHECK-LABEL: @f(
|
|
; CHECK-NEXT: bb0:
|
|
; CHECK-NEXT: [[T12:%.*]] = alloca [2 x i32], align 8
|
|
; CHECK-NEXT: [[T12_SUB:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[T12]], i16 0, i16 0
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
|
|
; CHECK: bb1:
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: bb2:
|
|
; CHECK-NEXT: [[T9:%.*]] = load i16*, i16** @b, align 2
|
|
; CHECK-NEXT: store i16 0, i16* [[T9]], align 2
|
|
; CHECK-NEXT: [[T10:%.*]] = load i32, i32* [[T12_SUB]], align 8
|
|
; CHECK-NEXT: [[T11:%.*]] = add i32 [[T10]], -1
|
|
; CHECK-NEXT: store i32 [[T11]], i32* [[T12_SUB]], align 8
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
bb0:
|
|
%t1 = alloca %i64_t
|
|
%t2 = bitcast %i64_t* %t1 to i32*
|
|
%useless3 = bitcast %i64_t* %t1 to i16*
|
|
%useless4 = getelementptr inbounds i16, i16* %useless3, i16 undef
|
|
%useless5 = bitcast i16* %useless4 to i32*
|
|
br i1 %cond, label %bb1, label %bb2
|
|
|
|
bb1: ; preds = %bb0
|
|
%useless6 = insertvalue [1 x i32*] undef, i32* %t2, 0
|
|
%useless7 = insertvalue [1 x i32*] %useless6, i32* null, 0
|
|
%t8 = ptrtoint i32* %t2 to i16
|
|
store i16 %t8, i16* @a
|
|
unreachable
|
|
|
|
bb2: ; preds = %bb0
|
|
%t9 = load i16*, i16** @b
|
|
store i16 0, i16* %t9
|
|
%t10 = load i32, i32* %t2
|
|
%t11 = sub i32 %t10, 1
|
|
store i32 %t11, i32* %t2
|
|
ret void
|
|
}
|