307 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s3 4declare void @use(i1)5 6@G = internal global i32 07 8define void @test1a() {9; CHECK-LABEL: @test1a(10; CHECK-NEXT: [[X:%.*]] = load i32, ptr @G11; CHECK-NEXT: call void @use(i1 true)12; CHECK-NEXT: call void @use(i1 true)13; CHECK-NEXT: call void @use(i1 false)14; CHECK-NEXT: call void @use(i1 false)15; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 2016; CHECK-NEXT: call void @use(i1 [[C_1]])17; CHECK-NEXT: ret void18;19 %X = load i32, ptr @G20 %t.1 = icmp ne i32 %X, 12421 call void @use(i1 %t.1)22 %t.2 = icmp ult i32 %X, 12423 call void @use(i1 %t.2)24 %f.1 = icmp eq i32 %X, 12425 call void @use(i1 %f.1)26 %f.2 = icmp ugt i32 %X, 12327 call void @use(i1 %f.2)28 %c.1 = icmp eq i32 %X, 2029 call void @use(i1 %c.1)30 ret void31}32 33define void @test1b(i1 %c) {34; CHECK-LABEL: @test1b(35; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]36; CHECK: T:37; CHECK-NEXT: store i32 17, ptr @G38; CHECK-NEXT: ret void39; CHECK: F:40; CHECK-NEXT: store i32 123, ptr @G41; CHECK-NEXT: ret void42;43 br i1 %c, label %T, label %F44T:45 store i32 17, ptr @G46 ret void47F:48 store i32 123, ptr @G49 ret void50}51 52 53@H = internal global i32 054 55define void @test2a() {56; CHECK-LABEL: @test2a(57; CHECK-NEXT: [[X:%.*]] = load i32, ptr @H58; CHECK-NEXT: call void @use(i1 true)59; CHECK-NEXT: call void @use(i1 true)60; CHECK-NEXT: call void @use(i1 false)61; CHECK-NEXT: call void @use(i1 false)62; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 2063; CHECK-NEXT: call void @use(i1 [[C_1]])64; CHECK-NEXT: ret void65;66 %X = load i32, ptr @H67 %t.1 = icmp ne i32 %X, 12468 call void @use(i1 %t.1)69 %t.2 = icmp ult i32 %X, 12470 call void @use(i1 %t.2)71 %f.1 = icmp eq i32 %X, 12472 call void @use(i1 %f.1)73 %f.2 = icmp ugt i32 %X, 12374 call void @use(i1 %f.2)75 %c.1 = icmp eq i32 %X, 2076 call void @use(i1 %c.1)77 ret void78}79 80define void @test2b(i1 %c.1, i1 %c.2) {81; CHECK-LABEL: @test2b(82; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]83; CHECK: T:84; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]85; CHECK: T.1:86; CHECK-NEXT: store i32 17, ptr @H87; CHECK-NEXT: ret void88; CHECK: F.1:89; CHECK-NEXT: store i32 20, ptr @H90; CHECK-NEXT: ret void91; CHECK: F:92; CHECK-NEXT: store i32 123, ptr @H93; CHECK-NEXT: ret void94;95 br i1 %c.1, label %T, label %F96T:97 br i1 %c.2, label %T.1, label %F.198 99T.1:100 store i32 17, ptr @H101 ret void102 103F.1:104 store i32 20, ptr @H105 ret void106 107F:108 store i32 123, ptr @H109 ret void110}111 112 113@I = internal global i32 0114 115define void @test3a() {116; CHECK-LABEL: @test3a(117; CHECK-NEXT: [[X:%.*]] = load i32, ptr @I118; CHECK-NEXT: call void @use(i1 true)119; CHECK-NEXT: call void @use(i1 true)120; CHECK-NEXT: call void @use(i1 false)121; CHECK-NEXT: call void @use(i1 false)122; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20123; CHECK-NEXT: call void @use(i1 [[C_1]])124; CHECK-NEXT: ret void125;126 %X = load i32, ptr @I127 %t.1 = icmp ne i32 %X, 124128 call void @use(i1 %t.1)129 %t.2 = icmp ult i32 %X, 124130 call void @use(i1 %t.2)131 %f.1 = icmp eq i32 %X, 124132 call void @use(i1 %f.1)133 %f.2 = icmp ugt i32 %X, 123134 call void @use(i1 %f.2)135 %c.1 = icmp eq i32 %X, 20136 call void @use(i1 %c.1)137 ret void138}139 140define void @test3b(i1 %c.1, i1 %c.2) {141; CHECK-LABEL: @test3b(142; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]143; CHECK: T:144; CHECK-NEXT: br label [[EXIT:%.*]]145; CHECK: F:146; CHECK-NEXT: br label [[EXIT]]147; CHECK: exit:148; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T]] ], [ 123, [[F]] ]149; CHECK-NEXT: store i32 [[P]], ptr @I150; CHECK-NEXT: ret void151;152 br i1 %c.1, label %T, label %F153 154T:155 br label %exit156 157F:158 br label %exit159 160exit:161 %p = phi i32 [ 17, %T ], [ 123, %F ]162 store i32 %p, ptr @I163 ret void164 165}166 167; Make sure stored values are correctly updated to overdefined.168@J = internal global i32 0169 170define void @test4a() {171; CHECK-LABEL: @test4a(172; CHECK-NEXT: [[X:%.*]] = load i32, ptr @J173; CHECK-NEXT: [[C_1:%.*]] = icmp ne i32 [[X]], 124174; CHECK-NEXT: call void @use(i1 [[C_1]])175; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 124176; CHECK-NEXT: call void @use(i1 [[C_2]])177; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[X]], 124178; CHECK-NEXT: call void @use(i1 [[C_3]])179; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 123180; CHECK-NEXT: call void @use(i1 [[C_4]])181; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[X]], 20182; CHECK-NEXT: call void @use(i1 [[C_5]])183; CHECK-NEXT: ret void184;185 %X = load i32, ptr @J186 %c.1 = icmp ne i32 %X, 124187 call void @use(i1 %c.1)188 %c.2 = icmp ult i32 %X, 124189 call void @use(i1 %c.2)190 %c.3 = icmp eq i32 %X, 124191 call void @use(i1 %c.3)192 %c.4 = icmp ugt i32 %X, 123193 call void @use(i1 %c.4)194 %c.5 = icmp eq i32 %X, 20195 call void @use(i1 %c.5)196 ret void197}198 199define void @test4b(i1 %c.1, i1 %c.2, i32 %x) {200; CHECK-LABEL: @test4b(201; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]202; CHECK: T:203; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]204; CHECK: T.1:205; CHECK-NEXT: br label [[EXIT:%.*]]206; CHECK: F.1:207; CHECK-NEXT: br label [[EXIT]]208; CHECK: F:209; CHECK-NEXT: br label [[EXIT]]210; CHECK: exit:211; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T_1]] ], [ [[X:%.*]], [[F_1]] ], [ 123, [[F]] ]212; CHECK-NEXT: store i32 [[P]], ptr @J213; CHECK-NEXT: ret void214;215 br i1 %c.1, label %T, label %F216T:217 br i1 %c.2, label %T.1, label %F.1218 219T.1:220 br label %exit221 222F.1:223 br label %exit224 225F:226 br label %exit227 228exit:229 %p = phi i32 [ 17, %T.1 ], [ %x, %F.1 ], [ 123, %F ]230 store i32 %p, ptr @J231 ret void232}233 234; Same as test1, but storing 4 different values.235 236@K = internal global i32 501237 238define void @test5a() {239; CHECK-LABEL: @test5a(240; CHECK-NEXT: [[X:%.*]] = load i32, ptr @K241; CHECK-NEXT: call void @use(i1 true)242; CHECK-NEXT: call void @use(i1 true)243; CHECK-NEXT: call void @use(i1 false)244; CHECK-NEXT: call void @use(i1 false)245; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 510246; CHECK-NEXT: call void @use(i1 [[C_1]])247; CHECK-NEXT: ret void248;249 %X = load i32, ptr @K250 %t.1 = icmp ne i32 %X, 499251 call void @use(i1 %t.1)252 %t.2 = icmp ult i32 %X, 600253 call void @use(i1 %t.2)254 %f.1 = icmp eq i32 %X, 600255 call void @use(i1 %f.1)256 %f.2 = icmp ugt i32 %X, 600257 call void @use(i1 %f.2)258 %c.1 = icmp eq i32 %X, 510259 call void @use(i1 %c.1)260 ret void261}262 263define void @test5b(i1 %c.1, i1 %c.2) {264; CHECK-LABEL: @test5b(265; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]266; CHECK: T.1:267; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_2:%.*]], label [[F_2:%.*]]268; CHECK: T.2:269; CHECK-NEXT: store i32 500, ptr @K270; CHECK-NEXT: ret void271; CHECK: F.2:272; CHECK-NEXT: store i32 510, ptr @K273; CHECK-NEXT: ret void274; CHECK: F.1:275; CHECK-NEXT: br i1 [[C_2]], label [[T_3:%.*]], label [[F_3:%.*]]276; CHECK: T.3:277; CHECK-NEXT: store i32 520, ptr @K278; CHECK-NEXT: ret void279; CHECK: F.3:280; CHECK-NEXT: store i32 530, ptr @K281; CHECK-NEXT: ret void282;283 br i1 %c.1, label %T.1, label %F.1284 285T.1:286 br i1 %c.2, label %T.2, label %F.2287 288T.2:289 store i32 500, ptr @K290 ret void291 292F.2:293 store i32 510, ptr @K294 ret void295 296F.1:297 br i1 %c.2, label %T.3, label %F.3298 299T.3:300 store i32 520, ptr @K301 ret void302 303F.3:304 store i32 530, ptr @K305 ret void306}307