1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
; 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
}
|