xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sext-unsigned-predicates.ll (revision ba0e871db81d8527382a051a0abf1ce2a171d8bf)
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