10db72442SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=ipsccp -S | FileCheck %s 30db72442SFlorian Hahn 40db72442SFlorian Hahndeclare void @use(i1) 50db72442SFlorian Hahndefine void @sdiv1_cmp_constants(i32 %x) { 60db72442SFlorian Hahn; CHECK-LABEL: @sdiv1_cmp_constants( 70db72442SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]] 80db72442SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp slt i32 0, [[D]] 90db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_0]]) 108a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 118a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 120db72442SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 1, [[D]] 130db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 140db72442SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 0, [[D]] 150db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 168a36594aSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 170db72442SFlorian Hahn; CHECK-NEXT: ret void 180db72442SFlorian Hahn; 190db72442SFlorian Hahn %d = sdiv i32 1, %x 200db72442SFlorian Hahn %c.0 = icmp slt i32 0, %d 210db72442SFlorian Hahn call void @use(i1 %c.0) 220db72442SFlorian Hahn %c.1 = icmp slt i32 1, %d 230db72442SFlorian Hahn call void @use(i1 %c.1) 240db72442SFlorian Hahn %c.2 = icmp slt i32 2, %d 250db72442SFlorian Hahn call void @use(i1 %c.2) 260db72442SFlorian Hahn 270db72442SFlorian Hahn %c.3 = icmp eq i32 1, %d 280db72442SFlorian Hahn call void @use(i1 %c.3) 290db72442SFlorian Hahn %c.4 = icmp eq i32 0, %d 300db72442SFlorian Hahn call void @use(i1 %c.4) 310db72442SFlorian Hahn %c.5 = icmp eq i32 2, %d 320db72442SFlorian Hahn call void @use(i1 %c.5) 330db72442SFlorian Hahn 340db72442SFlorian Hahn ret void 350db72442SFlorian Hahn} 360db72442SFlorian Hahn 370db72442SFlorian Hahndefine void @sdiv1_cmp_range_1(i32 %x, i1 %c) { 380db72442SFlorian Hahn; CHECK-LABEL: @sdiv1_cmp_range_1( 390db72442SFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 400db72442SFlorian Hahn; CHECK: bb1: 410db72442SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 420db72442SFlorian Hahn; CHECK: bb2: 430db72442SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 440db72442SFlorian Hahn; CHECK: bb3: 450db72442SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ 1, [[BB1]] ], [ 2, [[BB2]] ] 460db72442SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]] 474a58996dSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 480db72442SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[P]], [[D]] 490db72442SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 500db72442SFlorian Hahn; CHECK-NEXT: ret void 510db72442SFlorian Hahn; 520db72442SFlorian Hahn br i1 %c, label %bb1, label %bb2 530db72442SFlorian Hahnbb1: 540db72442SFlorian Hahn br label %bb3 550db72442SFlorian Hahnbb2: 560db72442SFlorian Hahn br label %bb3 570db72442SFlorian Hahn 580db72442SFlorian Hahnbb3: 590db72442SFlorian Hahn %p = phi i32 [1, %bb1], [2, %bb2] 600db72442SFlorian Hahn %d = sdiv i32 1, %x 610db72442SFlorian Hahn %c.0 = icmp slt i32 %p, %d 620db72442SFlorian Hahn call void @use(i1 %c.0) 630db72442SFlorian Hahn %c.1 = icmp eq i32 %p, %d 640db72442SFlorian Hahn call void @use(i1 %c.1) 650db72442SFlorian Hahn ret void 660db72442SFlorian Hahn} 670db72442SFlorian Hahn 680db72442SFlorian Hahn 690db72442SFlorian Hahndefine void @sdiv1_cmp_range_2(i32 %x, i1 %c) { 700db72442SFlorian Hahn; CHECK-LABEL: @sdiv1_cmp_range_2( 710db72442SFlorian Hahn; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 720db72442SFlorian Hahn; CHECK: bb1: 730db72442SFlorian Hahn; CHECK-NEXT: br label [[BB3:%.*]] 740db72442SFlorian Hahn; CHECK: bb2: 750db72442SFlorian Hahn; CHECK-NEXT: br label [[BB3]] 760db72442SFlorian Hahn; CHECK: bb3: 770db72442SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ 3, [[BB1]] ], [ 2, [[BB2]] ] 780db72442SFlorian Hahn; CHECK-NEXT: [[D:%.*]] = sdiv i32 1, [[X:%.*]] 794a58996dSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 804a58996dSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 810db72442SFlorian Hahn; CHECK-NEXT: ret void 820db72442SFlorian Hahn; 830db72442SFlorian Hahn br i1 %c, label %bb1, label %bb2 840db72442SFlorian Hahnbb1: 850db72442SFlorian Hahn br label %bb3 860db72442SFlorian Hahnbb2: 870db72442SFlorian Hahn br label %bb3 880db72442SFlorian Hahn 890db72442SFlorian Hahnbb3: 900db72442SFlorian Hahn %p = phi i32 [3, %bb1], [2, %bb2] 910db72442SFlorian Hahn %d = sdiv i32 1, %x 920db72442SFlorian Hahn %c.0 = icmp slt i32 %p, %d 930db72442SFlorian Hahn call void @use(i1 %c.0) 940db72442SFlorian Hahn %c.1 = icmp eq i32 %p, %d 950db72442SFlorian Hahn call void @use(i1 %c.1) 960db72442SFlorian Hahn ret void 970db72442SFlorian Hahn} 981092357cSFlorian Hahn 991092357cSFlorian Hahndefine void @urem_cmp_constants() { 1001092357cSFlorian Hahn; CHECK-LABEL: @urem_cmp_constants( 101611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 102611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 103611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 104611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 105bd4bfe0eSFlorian Hahn; CHECK-NEXT: [[UREM_3:%.*]] = urem i16 12704, 0 106bd4bfe0eSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[UREM_3]], 1 107bd4bfe0eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 1081092357cSFlorian Hahn; CHECK-NEXT: ret void 1091092357cSFlorian Hahn; 1101092357cSFlorian Hahn %sel = select i1 false, i16 0, i16 12704 1111092357cSFlorian Hahn %urem.1 = urem i16 %sel, 12704 1121092357cSFlorian Hahn %c.1 = icmp eq i16 %urem.1, 0 1131092357cSFlorian Hahn call void @use(i1 %c.1) 1141092357cSFlorian Hahn %c.2 = icmp eq i16 %urem.1, 1 1151092357cSFlorian Hahn call void @use(i1 %c.2) 1161092357cSFlorian Hahn %urem.2 = urem i16 %sel, 3 1171092357cSFlorian Hahn %c.3 = icmp eq i16 %urem.2, 2 1181092357cSFlorian Hahn call void @use(i1 %c.3) 1191092357cSFlorian Hahn %c.4 = icmp eq i16 %urem.2, 1 1201092357cSFlorian Hahn call void @use(i1 %c.4) 121bd4bfe0eSFlorian Hahn %urem.3 = urem i16 %sel, 0 122bd4bfe0eSFlorian Hahn %c.5 = icmp eq i16 %urem.3, 1 123bd4bfe0eSFlorian Hahn call void @use(i1 %c.5) 1241092357cSFlorian Hahn ret void 1251092357cSFlorian Hahn} 1261092357cSFlorian Hahn 1271092357cSFlorian Hahndefine void @srem_cmp_constants() { 1281092357cSFlorian Hahn; CHECK-LABEL: @srem_cmp_constants( 129611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 130611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 131611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 132611a02ccSFlorian Hahn; CHECK-NEXT: call void @use(i1 false) 133*85b28937SSanjay Patel; CHECK-NEXT: [[SREM_3:%.*]] = urem i16 12704, 0 134bd4bfe0eSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp eq i16 [[SREM_3]], 1 135bd4bfe0eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 1361092357cSFlorian Hahn; CHECK-NEXT: ret void 1371092357cSFlorian Hahn; 1381092357cSFlorian Hahn %sel = select i1 false, i16 0, i16 12704 1391092357cSFlorian Hahn %srem.1 = srem i16 %sel, 12704 1401092357cSFlorian Hahn %c.1 = icmp eq i16 %srem.1, 0 1411092357cSFlorian Hahn call void @use(i1 %c.1) 1421092357cSFlorian Hahn %c.2 = icmp eq i16 %srem.1, 1 1431092357cSFlorian Hahn call void @use(i1 %c.2) 1441092357cSFlorian Hahn %srem.2 = srem i16 %sel, 3 1451092357cSFlorian Hahn %c.3 = icmp eq i16 %srem.2, 2 1461092357cSFlorian Hahn call void @use(i1 %c.3) 1471092357cSFlorian Hahn %c.4 = icmp eq i16 %srem.2, 1 1481092357cSFlorian Hahn call void @use(i1 %c.4) 149bd4bfe0eSFlorian Hahn %srem.3 = srem i16 %sel, 0 150bd4bfe0eSFlorian Hahn %c.5 = icmp eq i16 %srem.3, 1 151bd4bfe0eSFlorian Hahn call void @use(i1 %c.5) 1521092357cSFlorian Hahn ret void 1531092357cSFlorian Hahn} 154