1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00
llvm-mirror/test/Transforms/InstCombine/pr33689_same_bitwidth.ll
Sanjay Patel 7f2a42d49c [InstCombine] erase instructions leading up to unreachable
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
2020-09-07 10:44:08 -04:00

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
}