1; RUN: opt < %s -ipsccp -S | FileCheck %s 2 3;;======================== test1 4 5define internal i32 @test1a(i32 %A) { 6 %X = add i32 1, 2 7 ret i32 %A 8} 9; CHECK-LABEL: define internal i32 @test1a( 10; CHECK: ret i32 undef 11 12define i32 @test1b() { 13 %X = call i32 @test1a( i32 17 ) 14 ret i32 %X 15 16; CHECK-LABEL: define i32 @test1b( 17; CHECK: ret i32 17 18} 19 20 21 22;;======================== test2 23 24define internal i32 @test2a(i32 %A) { 25 %C = icmp eq i32 %A, 0 26 br i1 %C, label %T, label %F 27T: 28 %B = call i32 @test2a( i32 0 ) 29 ret i32 0 30F: 31 %C.upgrd.1 = call i32 @test2a(i32 1) 32 ret i32 %C.upgrd.1 33} 34; CHECK-LABEL: define internal i32 @test2a( 35; CHECK-NEXT: br label %T 36; CHECK: ret i32 undef 37 38 39define i32 @test2b() { 40 %X = call i32 @test2a(i32 0) 41 ret i32 %X 42} 43; CHECK-LABEL: define i32 @test2b( 44; CHECK-NEXT: %X = call i32 @test2a(i32 0) 45; CHECK-NEXT: ret i32 0 46 47 48;;======================== test3 49 50@G = internal global i32 undef 51 52define void @test3a() { 53 %X = load i32, i32* @G 54 store i32 %X, i32* @G 55 ret void 56} 57; CHECK-LABEL: define void @test3a( 58; CHECK-NEXT: ret void 59 60 61define i32 @test3b() { 62 %V = load i32, i32* @G 63 %C = icmp eq i32 %V, 17 64 br i1 %C, label %T, label %F 65T: 66 store i32 17, i32* @G 67 ret i32 %V 68F: 69 store i32 123, i32* @G 70 ret i32 0 71} 72; CHECK-LABEL: define i32 @test3b( 73; CHECK-NOT: store 74; CHECK: ret i32 0 75 76 77;;======================== test4 78 79define internal {i64,i64} @test4a() { 80 %a = insertvalue {i64,i64} undef, i64 4, 1 81 %b = insertvalue {i64,i64} %a, i64 5, 0 82 ret {i64,i64} %b 83} 84 85define i64 @test4b() { 86 %a = invoke {i64,i64} @test4a() 87 to label %A unwind label %B 88A: 89 %b = extractvalue {i64,i64} %a, 0 90 %c = call i64 @test4c(i64 %b) 91 ret i64 %c 92B: 93 %val = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 94 catch i8* null 95 ret i64 0 96} 97; CHECK: define i64 @test4b() 98; CHECK: %c = call i64 @test4c(i64 5) 99; CHECK-NEXT: ret i64 5 100 101 102define internal i64 @test4c(i64 %a) { 103 ret i64 %a 104} 105; CHECK-LABEL: define internal i64 @test4c( 106; CHECK: ret i64 undef 107 108 109 110;;======================== test5 111 112; PR4313 113define internal {i64,i64} @test5a() { 114 %a = insertvalue {i64,i64} undef, i64 4, 1 115 %b = insertvalue {i64,i64} %a, i64 5, 0 116 ret {i64,i64} %b 117} 118 119define i64 @test5b() { 120 %a = invoke {i64,i64} @test5a() 121 to label %A unwind label %B 122A: 123 %c = call i64 @test5c({i64,i64} %a) 124 ret i64 %c 125B: 126 %val = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 127 catch i8* null 128 ret i64 0 129} 130 131; CHECK: define i64 @test5b() 132; CHECK: A: 133; CHECK-NEXT: %c = call i64 @test5c({ i64, i64 } %a) 134; CHECK-NEXT: ret i64 5 135 136define internal i64 @test5c({i64,i64} %a) { 137 %b = extractvalue {i64,i64} %a, 0 138 ret i64 %b 139} 140 141 142;;======================== test6 143 144define i64 @test6a() { 145 ret i64 0 146} 147 148define i64 @test6b() { 149 %a = call i64 @test6a() 150 ret i64 %a 151} 152; CHECK-LABEL: define i64 @test6b( 153; CHECK: ret i64 0 154 155;;======================== test7 156 157 158%T = type {i32,i32} 159 160define internal %T @test7a(i32 %A) { 161 %X = add i32 1, %A 162 %mrv0 = insertvalue %T undef, i32 %X, 0 163 %mrv1 = insertvalue %T %mrv0, i32 %A, 1 164 ret %T %mrv1 165; CHECK-LABEL: @test7a( 166; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0 167; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1 168} 169 170define i32 @test7b() { 171 %X = call %T @test7a(i32 17) 172 %Y = extractvalue %T %X, 0 173 %Z = add i32 %Y, %Y 174 ret i32 %Z 175; CHECK-LABEL: define i32 @test7b( 176; CHECK-NEXT: call %T @test7a(i32 17) 177; CHECK-NEXT: ret i32 36 178} 179 180;;======================== test8 181 182 183define internal {} @test8a(i32 %A, i32* %P) { 184 store i32 %A, i32* %P 185 ret {} {} 186; CHECK-LABEL: @test8a( 187; CHECK-NEXT: store i32 5, 188; CHECK-NEXT: ret 189} 190 191define void @test8b(i32* %P) { 192 %X = call {} @test8a(i32 5, i32* %P) 193 ret void 194; CHECK-LABEL: define void @test8b( 195; CHECK-NEXT: call {} @test8a 196; CHECK-NEXT: ret void 197} 198 199;;======================== test9 200 201@test9g = internal global { } zeroinitializer 202 203define void @test9() { 204entry: 205 %local_foo = alloca { } 206 load { }, { }* @test9g 207 store { } %0, { }* %local_foo 208 ret void 209} 210 211declare i32 @__gxx_personality_v0(...) 212 213;;======================== test10 214 215define i32 @test10a() nounwind { 216entry: 217 %call = call i32 @test10b(i32 undef) 218 ret i32 %call 219; CHECK-LABEL: define i32 @test10a( 220; CHECK: ret i32 0 221} 222 223define internal i32 @test10b(i32 %x) nounwind { 224entry: 225 %r = and i32 %x, 1 226 ret i32 %r 227; CHECK-LABEL: define internal i32 @test10b( 228; CHECK: ret i32 undef 229} 230 231;;======================== test11 232 233define i64 @test11a() { 234 %xor = xor i64 undef, undef 235 ret i64 %xor 236; CHECK-LABEL: define i64 @test11a 237; CHECK: ret i64 0 238} 239 240define void @test11b() { 241 %call1 = call i64 @test11a() 242 %call2 = call i64 @llvm.ctpop.i64(i64 %call1) 243 ret void 244; CHECK-LABEL: define void @test11b 245; CHECK: %[[call1:.*]] = call i64 @test11a() 246; CHECK: %[[call2:.*]] = call i64 @llvm.ctpop.i64(i64 0) 247} 248 249declare i64 @llvm.ctpop.i64(i64) 250