154 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)5define void @sdiv1_cmp_constants(i32 %x) {6; CHECK-LABEL: @sdiv1_cmp_constants(7; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]]8; CHECK-NEXT: [[C_0:%.*]] = icmp slt i32 0, [[D]]9; CHECK-NEXT: call void @use(i1 [[C_0]])10; CHECK-NEXT: call void @use(i1 false)11; CHECK-NEXT: call void @use(i1 false)12; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 1, [[D]]13; CHECK-NEXT: call void @use(i1 [[C_3]])14; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 0, [[D]]15; CHECK-NEXT: call void @use(i1 [[C_4]])16; CHECK-NEXT: call void @use(i1 false)17; CHECK-NEXT: ret void18;19 %d = sdiv i32 1, %x20 %c.0 = icmp slt i32 0, %d21 call void @use(i1 %c.0)22 %c.1 = icmp slt i32 1, %d23 call void @use(i1 %c.1)24 %c.2 = icmp slt i32 2, %d25 call void @use(i1 %c.2)26 27 %c.3 = icmp eq i32 1, %d28 call void @use(i1 %c.3)29 %c.4 = icmp eq i32 0, %d30 call void @use(i1 %c.4)31 %c.5 = icmp eq i32 2, %d32 call void @use(i1 %c.5)33 34 ret void35}36 37define void @sdiv1_cmp_range_1(i32 %x, i1 %c) {38; CHECK-LABEL: @sdiv1_cmp_range_1(39; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]40; CHECK: bb1:41; CHECK-NEXT: br label [[BB3:%.*]]42; CHECK: bb2:43; CHECK-NEXT: br label [[BB3]]44; CHECK: bb3:45; CHECK-NEXT: [[P:%.*]] = phi i32 [ 1, [[BB1]] ], [ 2, [[BB2]] ]46; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]]47; CHECK-NEXT: call void @use(i1 false)48; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[P]], [[D]]49; CHECK-NEXT: call void @use(i1 [[C_1]])50; CHECK-NEXT: ret void51;52 br i1 %c, label %bb1, label %bb253bb1:54 br label %bb355bb2:56 br label %bb357 58bb3:59 %p = phi i32 [1, %bb1], [2, %bb2]60 %d = sdiv i32 1, %x61 %c.0 = icmp slt i32 %p, %d62 call void @use(i1 %c.0)63 %c.1 = icmp eq i32 %p, %d64 call void @use(i1 %c.1)65 ret void66}67 68 69define void @sdiv1_cmp_range_2(i32 %x, i1 %c) {70; CHECK-LABEL: @sdiv1_cmp_range_2(71; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]72; CHECK: bb1:73; CHECK-NEXT: br label [[BB3:%.*]]74; CHECK: bb2:75; CHECK-NEXT: br label [[BB3]]76; CHECK: bb3:77; CHECK-NEXT: [[P:%.*]] = phi i32 [ 3, [[BB1]] ], [ 2, [[BB2]] ]78; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]]79; CHECK-NEXT: call void @use(i1 false)80; CHECK-NEXT: call void @use(i1 false)81; CHECK-NEXT: ret void82;83 br i1 %c, label %bb1, label %bb284bb1:85 br label %bb386bb2:87 br label %bb388 89bb3:90 %p = phi i32 [3, %bb1], [2, %bb2]91 %d = sdiv i32 1, %x92 %c.0 = icmp slt i32 %p, %d93 call void @use(i1 %c.0)94 %c.1 = icmp eq i32 %p, %d95 call void @use(i1 %c.1)96 ret void97}98 99define void @urem_cmp_constants() {100; CHECK-LABEL: @urem_cmp_constants(101; CHECK-NEXT: call void @use(i1 true)102; CHECK-NEXT: call void @use(i1 false)103; CHECK-NEXT: call void @use(i1 true)104; CHECK-NEXT: call void @use(i1 false)105; CHECK-NEXT: [[UREM_3:%.*]] = urem i16 12704, 0106; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[UREM_3]], 1107; CHECK-NEXT: call void @use(i1 [[C_5]])108; CHECK-NEXT: ret void109;110 %sel = select i1 false, i16 0, i16 12704111 %urem.1 = urem i16 %sel, 12704112 %c.1 = icmp eq i16 %urem.1, 0113 call void @use(i1 %c.1)114 %c.2 = icmp eq i16 %urem.1, 1115 call void @use(i1 %c.2)116 %urem.2 = urem i16 %sel, 3117 %c.3 = icmp eq i16 %urem.2, 2118 call void @use(i1 %c.3)119 %c.4 = icmp eq i16 %urem.2, 1120 call void @use(i1 %c.4)121 %urem.3 = urem i16 %sel, 0122 %c.5 = icmp eq i16 %urem.3, 1123 call void @use(i1 %c.5)124 ret void125}126 127define void @srem_cmp_constants() {128; CHECK-LABEL: @srem_cmp_constants(129; CHECK-NEXT: call void @use(i1 true)130; CHECK-NEXT: call void @use(i1 false)131; CHECK-NEXT: call void @use(i1 true)132; CHECK-NEXT: call void @use(i1 false)133; CHECK-NEXT: [[SREM_3:%.*]] = urem i16 12704, 0134; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[SREM_3]], 1135; CHECK-NEXT: call void @use(i1 [[C_5]])136; CHECK-NEXT: ret void137;138 %sel = select i1 false, i16 0, i16 12704139 %srem.1 = srem i16 %sel, 12704140 %c.1 = icmp eq i16 %srem.1, 0141 call void @use(i1 %c.1)142 %c.2 = icmp eq i16 %srem.1, 1143 call void @use(i1 %c.2)144 %srem.2 = srem i16 %sel, 3145 %c.3 = icmp eq i16 %srem.2, 2146 call void @use(i1 %c.3)147 %c.4 = icmp eq i16 %srem.2, 1148 call void @use(i1 %c.4)149 %srem.3 = srem i16 %sel, 0150 %c.5 = icmp eq i16 %srem.3, 1151 call void @use(i1 %c.5)152 ret void153}154