brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 1760121 Raw
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