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