| ; 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 | |
| } |