1c1c5c47eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=ipsccp -S | FileCheck %s 3c1c5c47eSFlorian Hahn 4c1c5c47eSFlorian Hahndeclare void @use(i1) 5c1c5c47eSFlorian Hahn 6c1c5c47eSFlorian Hahn@G = internal global i32 0 7c1c5c47eSFlorian Hahn 8c1c5c47eSFlorian Hahndefine void @test1a() { 9c1c5c47eSFlorian Hahn; CHECK-LABEL: @test1a( 10*0991da36SNikita Popov; CHECK-NEXT: [[X:%.*]] = load i32, ptr @G 117d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 127d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 137d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 147d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 15c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20 16c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 17c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 18c1c5c47eSFlorian Hahn; 19*0991da36SNikita Popov %X = load i32, ptr @G 20c1c5c47eSFlorian Hahn %t.1 = icmp ne i32 %X, 124 21c1c5c47eSFlorian Hahn call void @use(i1 %t.1) 22c1c5c47eSFlorian Hahn %t.2 = icmp ult i32 %X, 124 23c1c5c47eSFlorian Hahn call void @use(i1 %t.2) 24c1c5c47eSFlorian Hahn %f.1 = icmp eq i32 %X, 124 25c1c5c47eSFlorian Hahn call void @use(i1 %f.1) 26c1c5c47eSFlorian Hahn %f.2 = icmp ugt i32 %X, 123 27c1c5c47eSFlorian Hahn call void @use(i1 %f.2) 28c1c5c47eSFlorian Hahn %c.1 = icmp eq i32 %X, 20 29c1c5c47eSFlorian Hahn call void @use(i1 %c.1) 30c1c5c47eSFlorian Hahn ret void 31c1c5c47eSFlorian Hahn} 32c1c5c47eSFlorian Hahn 33c1c5c47eSFlorian Hahndefine void @test1b(i1 %c) { 34c1c5c47eSFlorian Hahn; CHECK-LABEL: @test1b( 35c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]] 36c1c5c47eSFlorian Hahn; CHECK: T: 37*0991da36SNikita Popov; CHECK-NEXT: store i32 17, ptr @G 38c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 39c1c5c47eSFlorian Hahn; CHECK: F: 40*0991da36SNikita Popov; CHECK-NEXT: store i32 123, ptr @G 41c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 42c1c5c47eSFlorian Hahn; 43c1c5c47eSFlorian Hahn br i1 %c, label %T, label %F 44c1c5c47eSFlorian HahnT: 45*0991da36SNikita Popov store i32 17, ptr @G 46c1c5c47eSFlorian Hahn ret void 47c1c5c47eSFlorian HahnF: 48*0991da36SNikita Popov store i32 123, ptr @G 49c1c5c47eSFlorian Hahn ret void 50c1c5c47eSFlorian Hahn} 51c1c5c47eSFlorian Hahn 52c1c5c47eSFlorian Hahn 53c1c5c47eSFlorian Hahn@H = internal global i32 0 54c1c5c47eSFlorian Hahn 55c1c5c47eSFlorian Hahndefine void @test2a() { 56c1c5c47eSFlorian Hahn; CHECK-LABEL: @test2a( 57*0991da36SNikita Popov; CHECK-NEXT: [[X:%.*]] = load i32, ptr @H 587d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 597d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 607d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 617d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 62c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20 63c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 64c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 65c1c5c47eSFlorian Hahn; 66*0991da36SNikita Popov %X = load i32, ptr @H 67c1c5c47eSFlorian Hahn %t.1 = icmp ne i32 %X, 124 68c1c5c47eSFlorian Hahn call void @use(i1 %t.1) 69c1c5c47eSFlorian Hahn %t.2 = icmp ult i32 %X, 124 70c1c5c47eSFlorian Hahn call void @use(i1 %t.2) 71c1c5c47eSFlorian Hahn %f.1 = icmp eq i32 %X, 124 72c1c5c47eSFlorian Hahn call void @use(i1 %f.1) 73c1c5c47eSFlorian Hahn %f.2 = icmp ugt i32 %X, 123 74c1c5c47eSFlorian Hahn call void @use(i1 %f.2) 75c1c5c47eSFlorian Hahn %c.1 = icmp eq i32 %X, 20 76c1c5c47eSFlorian Hahn call void @use(i1 %c.1) 77c1c5c47eSFlorian Hahn ret void 78c1c5c47eSFlorian Hahn} 79c1c5c47eSFlorian Hahn 80c1c5c47eSFlorian Hahndefine void @test2b(i1 %c.1, i1 %c.2) { 81c1c5c47eSFlorian Hahn; CHECK-LABEL: @test2b( 82c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]] 83c1c5c47eSFlorian Hahn; CHECK: T: 84c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]] 85c1c5c47eSFlorian Hahn; CHECK: T.1: 86*0991da36SNikita Popov; CHECK-NEXT: store i32 17, ptr @H 87c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 88c1c5c47eSFlorian Hahn; CHECK: F.1: 89*0991da36SNikita Popov; CHECK-NEXT: store i32 20, ptr @H 90c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 91c1c5c47eSFlorian Hahn; CHECK: F: 92*0991da36SNikita Popov; CHECK-NEXT: store i32 123, ptr @H 93c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 94c1c5c47eSFlorian Hahn; 95c1c5c47eSFlorian Hahn br i1 %c.1, label %T, label %F 96c1c5c47eSFlorian HahnT: 97c1c5c47eSFlorian Hahn br i1 %c.2, label %T.1, label %F.1 98c1c5c47eSFlorian Hahn 99c1c5c47eSFlorian HahnT.1: 100*0991da36SNikita Popov store i32 17, ptr @H 101c1c5c47eSFlorian Hahn ret void 102c1c5c47eSFlorian Hahn 103c1c5c47eSFlorian HahnF.1: 104*0991da36SNikita Popov store i32 20, ptr @H 105c1c5c47eSFlorian Hahn ret void 106c1c5c47eSFlorian Hahn 107c1c5c47eSFlorian HahnF: 108*0991da36SNikita Popov store i32 123, ptr @H 109c1c5c47eSFlorian Hahn ret void 110c1c5c47eSFlorian Hahn} 111c1c5c47eSFlorian Hahn 112c1c5c47eSFlorian Hahn 113c1c5c47eSFlorian Hahn@I = internal global i32 0 114c1c5c47eSFlorian Hahn 115c1c5c47eSFlorian Hahndefine void @test3a() { 116c1c5c47eSFlorian Hahn; CHECK-LABEL: @test3a( 117*0991da36SNikita Popov; CHECK-NEXT: [[X:%.*]] = load i32, ptr @I 1187d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1197d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 1207d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 1217d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 122c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20 123c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 124c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 125c1c5c47eSFlorian Hahn; 126*0991da36SNikita Popov %X = load i32, ptr @I 127c1c5c47eSFlorian Hahn %t.1 = icmp ne i32 %X, 124 128c1c5c47eSFlorian Hahn call void @use(i1 %t.1) 129c1c5c47eSFlorian Hahn %t.2 = icmp ult i32 %X, 124 130c1c5c47eSFlorian Hahn call void @use(i1 %t.2) 131c1c5c47eSFlorian Hahn %f.1 = icmp eq i32 %X, 124 132c1c5c47eSFlorian Hahn call void @use(i1 %f.1) 133c1c5c47eSFlorian Hahn %f.2 = icmp ugt i32 %X, 123 134c1c5c47eSFlorian Hahn call void @use(i1 %f.2) 135c1c5c47eSFlorian Hahn %c.1 = icmp eq i32 %X, 20 136c1c5c47eSFlorian Hahn call void @use(i1 %c.1) 137c1c5c47eSFlorian Hahn ret void 138c1c5c47eSFlorian Hahn} 139c1c5c47eSFlorian Hahn 140c1c5c47eSFlorian Hahndefine void @test3b(i1 %c.1, i1 %c.2) { 141c1c5c47eSFlorian Hahn; CHECK-LABEL: @test3b( 142c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]] 143c1c5c47eSFlorian Hahn; CHECK: T: 144c1c5c47eSFlorian Hahn; CHECK-NEXT: br label [[EXIT:%.*]] 145c1c5c47eSFlorian Hahn; CHECK: F: 146c1c5c47eSFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 147c1c5c47eSFlorian Hahn; CHECK: exit: 148c1c5c47eSFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T]] ], [ 123, [[F]] ] 149*0991da36SNikita Popov; CHECK-NEXT: store i32 [[P]], ptr @I 150c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 151c1c5c47eSFlorian Hahn; 152c1c5c47eSFlorian Hahn br i1 %c.1, label %T, label %F 153c1c5c47eSFlorian Hahn 154c1c5c47eSFlorian HahnT: 155c1c5c47eSFlorian Hahn br label %exit 156c1c5c47eSFlorian Hahn 157c1c5c47eSFlorian HahnF: 158c1c5c47eSFlorian Hahn br label %exit 159c1c5c47eSFlorian Hahn 160c1c5c47eSFlorian Hahnexit: 161c1c5c47eSFlorian Hahn %p = phi i32 [ 17, %T ], [ 123, %F ] 162*0991da36SNikita Popov store i32 %p, ptr @I 163c1c5c47eSFlorian Hahn ret void 164c1c5c47eSFlorian Hahn 165c1c5c47eSFlorian Hahn} 166c1c5c47eSFlorian Hahn 167c1c5c47eSFlorian Hahn; Make sure stored values are correctly updated to overdefined. 168c1c5c47eSFlorian Hahn@J = internal global i32 0 169c1c5c47eSFlorian Hahn 170c1c5c47eSFlorian Hahndefine void @test4a() { 171c1c5c47eSFlorian Hahn; CHECK-LABEL: @test4a( 172*0991da36SNikita Popov; CHECK-NEXT: [[X:%.*]] = load i32, ptr @J 173c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ne i32 [[X]], 124 174c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 175c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 124 176c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 177c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[X]], 124 178c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 179c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 123 180c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 181c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[X]], 20 182c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 183c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 184c1c5c47eSFlorian Hahn; 185*0991da36SNikita Popov %X = load i32, ptr @J 186c1c5c47eSFlorian Hahn %c.1 = icmp ne i32 %X, 124 187c1c5c47eSFlorian Hahn call void @use(i1 %c.1) 188c1c5c47eSFlorian Hahn %c.2 = icmp ult i32 %X, 124 189c1c5c47eSFlorian Hahn call void @use(i1 %c.2) 190c1c5c47eSFlorian Hahn %c.3 = icmp eq i32 %X, 124 191c1c5c47eSFlorian Hahn call void @use(i1 %c.3) 192c1c5c47eSFlorian Hahn %c.4 = icmp ugt i32 %X, 123 193c1c5c47eSFlorian Hahn call void @use(i1 %c.4) 194c1c5c47eSFlorian Hahn %c.5 = icmp eq i32 %X, 20 195c1c5c47eSFlorian Hahn call void @use(i1 %c.5) 196c1c5c47eSFlorian Hahn ret void 197c1c5c47eSFlorian Hahn} 198c1c5c47eSFlorian Hahn 199c1c5c47eSFlorian Hahndefine void @test4b(i1 %c.1, i1 %c.2, i32 %x) { 200c1c5c47eSFlorian Hahn; CHECK-LABEL: @test4b( 201c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]] 202c1c5c47eSFlorian Hahn; CHECK: T: 203c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]] 204c1c5c47eSFlorian Hahn; CHECK: T.1: 205c1c5c47eSFlorian Hahn; CHECK-NEXT: br label [[EXIT:%.*]] 206c1c5c47eSFlorian Hahn; CHECK: F.1: 207c1c5c47eSFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 208c1c5c47eSFlorian Hahn; CHECK: F: 209c1c5c47eSFlorian Hahn; CHECK-NEXT: br label [[EXIT]] 210c1c5c47eSFlorian Hahn; CHECK: exit: 211c1c5c47eSFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T_1]] ], [ [[X:%.*]], [[F_1]] ], [ 123, [[F]] ] 212*0991da36SNikita Popov; CHECK-NEXT: store i32 [[P]], ptr @J 213c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 214c1c5c47eSFlorian Hahn; 215c1c5c47eSFlorian Hahn br i1 %c.1, label %T, label %F 216c1c5c47eSFlorian HahnT: 217c1c5c47eSFlorian Hahn br i1 %c.2, label %T.1, label %F.1 218c1c5c47eSFlorian Hahn 219c1c5c47eSFlorian HahnT.1: 220c1c5c47eSFlorian Hahn br label %exit 221c1c5c47eSFlorian Hahn 222c1c5c47eSFlorian HahnF.1: 223c1c5c47eSFlorian Hahn br label %exit 224c1c5c47eSFlorian Hahn 225c1c5c47eSFlorian HahnF: 226c1c5c47eSFlorian Hahn br label %exit 227c1c5c47eSFlorian Hahn 228c1c5c47eSFlorian Hahnexit: 229c1c5c47eSFlorian Hahn %p = phi i32 [ 17, %T.1 ], [ %x, %F.1 ], [ 123, %F ] 230*0991da36SNikita Popov store i32 %p, ptr @J 231c1c5c47eSFlorian Hahn ret void 232c1c5c47eSFlorian Hahn} 233c1c5c47eSFlorian Hahn 234c1c5c47eSFlorian Hahn; Same as test1, but storing 4 different values. 235c1c5c47eSFlorian Hahn 2367d57d22bSFlorian Hahn@K = internal global i32 501 237c1c5c47eSFlorian Hahn 238c1c5c47eSFlorian Hahndefine void @test5a() { 239c1c5c47eSFlorian Hahn; CHECK-LABEL: @test5a( 240*0991da36SNikita Popov; CHECK-NEXT: [[X:%.*]] = load i32, ptr @K 2417d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 2427d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 2437d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 2447d57d22bSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 245c1c5c47eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 510 246c1c5c47eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 247c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 248c1c5c47eSFlorian Hahn; 249*0991da36SNikita Popov %X = load i32, ptr @K 250c1c5c47eSFlorian Hahn %t.1 = icmp ne i32 %X, 499 251c1c5c47eSFlorian Hahn call void @use(i1 %t.1) 252c1c5c47eSFlorian Hahn %t.2 = icmp ult i32 %X, 600 253c1c5c47eSFlorian Hahn call void @use(i1 %t.2) 254c1c5c47eSFlorian Hahn %f.1 = icmp eq i32 %X, 600 255c1c5c47eSFlorian Hahn call void @use(i1 %f.1) 256c1c5c47eSFlorian Hahn %f.2 = icmp ugt i32 %X, 600 257c1c5c47eSFlorian Hahn call void @use(i1 %f.2) 258c1c5c47eSFlorian Hahn %c.1 = icmp eq i32 %X, 510 259c1c5c47eSFlorian Hahn call void @use(i1 %c.1) 260c1c5c47eSFlorian Hahn ret void 261c1c5c47eSFlorian Hahn} 262c1c5c47eSFlorian Hahn 263c1c5c47eSFlorian Hahndefine void @test5b(i1 %c.1, i1 %c.2) { 264c1c5c47eSFlorian Hahn; CHECK-LABEL: @test5b( 265c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T_1:%.*]], label [[F_1:%.*]] 266c1c5c47eSFlorian Hahn; CHECK: T.1: 267c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_2:%.*]], label [[F_2:%.*]] 268c1c5c47eSFlorian Hahn; CHECK: T.2: 269*0991da36SNikita Popov; CHECK-NEXT: store i32 500, ptr @K 270c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 271c1c5c47eSFlorian Hahn; CHECK: F.2: 272*0991da36SNikita Popov; CHECK-NEXT: store i32 510, ptr @K 273c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 274c1c5c47eSFlorian Hahn; CHECK: F.1: 275c1c5c47eSFlorian Hahn; CHECK-NEXT: br i1 [[C_2]], label [[T_3:%.*]], label [[F_3:%.*]] 276c1c5c47eSFlorian Hahn; CHECK: T.3: 277*0991da36SNikita Popov; CHECK-NEXT: store i32 520, ptr @K 278c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 279c1c5c47eSFlorian Hahn; CHECK: F.3: 280*0991da36SNikita Popov; CHECK-NEXT: store i32 530, ptr @K 281c1c5c47eSFlorian Hahn; CHECK-NEXT: ret void 282c1c5c47eSFlorian Hahn; 283c1c5c47eSFlorian Hahn br i1 %c.1, label %T.1, label %F.1 284c1c5c47eSFlorian Hahn 285c1c5c47eSFlorian HahnT.1: 286c1c5c47eSFlorian Hahn br i1 %c.2, label %T.2, label %F.2 287c1c5c47eSFlorian Hahn 288c1c5c47eSFlorian HahnT.2: 289*0991da36SNikita Popov store i32 500, ptr @K 290c1c5c47eSFlorian Hahn ret void 291c1c5c47eSFlorian Hahn 292c1c5c47eSFlorian HahnF.2: 293*0991da36SNikita Popov store i32 510, ptr @K 294c1c5c47eSFlorian Hahn ret void 295c1c5c47eSFlorian Hahn 296c1c5c47eSFlorian HahnF.1: 297c1c5c47eSFlorian Hahn br i1 %c.2, label %T.3, label %F.3 298c1c5c47eSFlorian Hahn 299c1c5c47eSFlorian HahnT.3: 300*0991da36SNikita Popov store i32 520, ptr @K 301c1c5c47eSFlorian Hahn ret void 302c1c5c47eSFlorian Hahn 303c1c5c47eSFlorian HahnF.3: 304*0991da36SNikita Popov store i32 530, ptr @K 305c1c5c47eSFlorian Hahn ret void 306c1c5c47eSFlorian Hahn} 307