14e9fe860SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 24e9fe860SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 34e9fe860SFlorian Hahn 44e9fe860SFlorian Hahndeclare void @use(i1) 54e9fe860SFlorian Hahn 64e9fe860SFlorian Hahndefine void @uge_sext(i16 %x, i32 %y) { 74e9fe860SFlorian Hahn; CHECK-LABEL: define void @uge_sext( 84e9fe860SFlorian Hahn; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 94e9fe860SFlorian Hahn; CHECK-NEXT: entry: 104e9fe860SFlorian Hahn; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32 114e9fe860SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y]] 124e9fe860SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp uge i32 [[Y]], -10 134e9fe860SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]] 144e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]] 154e9fe860SFlorian Hahn; CHECK: bb1: 16*ba0e871dSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y]] 17*ba0e871dSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_1]]) 184e9fe860SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp uge i16 [[X]], -10 194e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 204e9fe860SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], -9 214e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 224e9fe860SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[X_EXT]], -9 234e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 244e9fe860SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp uge i32 [[Y]], [[X_EXT]] 254e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 264e9fe860SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp uge i16 [[X]], -9 274e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_7]]) 284e9fe860SFlorian Hahn; CHECK-NEXT: ret void 294e9fe860SFlorian Hahn; CHECK: bb2: 304e9fe860SFlorian Hahn; CHECK-NEXT: ret void 314e9fe860SFlorian Hahn; 324e9fe860SFlorian Hahnentry: 334e9fe860SFlorian Hahn %x.ext = sext i16 %x to i32 344e9fe860SFlorian Hahn %c.1 = icmp uge i32 %x.ext, %y 354e9fe860SFlorian Hahn %c.2 = icmp uge i32 %y, -10 364e9fe860SFlorian Hahn %and = and i1 %c.1, %c.2 374e9fe860SFlorian Hahn br i1 %and, label %bb1, label %bb2 384e9fe860SFlorian Hahn 394e9fe860SFlorian Hahnbb1: 404e9fe860SFlorian Hahn %t.1 = icmp uge i32 %x.ext, %y 414e9fe860SFlorian Hahn call void @use(i1 %t.1) 424e9fe860SFlorian Hahn %c.3 = icmp uge i16 %x, -10 434e9fe860SFlorian Hahn call void @use(i1 %c.3) 444e9fe860SFlorian Hahn %c.4 = icmp uge i32 %x.ext, -9 454e9fe860SFlorian Hahn call void @use(i1 %c.4) 464e9fe860SFlorian Hahn %c.5 = icmp uge i32 %x.ext, -9 474e9fe860SFlorian Hahn call void @use(i1 %c.5) 484e9fe860SFlorian Hahn %c.6 = icmp uge i32 %y, %x.ext 494e9fe860SFlorian Hahn call void @use(i1 %c.6) 504e9fe860SFlorian Hahn %c.7 = icmp uge i16 %x, -9 514e9fe860SFlorian Hahn call void @use(i1 %c.7) 524e9fe860SFlorian Hahn ret void 534e9fe860SFlorian Hahn 544e9fe860SFlorian Hahnbb2: 554e9fe860SFlorian Hahn ret void 564e9fe860SFlorian Hahn} 574e9fe860SFlorian Hahn 584e9fe860SFlorian Hahndefine void @uge_sext_known_positive(i16 %x, i32 %y) { 594e9fe860SFlorian Hahn; CHECK-LABEL: define void @uge_sext_known_positive( 604e9fe860SFlorian Hahn; CHECK-SAME: i16 [[X:%.*]], i32 [[Y:%.*]]) { 614e9fe860SFlorian Hahn; CHECK-NEXT: entry: 624e9fe860SFlorian Hahn; CHECK-NEXT: [[X_EXT:%.*]] = sext i16 [[X]] to i32 634e9fe860SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i16 [[X]], 0 644e9fe860SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp uge i32 [[X_EXT]], 10 654e9fe860SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_2]], [[C_1]] 664e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]] 674e9fe860SFlorian Hahn; CHECK: bb1: 684e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 69*ba0e871dSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 704e9fe860SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp uge i32 [[X_EXT]], 11 714e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_3]]) 724e9fe860SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], 11 734e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_4]]) 744e9fe860SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[Y]], [[X_EXT]] 754e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_5]]) 764e9fe860SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp uge i16 [[X]], 11 774e9fe860SFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_6]]) 784e9fe860SFlorian Hahn; CHECK-NEXT: ret void 794e9fe860SFlorian Hahn; CHECK: bb2: 804e9fe860SFlorian Hahn; CHECK-NEXT: ret void 814e9fe860SFlorian Hahn; 824e9fe860SFlorian Hahnentry: 834e9fe860SFlorian Hahn %x.ext = sext i16 %x to i32 844e9fe860SFlorian Hahn %c.2 = icmp sge i16 %x, 0 854e9fe860SFlorian Hahn %c.1 = icmp uge i32 %x.ext, 10 864e9fe860SFlorian Hahn %and = and i1 %c.2, %c.1 874e9fe860SFlorian Hahn br i1 %and, label %bb1, label %bb2 884e9fe860SFlorian Hahn 894e9fe860SFlorian Hahnbb1: 904e9fe860SFlorian Hahn %t.1 = icmp uge i32 %x.ext, 10 914e9fe860SFlorian Hahn call void @use(i1 %t.1) 924e9fe860SFlorian Hahn %t.2 = icmp uge i16 %x, 10 934e9fe860SFlorian Hahn call void @use(i1 %t.2) 944e9fe860SFlorian Hahn %c.3 = icmp uge i32 %x.ext, 11 954e9fe860SFlorian Hahn call void @use(i1 %c.3) 964e9fe860SFlorian Hahn %c.4 = icmp uge i32 %x.ext, 11 974e9fe860SFlorian Hahn call void @use(i1 %c.4) 984e9fe860SFlorian Hahn %c.5 = icmp uge i32 %y, %x.ext 994e9fe860SFlorian Hahn call void @use(i1 %c.5) 1004e9fe860SFlorian Hahn %c.6 = icmp uge i16 %x, 11 1014e9fe860SFlorian Hahn call void @use(i1 %c.6) 1024e9fe860SFlorian Hahn ret void 1034e9fe860SFlorian Hahn 1044e9fe860SFlorian Hahnbb2: 1054e9fe860SFlorian Hahn ret void 1064e9fe860SFlorian Hahn} 1074e9fe860SFlorian Hahn 1084e9fe860SFlorian Hahndefine i1 @cmp_sext_unsigned(i32 %a, i32 %b){ 1094e9fe860SFlorian Hahn; CHECK-LABEL: define i1 @cmp_sext_unsigned( 1104e9fe860SFlorian Hahn; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 1114e9fe860SFlorian Hahn; CHECK-NEXT: entry: 1124e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] 1134e9fe860SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 1144e9fe860SFlorian Hahn; CHECK: then: 1154e9fe860SFlorian Hahn; CHECK-NEXT: [[SA:%.*]] = sext i32 [[A]] to i64 1164e9fe860SFlorian Hahn; CHECK-NEXT: [[SB:%.*]] = sext i32 [[B]] to i64 1174e9fe860SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SA]], 1 1184e9fe860SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[SB]], [[ADD]] 1194e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 [[CMP2]] 1204e9fe860SFlorian Hahn; CHECK: else: 1214e9fe860SFlorian Hahn; CHECK-NEXT: ret i1 false 1224e9fe860SFlorian Hahn; 1234e9fe860SFlorian Hahnentry: 1244e9fe860SFlorian Hahn %cmp = icmp slt i32 %a, %b 1254e9fe860SFlorian Hahn br i1 %cmp, label %then, label %else 1264e9fe860SFlorian Hahn 1274e9fe860SFlorian Hahnthen: 1284e9fe860SFlorian Hahn %sa = sext i32 %a to i64 1294e9fe860SFlorian Hahn %sb = sext i32 %b to i64 1304e9fe860SFlorian Hahn %add = add nsw i64 %sa, 1 1314e9fe860SFlorian Hahn %cmp2 = icmp uge i64 %sb, %add 1324e9fe860SFlorian Hahn ret i1 %cmp2 1334e9fe860SFlorian Hahn 1344e9fe860SFlorian Hahnelse: 1354e9fe860SFlorian Hahn ret i1 false 1364e9fe860SFlorian Hahn} 137