1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -ipsccp -S | FileCheck %s 3 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 void 18; 19 %d = sdiv i32 1, %x 20 %c.0 = icmp slt i32 0, %d 21 call void @use(i1 %c.0) 22 %c.1 = icmp slt i32 1, %d 23 call void @use(i1 %c.1) 24 %c.2 = icmp slt i32 2, %d 25 call void @use(i1 %c.2) 26 27 %c.3 = icmp eq i32 1, %d 28 call void @use(i1 %c.3) 29 %c.4 = icmp eq i32 0, %d 30 call void @use(i1 %c.4) 31 %c.5 = icmp eq i32 2, %d 32 call void @use(i1 %c.5) 33 34 ret void 35} 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 void 51; 52 br i1 %c, label %bb1, label %bb2 53bb1: 54 br label %bb3 55bb2: 56 br label %bb3 57 58bb3: 59 %p = phi i32 [1, %bb1], [2, %bb2] 60 %d = sdiv i32 1, %x 61 %c.0 = icmp slt i32 %p, %d 62 call void @use(i1 %c.0) 63 %c.1 = icmp eq i32 %p, %d 64 call void @use(i1 %c.1) 65 ret void 66} 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 void 82; 83 br i1 %c, label %bb1, label %bb2 84bb1: 85 br label %bb3 86bb2: 87 br label %bb3 88 89bb3: 90 %p = phi i32 [3, %bb1], [2, %bb2] 91 %d = sdiv i32 1, %x 92 %c.0 = icmp slt i32 %p, %d 93 call void @use(i1 %c.0) 94 %c.1 = icmp eq i32 %p, %d 95 call void @use(i1 %c.1) 96 ret void 97} 98 99define void @urem_cmp_constants() { 100; CHECK-LABEL: @urem_cmp_constants( 101; CHECK-NEXT: [[UREM_1:%.*]] = urem i16 12704, 12704 102; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[UREM_1]], 0 103; CHECK-NEXT: call void @use(i1 [[C_1]]) 104; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[UREM_1]], 1 105; CHECK-NEXT: call void @use(i1 [[C_2]]) 106; CHECK-NEXT: [[UREM_2:%.*]] = urem i16 12704, 3 107; CHECK-NEXT: [[C_3:%.*]] = icmp eq i16 [[UREM_2]], 2 108; CHECK-NEXT: call void @use(i1 [[C_3]]) 109; CHECK-NEXT: [[C_4:%.*]] = icmp eq i16 [[UREM_2]], 1 110; CHECK-NEXT: call void @use(i1 [[C_4]]) 111; CHECK-NEXT: [[UREM_3:%.*]] = urem i16 12704, 0 112; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[UREM_3]], 1 113; CHECK-NEXT: call void @use(i1 [[C_5]]) 114; CHECK-NEXT: ret void 115; 116 %sel = select i1 false, i16 0, i16 12704 117 %urem.1 = urem i16 %sel, 12704 118 %c.1 = icmp eq i16 %urem.1, 0 119 call void @use(i1 %c.1) 120 %c.2 = icmp eq i16 %urem.1, 1 121 call void @use(i1 %c.2) 122 %urem.2 = urem i16 %sel, 3 123 %c.3 = icmp eq i16 %urem.2, 2 124 call void @use(i1 %c.3) 125 %c.4 = icmp eq i16 %urem.2, 1 126 call void @use(i1 %c.4) 127 %urem.3 = urem i16 %sel, 0 128 %c.5 = icmp eq i16 %urem.3, 1 129 call void @use(i1 %c.5) 130 ret void 131} 132 133define void @srem_cmp_constants() { 134; CHECK-LABEL: @srem_cmp_constants( 135; CHECK-NEXT: [[SREM_1:%.*]] = srem i16 12704, 12704 136; CHECK-NEXT: [[C_1:%.*]] = icmp eq i16 [[SREM_1]], 0 137; CHECK-NEXT: call void @use(i1 [[C_1]]) 138; CHECK-NEXT: [[C_2:%.*]] = icmp eq i16 [[SREM_1]], 1 139; CHECK-NEXT: call void @use(i1 [[C_2]]) 140; CHECK-NEXT: [[SREM_2:%.*]] = srem i16 12704, 3 141; CHECK-NEXT: [[C_3:%.*]] = icmp eq i16 [[SREM_2]], 2 142; CHECK-NEXT: call void @use(i1 [[C_3]]) 143; CHECK-NEXT: [[C_4:%.*]] = icmp eq i16 [[SREM_2]], 1 144; CHECK-NEXT: call void @use(i1 [[C_4]]) 145; CHECK-NEXT: [[SREM_3:%.*]] = srem i16 12704, 0 146; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[SREM_3]], 1 147; CHECK-NEXT: call void @use(i1 [[C_5]]) 148; CHECK-NEXT: ret void 149; 150 %sel = select i1 false, i16 0, i16 12704 151 %srem.1 = srem i16 %sel, 12704 152 %c.1 = icmp eq i16 %srem.1, 0 153 call void @use(i1 %c.1) 154 %c.2 = icmp eq i16 %srem.1, 1 155 call void @use(i1 %c.2) 156 %srem.2 = srem i16 %sel, 3 157 %c.3 = icmp eq i16 %srem.2, 2 158 call void @use(i1 %c.3) 159 %c.4 = icmp eq i16 %srem.2, 1 160 call void @use(i1 %c.4) 161 %srem.3 = srem i16 %sel, 0 162 %c.5 = icmp eq i16 %srem.3, 1 163 call void @use(i1 %c.5) 164 ret void 165} 166