1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 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 1 10; CHECK: false: 11; CHECK-NEXT: ret i8 20 12; 13 %cond = icmp sgt i32 %x, %y 14 br i1 %cond, label %true, label %false 15true: 16 %r = call i8 @llvm.scmp(i32 %x, i32 %y) 17 ret i8 %r 18false: 19 ret i8 20 20} 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 -1 28; CHECK: false: 29; CHECK-NEXT: ret i8 20 30; 31 %cond = icmp ult i32 %x, %y 32 br i1 %cond, label %true, label %false 33true: 34 %r = call i8 @llvm.ucmp(i32 %x, i32 %y) 35 ret i8 %r 36false: 37 ret i8 20 38} 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 20 46; CHECK: false: 47; CHECK-NEXT: ret i8 -1 48; 49 %cond = icmp sge i32 %x, %y 50 br i1 %cond, label %true, label %false 51true: 52 ret i8 20 53false: 54 %r = call i8 @llvm.scmp(i32 %x, i32 %y) 55 ret i8 %r 56} 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 20 64; CHECK: false: 65; CHECK-NEXT: ret i8 1 66; 67 %cond = icmp ule i32 %x, %y 68 br i1 %cond, label %true, label %false 69true: 70 ret i8 20 71false: 72 %r = call i8 @llvm.ucmp(i32 %x, i32 %y) 73 ret i8 %r 74} 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 0 82; CHECK: false: 83; CHECK-NEXT: ret i8 20 84; 85 %cond = icmp eq i32 %x, %y 86 br i1 %cond, label %true, label %false 87true: 88 %r = call i8 @llvm.scmp(i32 %x, i32 %y) 89 ret i8 %r 90false: 91 ret i8 20 92} 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 0 100; CHECK: false: 101; CHECK-NEXT: ret i8 20 102; 103 %cond = icmp eq i32 %x, %y 104 br i1 %cond, label %true, label %false 105true: 106 %r = call i8 @llvm.ucmp(i32 %x, i32 %y) 107 ret i8 %r 108false: 109 ret i8 20 110} 111 112; Negative test: signedness mismatch 113define 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 20 119; 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, %y 124 br i1 %cond, label %true, label %false 125true: 126 ret i8 20 127false: 128 %r = call i8 @llvm.scmp(i32 %x, i32 %y) 129 ret i8 %r 130} 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 20 138; 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, %y 143 br i1 %cond, label %true, label %false 144true: 145 ret i8 20 146false: 147 %r = call i8 @llvm.ucmp(i32 %x, i32 %y) 148 ret i8 %r 149} 150