xref: /llvm-project/llvm/test/Transforms/SCCP/constant-range-struct.ll (revision 8ebb3eac02a926ffa4298c12834c57aefb2e8579)
19cd68bfaSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*8ebb3eacSBjorn Pettersson; RUN: opt %s -passes=ipsccp -S | FileCheck %s
39cd68bfaSFlorian Hahn
49cd68bfaSFlorian Hahndeclare i1 @cond()
59cd68bfaSFlorian Hahndeclare void @use(i1)
69cd68bfaSFlorian Hahn
79cd68bfaSFlorian Hahndefine internal {i64, i64} @struct1() {
89cd68bfaSFlorian Hahn; CHECK-LABEL: @struct1(
99cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
109cd68bfaSFlorian Hahn; CHECK-NEXT:    br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]
119cd68bfaSFlorian Hahn; CHECK:       true:
129cd68bfaSFlorian Hahn; CHECK-NEXT:    br label [[EXIT:%.*]]
139cd68bfaSFlorian Hahn; CHECK:       false:
149cd68bfaSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
159cd68bfaSFlorian Hahn; CHECK:       exit:
169cd68bfaSFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = phi { i64, i64 } [ { i64 20, i64 200 }, [[TRUE]] ], [ { i64 30, i64 300 }, [[FALSE]] ]
179cd68bfaSFlorian Hahn; CHECK-NEXT:    ret { i64, i64 } [[R]]
189cd68bfaSFlorian Hahn;
199cd68bfaSFlorian Hahn  %c = call i1 @cond()
209cd68bfaSFlorian Hahn  br i1 %c, label %true, label %false
219cd68bfaSFlorian Hahn
229cd68bfaSFlorian Hahntrue:
239cd68bfaSFlorian Hahn  %s.1 = insertvalue {i64, i64} undef, i64 20, 0
249cd68bfaSFlorian Hahn  %s.2 = insertvalue {i64, i64} %s.1, i64 200, 1
259cd68bfaSFlorian Hahn  br label %exit
269cd68bfaSFlorian Hahn
279cd68bfaSFlorian Hahnfalse:
289cd68bfaSFlorian Hahn  %s.3 = insertvalue {i64, i64} undef, i64 30, 0
299cd68bfaSFlorian Hahn  %s.4 = insertvalue {i64, i64} %s.3, i64 300, 1
309cd68bfaSFlorian Hahn  br label %exit
319cd68bfaSFlorian Hahn
329cd68bfaSFlorian Hahnexit:
339cd68bfaSFlorian Hahn  %r = phi {i64, i64} [ %s.2, %true], [ %s.4, %false ]
349cd68bfaSFlorian Hahn  ret {i64, i64} %r
359cd68bfaSFlorian Hahn}
369cd68bfaSFlorian Hahn
379cd68bfaSFlorian Hahndefine void @struct1_caller() {
389cd68bfaSFlorian Hahn; CHECK-LABEL: @struct1_caller(
399cd68bfaSFlorian Hahn; CHECK-NEXT:    [[S:%.*]] = call { i64, i64 } @struct1()
409cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 0
419cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 1
429cd68bfaSFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ne i64 [[V1]], 10
439cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
449cd68bfaSFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i64 [[V1]], 100
459cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_2]])
469cd68bfaSFlorian Hahn; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i64 [[V2]], 0
479cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_3]])
489cd68bfaSFlorian Hahn; CHECK-NEXT:    [[T_4:%.*]] = icmp ult i64 [[V2]], 301
499cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_4]])
509cd68bfaSFlorian Hahn; CHECK-NEXT:    ret void
519cd68bfaSFlorian Hahn;
529cd68bfaSFlorian Hahn  %s = call {i64, i64} @struct1()
539cd68bfaSFlorian Hahn  %v1 = extractvalue {i64, i64} %s, 0
549cd68bfaSFlorian Hahn  %v2 = extractvalue {i64, i64} %s, 1
559cd68bfaSFlorian Hahn
569cd68bfaSFlorian Hahn  %t.1 = icmp ne i64 %v1, 10
579cd68bfaSFlorian Hahn  call void @use(i1 %t.1)
589cd68bfaSFlorian Hahn  %t.2 = icmp ult i64 %v1, 100
599cd68bfaSFlorian Hahn  call void @use(i1 %t.2)
609cd68bfaSFlorian Hahn  %t.3 = icmp ne i64 %v2, 0
619cd68bfaSFlorian Hahn  call void @use(i1 %t.3)
629cd68bfaSFlorian Hahn  %t.4 = icmp ult i64 %v2, 301
639cd68bfaSFlorian Hahn  call void @use(i1 %t.4)
649cd68bfaSFlorian Hahn
659cd68bfaSFlorian Hahn  ret void
669cd68bfaSFlorian Hahn}
679cd68bfaSFlorian Hahn
689cd68bfaSFlorian Hahndefine internal {i64, i64} @struct2() {
699cd68bfaSFlorian Hahn; CHECK-LABEL: @struct2(
709cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
719cd68bfaSFlorian Hahn; CHECK-NEXT:    br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]
729cd68bfaSFlorian Hahn; CHECK:       true:
739cd68bfaSFlorian Hahn; CHECK-NEXT:    br label [[EXIT:%.*]]
749cd68bfaSFlorian Hahn; CHECK:       false:
759cd68bfaSFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
769cd68bfaSFlorian Hahn; CHECK:       exit:
779cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V1:%.*]] = phi i64 [ 20, [[TRUE]] ], [ 30, [[FALSE]] ]
789cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V2:%.*]] = phi i64 [ 200, [[TRUE]] ], [ 300, [[FALSE]] ]
799cd68bfaSFlorian Hahn; CHECK-NEXT:    [[S_1:%.*]] = insertvalue { i64, i64 } undef, i64 [[V1]], 0
809cd68bfaSFlorian Hahn; CHECK-NEXT:    [[S_2:%.*]] = insertvalue { i64, i64 } [[S_1]], i64 [[V2]], 1
819cd68bfaSFlorian Hahn; CHECK-NEXT:    ret { i64, i64 } [[S_2]]
829cd68bfaSFlorian Hahn;
839cd68bfaSFlorian Hahn  %c = call i1 @cond()
849cd68bfaSFlorian Hahn  br i1 %c, label %true, label %false
859cd68bfaSFlorian Hahn
869cd68bfaSFlorian Hahntrue:
879cd68bfaSFlorian Hahn  br label %exit
889cd68bfaSFlorian Hahn
899cd68bfaSFlorian Hahnfalse:
909cd68bfaSFlorian Hahn  br label %exit
919cd68bfaSFlorian Hahn
929cd68bfaSFlorian Hahnexit:
939cd68bfaSFlorian Hahn  %v1 = phi i64 [ 20, %true ], [ 30, %false ]
949cd68bfaSFlorian Hahn  %v2 = phi i64 [ 200, %true ], [ 300, %false ]
959cd68bfaSFlorian Hahn  %s.1 = insertvalue {i64, i64} undef, i64 %v1, 0
969cd68bfaSFlorian Hahn  %s.2 = insertvalue {i64, i64} %s.1, i64 %v2, 1
979cd68bfaSFlorian Hahn  ret {i64, i64} %s.2
989cd68bfaSFlorian Hahn}
999cd68bfaSFlorian Hahn
1009cd68bfaSFlorian Hahndefine void @struct2_caller() {
1019cd68bfaSFlorian Hahn; CHECK-LABEL: @struct2_caller(
1029cd68bfaSFlorian Hahn; CHECK-NEXT:    [[S:%.*]] = call { i64, i64 } @struct2()
1039cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V1:%.*]] = extractvalue { i64, i64 } [[S]], 0
1049cd68bfaSFlorian Hahn; CHECK-NEXT:    [[V2:%.*]] = extractvalue { i64, i64 } [[S]], 1
10501f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
10601f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
10701f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
10801f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 true)
10901f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
11001f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
11101f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
11201f999aeSFlorian Hahn; CHECK-NEXT:    call void @use(i1 false)
1139cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i64 [[V1]], 25
1149cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
1159cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i64 [[V1]], 25
1169cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_2]])
1179cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i64 [[V2]], 250
1189cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_3]])
1199cd68bfaSFlorian Hahn; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i64 [[V2]], 250
1209cd68bfaSFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_4]])
1219cd68bfaSFlorian Hahn; CHECK-NEXT:    ret void
1229cd68bfaSFlorian Hahn;
1239cd68bfaSFlorian Hahn  %s = call {i64, i64} @struct2()
1249cd68bfaSFlorian Hahn  %v1 = extractvalue {i64, i64} %s, 0
1259cd68bfaSFlorian Hahn  %v2 = extractvalue {i64, i64} %s, 1
1269cd68bfaSFlorian Hahn
1279cd68bfaSFlorian Hahn  %t.1 = icmp ne i64 %v1, 10
1289cd68bfaSFlorian Hahn  call void @use(i1 %t.1)
1299cd68bfaSFlorian Hahn  %t.2 = icmp ult i64 %v1, 100
1309cd68bfaSFlorian Hahn  call void @use(i1 %t.2)
1319cd68bfaSFlorian Hahn  %t.3 = icmp ne i64 %v2, 0
1329cd68bfaSFlorian Hahn  call void @use(i1 %t.3)
1339cd68bfaSFlorian Hahn  %t.4 = icmp ult i64 %v2, 301
1349cd68bfaSFlorian Hahn  call void @use(i1 %t.4)
1359cd68bfaSFlorian Hahn
1369cd68bfaSFlorian Hahn  %f.1 = icmp eq i64 %v1, 10
1379cd68bfaSFlorian Hahn  call void @use(i1 %f.1)
1389cd68bfaSFlorian Hahn  %f.2 = icmp ult i64 %v1, 19
1399cd68bfaSFlorian Hahn  call void @use(i1 %f.2)
1409cd68bfaSFlorian Hahn  %f.3 = icmp eq i64 %v2, 50
1419cd68bfaSFlorian Hahn  call void @use(i1 %f.3)
1429cd68bfaSFlorian Hahn  %f.4 = icmp ugt i64 %v2, 301
1439cd68bfaSFlorian Hahn  call void @use(i1 %f.4)
1449cd68bfaSFlorian Hahn
1459cd68bfaSFlorian Hahn  %c.1 = icmp eq i64 %v1, 25
1469cd68bfaSFlorian Hahn  call void @use(i1 %c.1)
1479cd68bfaSFlorian Hahn  %c.2 = icmp ult i64 %v1, 25
1489cd68bfaSFlorian Hahn  call void @use(i1 %c.2)
1499cd68bfaSFlorian Hahn  %c.3 = icmp eq i64 %v2, 250
1509cd68bfaSFlorian Hahn  call void @use(i1 %c.3)
1519cd68bfaSFlorian Hahn  %c.4 = icmp ugt i64 %v2, 250
1529cd68bfaSFlorian Hahn  call void @use(i1 %c.4)
1539cd68bfaSFlorian Hahn
1549cd68bfaSFlorian Hahn  ret void
1559cd68bfaSFlorian Hahn}
156