137 lines
3.4 KiB
LLVM
137 lines
3.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -passes=globalopt -S < %s | FileCheck %s
|
|
|
|
@g1 = internal unnamed_addr global i32 0
|
|
@g2 = internal unnamed_addr global i32 0
|
|
@g3 = internal unnamed_addr global i32 0
|
|
@g4 = internal unnamed_addr global i32 0
|
|
@g5 = internal unnamed_addr global i32 0
|
|
@g6 = internal unnamed_addr global i32 0
|
|
@g7 = internal unnamed_addr global i32 0
|
|
@g8 = internal unnamed_addr global ptr null
|
|
@tl = internal thread_local unnamed_addr global i32 0
|
|
|
|
declare void @b()
|
|
|
|
define i1 @dom_const() {
|
|
; CHECK-LABEL: @dom_const(
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
store i1 true, ptr @g1
|
|
call void @b()
|
|
%r = load i1, ptr @g1
|
|
ret i1 %r
|
|
}
|
|
|
|
define i32 @dom_arg(i32 %a) {
|
|
; CHECK-LABEL: @dom_arg(
|
|
; CHECK-NEXT: store i32 [[A:%.*]], ptr @g2, align 4
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load i32, ptr @g2, align 4
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
store i32 %a, ptr @g2
|
|
call void @b()
|
|
%r = load i32, ptr @g2
|
|
ret i32 %r
|
|
}
|
|
|
|
define ptr @dom_thread_local_global() {
|
|
; CHECK-LABEL: @dom_thread_local_global(
|
|
; CHECK-NEXT: store ptr @tl, ptr @g3, align 8
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load ptr, ptr @g3, align 8
|
|
; CHECK-NEXT: ret ptr [[R]]
|
|
;
|
|
store ptr @tl, ptr @g3
|
|
call void @b()
|
|
%r = load ptr, ptr @g3
|
|
ret ptr %r
|
|
}
|
|
|
|
define i32 @dom_different_types() {
|
|
; CHECK-LABEL: @dom_different_types(
|
|
; CHECK-NEXT: store i1 true, ptr @g4, align 1
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load i32, ptr @g4, align 4
|
|
; CHECK-NEXT: ret i32 [[R]]
|
|
;
|
|
store i1 true, ptr @g4
|
|
call void @b()
|
|
%r = load i32, ptr @g4
|
|
ret i32 %r
|
|
}
|
|
|
|
define i1 @no_dom(i1 %i) {
|
|
; CHECK-LABEL: @no_dom(
|
|
; CHECK-NEXT: br i1 [[I:%.*]], label [[BB1:%.*]], label [[END:%.*]]
|
|
; CHECK: bb1:
|
|
; CHECK-NEXT: store i1 true, ptr @g5, align 1
|
|
; CHECK-NEXT: br label [[END]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g5, align 1
|
|
; CHECK-NEXT: ret i1 [[R]]
|
|
;
|
|
br i1 %i, label %bb1, label %end
|
|
bb1:
|
|
store i1 true, ptr @g5
|
|
br label %end
|
|
end:
|
|
call void @b()
|
|
%r = load i1, ptr @g5
|
|
ret i1 %r
|
|
}
|
|
|
|
define i1 @dom_multiple_function_loads() {
|
|
; CHECK-LABEL: @dom_multiple_function_loads(
|
|
; CHECK-NEXT: store i1 true, ptr @g6, align 1
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
store i1 true, ptr @g6
|
|
call void @b()
|
|
%r = load i1, ptr @g6
|
|
ret i1 %r
|
|
}
|
|
|
|
define i1 @other() {
|
|
; CHECK-LABEL: @other(
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g6, align 1
|
|
; CHECK-NEXT: ret i1 [[R]]
|
|
;
|
|
call void @b()
|
|
%r = load i1, ptr @g6
|
|
ret i1 %r
|
|
}
|
|
|
|
define i1 @dom_volatile() {
|
|
; CHECK-LABEL: @dom_volatile(
|
|
; CHECK-NEXT: store i1 true, ptr @g7, align 1
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load volatile i1, ptr @g7, align 1
|
|
; CHECK-NEXT: ret i1 [[R]]
|
|
;
|
|
store i1 true, ptr @g7
|
|
call void @b()
|
|
%r = load volatile i1, ptr @g7
|
|
ret i1 %r
|
|
}
|
|
|
|
define i1 @dom_store_const_and_initializer() {
|
|
; CHECK-LABEL: @dom_store_const_and_initializer(
|
|
; CHECK-NEXT: store i1 true, ptr @g8, align 1
|
|
; CHECK-NEXT: store i1 false, ptr @g8, align 1
|
|
; CHECK-NEXT: call void @b()
|
|
; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g8, align 1
|
|
; CHECK-NEXT: ret i1 [[R]]
|
|
;
|
|
store i1 true, ptr @g8
|
|
store i1 false, ptr @g8
|
|
call void @b()
|
|
%r = load i1, ptr @g8
|
|
ret i1 %r
|
|
}
|