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