forked from OSchip/llvm-project
113 lines
5.7 KiB
LLVM
113 lines
5.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -dse -enable-dse-memoryssa %s -S | FileCheck %s
|
|
|
|
|
|
%struct.ham = type { [3 x double], [3 x double]}
|
|
|
|
declare void @may_throw()
|
|
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg)
|
|
|
|
define void @overlap1(%struct.ham* %arg, i1 %cond) {
|
|
; CHECK-LABEL: @overlap1(
|
|
; CHECK-NEXT: bb:
|
|
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds [[STRUCT_HAM:%.*]], %struct.ham* [[ARG:%.*]], i64 0, i32 0, i64 2
|
|
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 0, i64 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 0, i64 0
|
|
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i64 2
|
|
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i64 1
|
|
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i32 0
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB7:%.*]], label [[BB8:%.*]]
|
|
; CHECK: bb7:
|
|
; CHECK-NEXT: br label [[BB9:%.*]]
|
|
; CHECK: bb8:
|
|
; CHECK-NEXT: br label [[BB9]]
|
|
; CHECK: bb9:
|
|
; CHECK-NEXT: store double 1.000000e+00, double* [[TMP2]], align 8
|
|
; CHECK-NEXT: store double 2.000000e+00, double* [[TMP1]], align 8
|
|
; CHECK-NEXT: store double 3.000000e+00, double* [[TMP]], align 8
|
|
; CHECK-NEXT: store double 4.000000e+00, double* [[TMP5]], align 8
|
|
; CHECK-NEXT: store double 5.000000e+00, double* [[TMP4]], align 8
|
|
; CHECK-NEXT: store double 6.000000e+00, double* [[TMP3]], align 8
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
bb:
|
|
%tmp = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 2
|
|
%tmp1 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 1
|
|
%tmp2 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 0
|
|
%tmp3 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0,i32 1, i64 2
|
|
%tmp4 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 1, i64 1
|
|
%tmp5 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 1, i32 0
|
|
%tmp6 = bitcast double* %tmp2 to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* nonnull align 8 dereferenceable(48) %tmp6, i8 0, i64 48, i1 false)
|
|
br i1 %cond, label %bb7, label %bb8
|
|
|
|
bb7: ; preds = %bb
|
|
br label %bb9
|
|
|
|
bb8: ; preds = %bb
|
|
br label %bb9
|
|
|
|
bb9: ; preds = %bb8, %bb7
|
|
store double 1.0, double* %tmp2, align 8
|
|
store double 2.0, double* %tmp1, align 8
|
|
store double 3.0, double* %tmp, align 8
|
|
store double 4.0, double* %tmp5, align 8
|
|
store double 5.0, double* %tmp4, align 8
|
|
store double 6.0, double* %tmp3, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @overlap2(%struct.ham* %arg, i1 %cond) {
|
|
; CHECK-LABEL: @overlap2(
|
|
; CHECK-NEXT: bb:
|
|
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds [[STRUCT_HAM:%.*]], %struct.ham* [[ARG:%.*]], i64 0, i32 0, i64 2
|
|
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 0, i64 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 0, i64 0
|
|
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i64 2
|
|
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i64 1
|
|
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_HAM]], %struct.ham* [[ARG]], i64 0, i32 1, i32 0
|
|
; CHECK-NEXT: [[TMP6:%.*]] = bitcast double* [[TMP2]] to i8*
|
|
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* nonnull align 8 dereferenceable(48) [[TMP6]], i8 0, i64 48, i1 false)
|
|
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB7:%.*]], label [[BB8:%.*]]
|
|
; CHECK: bb7:
|
|
; CHECK-NEXT: call void @may_throw()
|
|
; CHECK-NEXT: br label [[BB9:%.*]]
|
|
; CHECK: bb8:
|
|
; CHECK-NEXT: br label [[BB9]]
|
|
; CHECK: bb9:
|
|
; CHECK-NEXT: store double 1.000000e+00, double* [[TMP2]], align 8
|
|
; CHECK-NEXT: store double 2.000000e+00, double* [[TMP1]], align 8
|
|
; CHECK-NEXT: store double 3.000000e+00, double* [[TMP]], align 8
|
|
; CHECK-NEXT: store double 4.000000e+00, double* [[TMP5]], align 8
|
|
; CHECK-NEXT: store double 5.000000e+00, double* [[TMP4]], align 8
|
|
; CHECK-NEXT: store double 6.000000e+00, double* [[TMP3]], align 8
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
bb:
|
|
%tmp = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 2
|
|
%tmp1 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 1
|
|
%tmp2 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 0, i64 0
|
|
%tmp3 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0,i32 1, i64 2
|
|
%tmp4 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 1, i64 1
|
|
%tmp5 = getelementptr inbounds %struct.ham, %struct.ham* %arg, i64 0, i32 1, i32 0
|
|
%tmp6 = bitcast double* %tmp2 to i8*
|
|
call void @llvm.memset.p0i8.i64(i8* nonnull align 8 dereferenceable(48) %tmp6, i8 0, i64 48, i1 false)
|
|
br i1 %cond, label %bb7, label %bb8
|
|
|
|
bb7: ; preds = %bb
|
|
call void @may_throw()
|
|
br label %bb9
|
|
|
|
bb8: ; preds = %bb
|
|
br label %bb9
|
|
|
|
bb9: ; preds = %bb8, %bb7
|
|
store double 1.0, double* %tmp2, align 8
|
|
store double 2.0, double* %tmp1, align 8
|
|
store double 3.0, double* %tmp, align 8
|
|
store double 4.0, double* %tmp5, align 8
|
|
store double 5.0, double* %tmp4, align 8
|
|
store double 6.0, double* %tmp3, align 8
|
|
ret void
|
|
}
|