1e7bc5372SAndreas Jonson; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 21e5f336aSNikita Popov; RUN: opt < %s -passes=ipsccp -S | FileCheck %s --check-prefixes=CHECK,IPSCCP 31e5f336aSNikita Popov; RUN: opt < %s -passes=sccp -S | FileCheck %s --check-prefixes=CHECK,SCCP 4e7bc5372SAndreas Jonson 5e7bc5372SAndreas Jonsondeclare void @use(i1) 6e7bc5372SAndreas Jonsondeclare i32 @get_i32() 7e7bc5372SAndreas Jonson 8e7bc5372SAndreas Jonsondefine void @range_attribute(i32 range(i32 0, 10) %v) { 903e0be90SNikita Popov; CHECK-LABEL: @range_attribute( 1003e0be90SNikita Popov; CHECK-NEXT: call void @use(i1 true) 1103e0be90SNikita Popov; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V:%.*]], 9 1203e0be90SNikita Popov; CHECK-NEXT: call void @use(i1 [[C2]]) 1303e0be90SNikita Popov; CHECK-NEXT: call void @use(i1 false) 1403e0be90SNikita Popov; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8 1503e0be90SNikita Popov; CHECK-NEXT: call void @use(i1 [[C4]]) 1603e0be90SNikita Popov; CHECK-NEXT: ret void 17e7bc5372SAndreas Jonson; 18e7bc5372SAndreas Jonson %c1 = icmp ult i32 %v, 10 19e7bc5372SAndreas Jonson call void @use(i1 %c1) 20e7bc5372SAndreas Jonson %c2 = icmp ult i32 %v, 9 21e7bc5372SAndreas Jonson call void @use(i1 %c2) 22e7bc5372SAndreas Jonson %c3 = icmp ugt i32 %v, 9 23e7bc5372SAndreas Jonson call void @use(i1 %c3) 24e7bc5372SAndreas Jonson %c4 = icmp ugt i32 %v, 8 25e7bc5372SAndreas Jonson call void @use(i1 %c4) 26e7bc5372SAndreas Jonson ret void 27e7bc5372SAndreas Jonson} 28e7bc5372SAndreas Jonson 29e7bc5372SAndreas Jonsondefine i32 @range_attribute_single(i32 range(i32 0, 1) %v) { 301e5f336aSNikita Popov; IPSCCP-LABEL: @range_attribute_single( 311e5f336aSNikita Popov; IPSCCP-NEXT: ret i32 0 321e5f336aSNikita Popov; 331e5f336aSNikita Popov; SCCP-LABEL: @range_attribute_single( 341e5f336aSNikita Popov; SCCP-NEXT: ret i32 [[V:%.*]] 35e7bc5372SAndreas Jonson; 36e7bc5372SAndreas Jonson ret i32 %v 37e7bc5372SAndreas Jonson} 38e7bc5372SAndreas Jonson 39e7bc5372SAndreas Jonsondefine void @call_range_attribute() { 40e7bc5372SAndreas Jonson; CHECK-LABEL: @call_range_attribute( 41e7bc5372SAndreas Jonson; CHECK-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32() 42e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 true) 43e7bc5372SAndreas Jonson; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9 44e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 [[C2]]) 45e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 false) 46e7bc5372SAndreas Jonson; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8 47e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 [[C4]]) 48e7bc5372SAndreas Jonson; CHECK-NEXT: ret void 49e7bc5372SAndreas Jonson; 50e7bc5372SAndreas Jonson %v = call range(i32 0, 10) i32 @get_i32() 51e7bc5372SAndreas Jonson %c1 = icmp ult i32 %v, 10 52e7bc5372SAndreas Jonson call void @use(i1 %c1) 53e7bc5372SAndreas Jonson %c2 = icmp ult i32 %v, 9 54e7bc5372SAndreas Jonson call void @use(i1 %c2) 55e7bc5372SAndreas Jonson %c3 = icmp ugt i32 %v, 9 56e7bc5372SAndreas Jonson call void @use(i1 %c3) 57e7bc5372SAndreas Jonson %c4 = icmp ugt i32 %v, 8 58e7bc5372SAndreas Jonson call void @use(i1 %c4) 59e7bc5372SAndreas Jonson ret void 60e7bc5372SAndreas Jonson} 61e7bc5372SAndreas Jonson 62e7bc5372SAndreas Jonson 63e7bc5372SAndreas Jonsondeclare range(i32 0, 10) i32 @get_i32_in_range() 64e7bc5372SAndreas Jonson 65e7bc5372SAndreas Jonsondefine void @call_range_result() { 66e7bc5372SAndreas Jonson; CHECK-LABEL: @call_range_result( 67e7bc5372SAndreas Jonson; CHECK-NEXT: [[V:%.*]] = call i32 @get_i32_in_range() 68e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 true) 69e7bc5372SAndreas Jonson; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 9 70e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 [[C2]]) 71e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 false) 72e7bc5372SAndreas Jonson; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 8 73e7bc5372SAndreas Jonson; CHECK-NEXT: call void @use(i1 [[C4]]) 74e7bc5372SAndreas Jonson; CHECK-NEXT: ret void 75e7bc5372SAndreas Jonson; 76e7bc5372SAndreas Jonson %v = call i32 @get_i32_in_range() 77e7bc5372SAndreas Jonson %c1 = icmp ult i32 %v, 10 78e7bc5372SAndreas Jonson call void @use(i1 %c1) 79e7bc5372SAndreas Jonson %c2 = icmp ult i32 %v, 9 80e7bc5372SAndreas Jonson call void @use(i1 %c2) 81e7bc5372SAndreas Jonson %c3 = icmp ugt i32 %v, 9 82e7bc5372SAndreas Jonson call void @use(i1 %c3) 83e7bc5372SAndreas Jonson %c4 = icmp ugt i32 %v, 8 84e7bc5372SAndreas Jonson call void @use(i1 %c4) 85e7bc5372SAndreas Jonson ret void 86e7bc5372SAndreas Jonson} 87e7bc5372SAndreas Jonson 88e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_attribute(i32 %v) { 891e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_attribute( 901e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 poison 911e5f336aSNikita Popov; 921e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_attribute( 931e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10 941e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 95e7bc5372SAndreas Jonson; 96e7bc5372SAndreas Jonson %c = icmp ult i32 %v, 10 97e7bc5372SAndreas Jonson ret i1 %c 98e7bc5372SAndreas Jonson} 99e7bc5372SAndreas Jonson 100e7bc5372SAndreas Jonsondefine i1 @ip_range_attribute(i32 range(i32 0, 10) %v) { 1011e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_attribute( 1021e5f336aSNikita Popov; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]]) 1031e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 true 1041e5f336aSNikita Popov; 1051e5f336aSNikita Popov; SCCP-LABEL: @ip_range_attribute( 1061e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]]) 1071e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 108e7bc5372SAndreas Jonson; 109e7bc5372SAndreas Jonson %c = call i1 @ip_cmp_range_attribute(i32 %v) 110e7bc5372SAndreas Jonson ret i1 %c 111e7bc5372SAndreas Jonson} 112e7bc5372SAndreas Jonson 113e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_call(i32 %v) { 1141e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_call( 1151e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 poison 1161e5f336aSNikita Popov; 1171e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_call( 1181e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10 1191e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 120e7bc5372SAndreas Jonson; 121e7bc5372SAndreas Jonson %c = icmp ult i32 %v, 10 122e7bc5372SAndreas Jonson ret i1 %c 123e7bc5372SAndreas Jonson} 124e7bc5372SAndreas Jonson 125e7bc5372SAndreas Jonsondefine i1 @ip_range_call() { 1261e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_call( 1271e5f336aSNikita Popov; IPSCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32() 1281e5f336aSNikita Popov; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]]) 1291e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 true 1301e5f336aSNikita Popov; 1311e5f336aSNikita Popov; SCCP-LABEL: @ip_range_call( 1321e5f336aSNikita Popov; SCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32() 1331e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]]) 1341e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 135e7bc5372SAndreas Jonson; 136e7bc5372SAndreas Jonson %v = call range(i32 0, 10) i32 @get_i32() 137e7bc5372SAndreas Jonson %c = call i1 @ip_cmp_range_call(i32 %v) 138e7bc5372SAndreas Jonson ret i1 %c 139e7bc5372SAndreas Jonson} 140e7bc5372SAndreas Jonson 141e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_range_result(i32 %v) { 1421e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_range_result( 1431e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 poison 1441e5f336aSNikita Popov; 1451e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_range_result( 1461e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10 1471e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 148e7bc5372SAndreas Jonson; 149e7bc5372SAndreas Jonson %c = icmp ult i32 %v, 10 150e7bc5372SAndreas Jonson ret i1 %c 151e7bc5372SAndreas Jonson} 152e7bc5372SAndreas Jonson 153e7bc5372SAndreas Jonsondefine i1 @ip_range_result() { 1541e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_result( 1551e5f336aSNikita Popov; IPSCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32() 1561e5f336aSNikita Popov; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]]) 1571e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 true 1581e5f336aSNikita Popov; 1591e5f336aSNikita Popov; SCCP-LABEL: @ip_range_result( 1601e5f336aSNikita Popov; SCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32() 1611e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]]) 1621e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 163e7bc5372SAndreas Jonson; 164e7bc5372SAndreas Jonson %v = call range(i32 0, 10) i32 @get_i32() 165e7bc5372SAndreas Jonson %c = call i1 @ip_cmp_range_result(i32 %v) 166e7bc5372SAndreas Jonson ret i1 %c 167e7bc5372SAndreas Jonson} 168e7bc5372SAndreas Jonson 169e7bc5372SAndreas Jonsondefine internal i1 @ip_cmp_with_range_attribute(i32 range(i32 0, 10) %v) { 1701e5f336aSNikita Popov; IPSCCP-LABEL: @ip_cmp_with_range_attribute( 1711e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 poison 1721e5f336aSNikita Popov; 1731e5f336aSNikita Popov; SCCP-LABEL: @ip_cmp_with_range_attribute( 1741e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = icmp eq i32 [[V:%.*]], 5 1751e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 176e7bc5372SAndreas Jonson; 177e7bc5372SAndreas Jonson %c = icmp eq i32 %v, 5 178e7bc5372SAndreas Jonson ret i1 %c 179e7bc5372SAndreas Jonson} 180e7bc5372SAndreas Jonson 181e7bc5372SAndreas Jonsondefine i1 @ip_range_attribute_constant() { 1821e5f336aSNikita Popov; IPSCCP-LABEL: @ip_range_attribute_constant( 1831e5f336aSNikita Popov; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5) 1841e5f336aSNikita Popov; IPSCCP-NEXT: ret i1 true 1851e5f336aSNikita Popov; 1861e5f336aSNikita Popov; SCCP-LABEL: @ip_range_attribute_constant( 1871e5f336aSNikita Popov; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5) 1881e5f336aSNikita Popov; SCCP-NEXT: ret i1 [[C]] 189e7bc5372SAndreas Jonson; 190e7bc5372SAndreas Jonson %c = call i1 @ip_cmp_with_range_attribute(i32 5) 191e7bc5372SAndreas Jonson ret i1 %c 192e7bc5372SAndreas Jonson} 193b8c0e8adSNikita Popov 194b8c0e8adSNikita Popovdefine internal i1 @ip_cmp_attribute_overdefined_callee(i32 range(i32 0, 10) %x) { 195b8c0e8adSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_callee( 196*7f59264dSNikita Popov; IPSCCP-NEXT: ret i1 poison 197b8c0e8adSNikita Popov; 198b8c0e8adSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_overdefined_callee( 199b8c0e8adSNikita Popov; SCCP-NEXT: ret i1 true 200b8c0e8adSNikita Popov; 201b8c0e8adSNikita Popov %cmp = icmp ult i32 %x, 10 202b8c0e8adSNikita Popov ret i1 %cmp 203b8c0e8adSNikita Popov} 204b8c0e8adSNikita Popov 205b8c0e8adSNikita Popovdefine i1 @ip_cmp_attribute_overdefined_caller(i32 %x) { 206*7f59264dSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_caller( 207*7f59264dSNikita Popov; IPSCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]]) 208*7f59264dSNikita Popov; IPSCCP-NEXT: ret i1 true 209*7f59264dSNikita Popov; 210*7f59264dSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_overdefined_caller( 211*7f59264dSNikita Popov; SCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]]) 212*7f59264dSNikita Popov; SCCP-NEXT: ret i1 [[RES]] 213b8c0e8adSNikita Popov; 214b8c0e8adSNikita Popov %res = call i1 @ip_cmp_attribute_overdefined_callee(i32 %x) 215b8c0e8adSNikita Popov ret i1 %res 216b8c0e8adSNikita Popov} 217b8c0e8adSNikita Popov 218b8c0e8adSNikita Popovdefine internal i1 @ip_cmp_attribute_intersect_callee(i32 range(i32 0, 10) %x) { 219b8c0e8adSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_intersect_callee( 220*7f59264dSNikita Popov; IPSCCP-NEXT: ret i1 poison 221b8c0e8adSNikita Popov; 222b8c0e8adSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_intersect_callee( 223b8c0e8adSNikita Popov; SCCP-NEXT: [[CMP2:%.*]] = icmp uge i32 [[X:%.*]], 5 224b8c0e8adSNikita Popov; SCCP-NEXT: [[AND:%.*]] = and i1 true, [[CMP2]] 225b8c0e8adSNikita Popov; SCCP-NEXT: ret i1 [[AND]] 226b8c0e8adSNikita Popov; 227b8c0e8adSNikita Popov %cmp1 = icmp ult i32 %x, 10 228b8c0e8adSNikita Popov %cmp2 = icmp uge i32 %x, 5 229b8c0e8adSNikita Popov %and = and i1 %cmp1, %cmp2 230b8c0e8adSNikita Popov ret i1 %and 231b8c0e8adSNikita Popov} 232b8c0e8adSNikita Popov 233b8c0e8adSNikita Popovdefine i1 @ip_cmp_attribute_intersect_caller(i32 range(i32 5, 15) %x) { 234*7f59264dSNikita Popov; IPSCCP-LABEL: @ip_cmp_attribute_intersect_caller( 235*7f59264dSNikita Popov; IPSCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]]) 236*7f59264dSNikita Popov; IPSCCP-NEXT: ret i1 true 237*7f59264dSNikita Popov; 238*7f59264dSNikita Popov; SCCP-LABEL: @ip_cmp_attribute_intersect_caller( 239*7f59264dSNikita Popov; SCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]]) 240*7f59264dSNikita Popov; SCCP-NEXT: ret i1 [[RES]] 241b8c0e8adSNikita Popov; 242b8c0e8adSNikita Popov %res = call i1 @ip_cmp_attribute_intersect_callee(i32 %x) 243b8c0e8adSNikita Popov ret i1 %res 244b8c0e8adSNikita Popov} 245