; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s define i8 @scmp_1(i32 %x, i32 %y) { ; CHECK-LABEL: @scmp_1( ; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 1 ; CHECK: false: ; CHECK-NEXT: ret i8 20 ; %cond = icmp sgt i32 %x, %y br i1 %cond, label %true, label %false true: %r = call i8 @llvm.scmp(i32 %x, i32 %y) ret i8 %r false: ret i8 20 } define i8 @ucmp_1(i32 %x, i32 %y) { ; CHECK-LABEL: @ucmp_1( ; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 -1 ; CHECK: false: ; CHECK-NEXT: ret i8 20 ; %cond = icmp ult i32 %x, %y br i1 %cond, label %true, label %false true: %r = call i8 @llvm.ucmp(i32 %x, i32 %y) ret i8 %r false: ret i8 20 } define i8 @scmp_2(i32 %x, i32 %y) { ; CHECK-LABEL: @scmp_2( ; CHECK-NEXT: [[COND:%.*]] = icmp sge i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 20 ; CHECK: false: ; CHECK-NEXT: ret i8 -1 ; %cond = icmp sge i32 %x, %y br i1 %cond, label %true, label %false true: ret i8 20 false: %r = call i8 @llvm.scmp(i32 %x, i32 %y) ret i8 %r } define i8 @ucmp_2(i32 %x, i32 %y) { ; CHECK-LABEL: @ucmp_2( ; CHECK-NEXT: [[COND:%.*]] = icmp ule i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 20 ; CHECK: false: ; CHECK-NEXT: ret i8 1 ; %cond = icmp ule i32 %x, %y br i1 %cond, label %true, label %false true: ret i8 20 false: %r = call i8 @llvm.ucmp(i32 %x, i32 %y) ret i8 %r } define i8 @scmp_3(i32 %x, i32 %y) { ; CHECK-LABEL: @scmp_3( ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 0 ; CHECK: false: ; CHECK-NEXT: ret i8 20 ; %cond = icmp eq i32 %x, %y br i1 %cond, label %true, label %false true: %r = call i8 @llvm.scmp(i32 %x, i32 %y) ret i8 %r false: ret i8 20 } define i8 @ucmp_3(i32 %x, i32 %y) { ; CHECK-LABEL: @ucmp_3( ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 0 ; CHECK: false: ; CHECK-NEXT: ret i8 20 ; %cond = icmp eq i32 %x, %y br i1 %cond, label %true, label %false true: %r = call i8 @llvm.ucmp(i32 %x, i32 %y) ret i8 %r false: ret i8 20 } ; Negative test: signedness mismatch define i8 @scmp_4(i32 %x, i32 %y) { ; CHECK-LABEL: @scmp_4( ; CHECK-NEXT: [[COND:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 20 ; CHECK: false: ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[X]], i32 [[Y]]) ; CHECK-NEXT: ret i8 [[R]] ; %cond = icmp ugt i32 %x, %y br i1 %cond, label %true, label %false true: ret i8 20 false: %r = call i8 @llvm.scmp(i32 %x, i32 %y) ret i8 %r } define i8 @ucmp_4(i32 %x, i32 %y) { ; CHECK-LABEL: @ucmp_4( ; CHECK-NEXT: [[COND:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]] ; CHECK-NEXT: br i1 [[COND]], label [[TRUE:%.*]], label [[FALSE:%.*]] ; CHECK: true: ; CHECK-NEXT: ret i8 20 ; CHECK: false: ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[X]], i32 [[Y]]) ; CHECK-NEXT: ret i8 [[R]] ; %cond = icmp slt i32 %x, %y br i1 %cond, label %true, label %false true: ret i8 20 false: %r = call i8 @llvm.ucmp(i32 %x, i32 %y) ret i8 %r }