150 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define i8 @scmp_1(i32 %x, i32 %y) {5; CHECK-LABEL: @scmp_1(6; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]7; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]8; CHECK: true:9; CHECK-NEXT: ret i8 110; CHECK: false:11; CHECK-NEXT: ret i8 2012;13 %cond = icmp sgt i32 %x, %y14 br i1 %cond, label %true, label %false15true:16 %r = call i8 @llvm.scmp(i32 %x, i32 %y)17 ret i8 %r18false:19 ret i8 2020}21 22define i8 @ucmp_1(i32 %x, i32 %y) {23; CHECK-LABEL: @ucmp_1(24; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]25; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]26; CHECK: true:27; CHECK-NEXT: ret i8 -128; CHECK: false:29; CHECK-NEXT: ret i8 2030;31 %cond = icmp ult i32 %x, %y32 br i1 %cond, label %true, label %false33true:34 %r = call i8 @llvm.ucmp(i32 %x, i32 %y)35 ret i8 %r36false:37 ret i8 2038}39 40define i8 @scmp_2(i32 %x, i32 %y) {41; CHECK-LABEL: @scmp_2(42; CHECK-NEXT: [[COND:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]]43; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]44; CHECK: true:45; CHECK-NEXT: ret i8 2046; CHECK: false:47; CHECK-NEXT: ret i8 -148;49 %cond = icmp sge i32 %x, %y50 br i1 %cond, label %true, label %false51true:52 ret i8 2053false:54 %r = call i8 @llvm.scmp(i32 %x, i32 %y)55 ret i8 %r56}57 58define i8 @ucmp_2(i32 %x, i32 %y) {59; CHECK-LABEL: @ucmp_2(60; CHECK-NEXT: [[COND:%.*]] = icmp ule i32 [[X:%.*]], [[Y:%.*]]61; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]62; CHECK: true:63; CHECK-NEXT: ret i8 2064; CHECK: false:65; CHECK-NEXT: ret i8 166;67 %cond = icmp ule i32 %x, %y68 br i1 %cond, label %true, label %false69true:70 ret i8 2071false:72 %r = call i8 @llvm.ucmp(i32 %x, i32 %y)73 ret i8 %r74}75 76define i8 @scmp_3(i32 %x, i32 %y) {77; CHECK-LABEL: @scmp_3(78; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]79; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]80; CHECK: true:81; CHECK-NEXT: ret i8 082; CHECK: false:83; CHECK-NEXT: ret i8 2084;85 %cond = icmp eq i32 %x, %y86 br i1 %cond, label %true, label %false87true:88 %r = call i8 @llvm.scmp(i32 %x, i32 %y)89 ret i8 %r90false:91 ret i8 2092}93 94define i8 @ucmp_3(i32 %x, i32 %y) {95; CHECK-LABEL: @ucmp_3(96; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]97; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]98; CHECK: true:99; CHECK-NEXT: ret i8 0100; CHECK: false:101; CHECK-NEXT: ret i8 20102;103 %cond = icmp eq i32 %x, %y104 br i1 %cond, label %true, label %false105true:106 %r = call i8 @llvm.ucmp(i32 %x, i32 %y)107 ret i8 %r108false:109 ret i8 20110}111 112; Negative test: signedness mismatch113define i8 @scmp_4(i32 %x, i32 %y) {114; CHECK-LABEL: @scmp_4(115; CHECK-NEXT: [[COND:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]116; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]117; CHECK: true:118; CHECK-NEXT: ret i8 20119; CHECK: false:120; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[X]], i32 [[Y]])121; CHECK-NEXT: ret i8 [[R]]122;123 %cond = icmp ugt i32 %x, %y124 br i1 %cond, label %true, label %false125true:126 ret i8 20127false:128 %r = call i8 @llvm.scmp(i32 %x, i32 %y)129 ret i8 %r130}131 132define i8 @ucmp_4(i32 %x, i32 %y) {133; CHECK-LABEL: @ucmp_4(134; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]135; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]]136; CHECK: true:137; CHECK-NEXT: ret i8 20138; CHECK: false:139; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[X]], i32 [[Y]])140; CHECK-NEXT: ret i8 [[R]]141;142 %cond = icmp slt i32 %x, %y143 br i1 %cond, label %true, label %false144true:145 ret i8 20146false:147 %r = call i8 @llvm.ucmp(i32 %x, i32 %y)148 ret i8 %r149}150