245 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s --check-prefixes=CHECK,IPSCCP3; RUN: opt < %s -passes=sccp -S | FileCheck %s --check-prefixes=CHECK,SCCP4 5declare void @use(i1)6declare i32 @get_i32()7 8define void @range_attribute(i32 range(i32 0, 10) %v) {9; CHECK-LABEL: @range_attribute(10; CHECK-NEXT: call void @use(i1 true)11; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V:%.*]], 912; CHECK-NEXT: call void @use(i1 [[C2]])13; CHECK-NEXT: call void @use(i1 false)14; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 815; CHECK-NEXT: call void @use(i1 [[C4]])16; CHECK-NEXT: ret void17;18 %c1 = icmp ult i32 %v, 1019 call void @use(i1 %c1)20 %c2 = icmp ult i32 %v, 921 call void @use(i1 %c2)22 %c3 = icmp ugt i32 %v, 923 call void @use(i1 %c3)24 %c4 = icmp ugt i32 %v, 825 call void @use(i1 %c4)26 ret void27}28 29define i32 @range_attribute_single(i32 range(i32 0, 1) %v) {30; IPSCCP-LABEL: @range_attribute_single(31; IPSCCP-NEXT: ret i32 032;33; SCCP-LABEL: @range_attribute_single(34; SCCP-NEXT: ret i32 [[V:%.*]]35;36 ret i32 %v37}38 39define void @call_range_attribute() {40; CHECK-LABEL: @call_range_attribute(41; CHECK-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()42; CHECK-NEXT: call void @use(i1 true)43; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 944; CHECK-NEXT: call void @use(i1 [[C2]])45; CHECK-NEXT: call void @use(i1 false)46; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 847; CHECK-NEXT: call void @use(i1 [[C4]])48; CHECK-NEXT: ret void49;50 %v = call range(i32 0, 10) i32 @get_i32()51 %c1 = icmp ult i32 %v, 1052 call void @use(i1 %c1)53 %c2 = icmp ult i32 %v, 954 call void @use(i1 %c2)55 %c3 = icmp ugt i32 %v, 956 call void @use(i1 %c3)57 %c4 = icmp ugt i32 %v, 858 call void @use(i1 %c4)59 ret void60}61 62 63declare range(i32 0, 10) i32 @get_i32_in_range()64 65define void @call_range_result() {66; CHECK-LABEL: @call_range_result(67; CHECK-NEXT: [[V:%.*]] = call i32 @get_i32_in_range()68; CHECK-NEXT: call void @use(i1 true)69; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[V]], 970; CHECK-NEXT: call void @use(i1 [[C2]])71; CHECK-NEXT: call void @use(i1 false)72; CHECK-NEXT: [[C4:%.*]] = icmp ugt i32 [[V]], 873; CHECK-NEXT: call void @use(i1 [[C4]])74; CHECK-NEXT: ret void75;76 %v = call i32 @get_i32_in_range()77 %c1 = icmp ult i32 %v, 1078 call void @use(i1 %c1)79 %c2 = icmp ult i32 %v, 980 call void @use(i1 %c2)81 %c3 = icmp ugt i32 %v, 982 call void @use(i1 %c3)83 %c4 = icmp ugt i32 %v, 884 call void @use(i1 %c4)85 ret void86}87 88define internal i1 @ip_cmp_range_attribute(i32 %v) {89; IPSCCP-LABEL: @ip_cmp_range_attribute(90; IPSCCP-NEXT: ret i1 poison91;92; SCCP-LABEL: @ip_cmp_range_attribute(93; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 1094; SCCP-NEXT: ret i1 [[C]]95;96 %c = icmp ult i32 %v, 1097 ret i1 %c98}99 100define i1 @ip_range_attribute(i32 range(i32 0, 10) %v) {101; IPSCCP-LABEL: @ip_range_attribute(102; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]])103; IPSCCP-NEXT: ret i1 true104;105; SCCP-LABEL: @ip_range_attribute(106; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_attribute(i32 [[V:%.*]])107; SCCP-NEXT: ret i1 [[C]]108;109 %c = call i1 @ip_cmp_range_attribute(i32 %v)110 ret i1 %c111}112 113define internal i1 @ip_cmp_range_call(i32 %v) {114; IPSCCP-LABEL: @ip_cmp_range_call(115; IPSCCP-NEXT: ret i1 poison116;117; SCCP-LABEL: @ip_cmp_range_call(118; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10119; SCCP-NEXT: ret i1 [[C]]120;121 %c = icmp ult i32 %v, 10122 ret i1 %c123}124 125define i1 @ip_range_call() {126; IPSCCP-LABEL: @ip_range_call(127; IPSCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()128; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]])129; IPSCCP-NEXT: ret i1 true130;131; SCCP-LABEL: @ip_range_call(132; SCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()133; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_call(i32 [[V]])134; SCCP-NEXT: ret i1 [[C]]135;136 %v = call range(i32 0, 10) i32 @get_i32()137 %c = call i1 @ip_cmp_range_call(i32 %v)138 ret i1 %c139}140 141define internal i1 @ip_cmp_range_result(i32 %v) {142; IPSCCP-LABEL: @ip_cmp_range_result(143; IPSCCP-NEXT: ret i1 poison144;145; SCCP-LABEL: @ip_cmp_range_result(146; SCCP-NEXT: [[C:%.*]] = icmp ult i32 [[V:%.*]], 10147; SCCP-NEXT: ret i1 [[C]]148;149 %c = icmp ult i32 %v, 10150 ret i1 %c151}152 153define i1 @ip_range_result() {154; IPSCCP-LABEL: @ip_range_result(155; IPSCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()156; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]])157; IPSCCP-NEXT: ret i1 true158;159; SCCP-LABEL: @ip_range_result(160; SCCP-NEXT: [[V:%.*]] = call range(i32 0, 10) i32 @get_i32()161; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_range_result(i32 [[V]])162; SCCP-NEXT: ret i1 [[C]]163;164 %v = call range(i32 0, 10) i32 @get_i32()165 %c = call i1 @ip_cmp_range_result(i32 %v)166 ret i1 %c167}168 169define internal i1 @ip_cmp_with_range_attribute(i32 range(i32 0, 10) %v) {170; IPSCCP-LABEL: @ip_cmp_with_range_attribute(171; IPSCCP-NEXT: ret i1 poison172;173; SCCP-LABEL: @ip_cmp_with_range_attribute(174; SCCP-NEXT: [[C:%.*]] = icmp eq i32 [[V:%.*]], 5175; SCCP-NEXT: ret i1 [[C]]176;177 %c = icmp eq i32 %v, 5178 ret i1 %c179}180 181define i1 @ip_range_attribute_constant() {182; IPSCCP-LABEL: @ip_range_attribute_constant(183; IPSCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5)184; IPSCCP-NEXT: ret i1 true185;186; SCCP-LABEL: @ip_range_attribute_constant(187; SCCP-NEXT: [[C:%.*]] = call i1 @ip_cmp_with_range_attribute(i32 5)188; SCCP-NEXT: ret i1 [[C]]189;190 %c = call i1 @ip_cmp_with_range_attribute(i32 5)191 ret i1 %c192}193 194define internal i1 @ip_cmp_attribute_overdefined_callee(i32 range(i32 0, 10) %x) {195; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_callee(196; IPSCCP-NEXT: ret i1 poison197;198; SCCP-LABEL: @ip_cmp_attribute_overdefined_callee(199; SCCP-NEXT: ret i1 true200;201 %cmp = icmp ult i32 %x, 10202 ret i1 %cmp203}204 205define i1 @ip_cmp_attribute_overdefined_caller(i32 %x) {206; IPSCCP-LABEL: @ip_cmp_attribute_overdefined_caller(207; IPSCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]])208; IPSCCP-NEXT: ret i1 true209;210; SCCP-LABEL: @ip_cmp_attribute_overdefined_caller(211; SCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_overdefined_callee(i32 [[X:%.*]])212; SCCP-NEXT: ret i1 [[RES]]213;214 %res = call i1 @ip_cmp_attribute_overdefined_callee(i32 %x)215 ret i1 %res216}217 218define internal i1 @ip_cmp_attribute_intersect_callee(i32 range(i32 0, 10) %x) {219; IPSCCP-LABEL: @ip_cmp_attribute_intersect_callee(220; IPSCCP-NEXT: ret i1 poison221;222; SCCP-LABEL: @ip_cmp_attribute_intersect_callee(223; SCCP-NEXT: [[CMP2:%.*]] = icmp uge i32 [[X:%.*]], 5224; SCCP-NEXT: [[AND:%.*]] = and i1 true, [[CMP2]]225; SCCP-NEXT: ret i1 [[AND]]226;227 %cmp1 = icmp ult i32 %x, 10228 %cmp2 = icmp uge i32 %x, 5229 %and = and i1 %cmp1, %cmp2230 ret i1 %and231}232 233define i1 @ip_cmp_attribute_intersect_caller(i32 range(i32 5, 15) %x) {234; IPSCCP-LABEL: @ip_cmp_attribute_intersect_caller(235; IPSCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]])236; IPSCCP-NEXT: ret i1 true237;238; SCCP-LABEL: @ip_cmp_attribute_intersect_caller(239; SCCP-NEXT: [[RES:%.*]] = call i1 @ip_cmp_attribute_intersect_callee(i32 [[X:%.*]])240; SCCP-NEXT: ret i1 [[RES]]241;242 %res = call i1 @ip_cmp_attribute_intersect_callee(i32 %x)243 ret i1 %res244}245