blob: 502803682cced0eee9c608acd85b2b8fda0b2ae8 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
@G = internal global ptr null
@G2 = internal global ptr null
@glob = global { i32, i32 } zeroinitializer
define internal void @Actual() {
; CHECK-LABEL: define internal fastcc void @Actual() unnamed_addr {
; CHECK-NEXT: ret void
;
ret void
}
define void @init() {
; CHECK-LABEL: define void @init() local_unnamed_addr {
; CHECK-NEXT: store ptr @glob, ptr @G2, align 8
; CHECK-NEXT: ret void
;
store ptr @Actual, ptr @G
store ptr @glob, ptr @G2
ret void
}
define void @call() {
; CHECK-LABEL: define void @call() local_unnamed_addr {
; CHECK-NEXT: call fastcc void @Actual()
; CHECK-NEXT: ret void
;
%FP = load ptr, ptr @G
call void %FP()
ret void
}
define i32 @load() {
; CHECK-LABEL: define i32 @load() local_unnamed_addr {
; CHECK-NEXT: [[RES:%.*]] = load i32, ptr @glob, align 4
; CHECK-NEXT: [[B:%.*]] = load i32, ptr getelementptr (i8, ptr @glob, i64 4), align 4
; CHECK-NEXT: [[RES1:%.*]] = add i32 [[RES]], [[B]]
; CHECK-NEXT: ret i32 [[RES1]]
;
%g = load ptr, ptr @G2
%a = load i32, ptr %g
%gep = getelementptr i8, ptr %g, i64 4
%b = load i32, ptr %gep
%res = add i32 %a, %b
ret i32 %res
}
define void @store() {
; CHECK-LABEL: define void @store() local_unnamed_addr {
; CHECK-NEXT: store i32 1, ptr @glob, align 4
; CHECK-NEXT: store i32 2, ptr getelementptr (i8, ptr @glob, i64 4), align 4
; CHECK-NEXT: ret void
;
%g = load ptr, ptr @G2
store i32 1, ptr %g
%gep = getelementptr i8, ptr %g, i64 4
store i32 2, ptr %gep
ret void
}
define void @gep_variable(i64 %offset) {
; CHECK-LABEL: define void @gep_variable(
; CHECK-SAME: i64 [[OFFSET:%.*]]) local_unnamed_addr {
; CHECK-NEXT: [[G:%.*]] = load ptr, ptr @G2, align 8
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[G]], i64 [[OFFSET]]
; CHECK-NEXT: store i32 0, ptr [[GEP]], align 4
; CHECK-NEXT: ret void
;
%g = load ptr, ptr @G2
%gep = getelementptr i8, ptr %g, i64 %offset
store i32 0, ptr %gep
ret void
}
define void @gep_constexpr_complex(i64 %offset) {
; CHECK-LABEL: define void @gep_constexpr_complex(
; CHECK-SAME: i64 [[OFFSET:%.*]]) local_unnamed_addr {
; CHECK-NEXT: [[G:%.*]] = load ptr, ptr @G2, align 8
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[G]], i64 ptrtoint (ptr @glob to i64)
; CHECK-NEXT: store i32 0, ptr [[GEP]], align 4
; CHECK-NEXT: ret void
;
%g = load ptr, ptr @G2
%gep = getelementptr i32, ptr %g, i64 ptrtoint (ptr @glob to i64)
store i32 0, ptr %gep
ret void
}