1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i1 @olt_pinf(half %x) { 5; CHECK-LABEL: define i1 @olt_pinf( 6; CHECK-SAME: half [[X:%.*]]) { 7; CHECK-NEXT: [[CMP:%.*]] = fcmp one half [[X]], 0xH7C00 8; CHECK-NEXT: ret i1 [[CMP]] 9; 10 %cmp = fcmp olt half %x, 0xH7c00 11 ret i1 %cmp 12} 13 14define i1 @ole_pinf(half %x) { 15; CHECK-LABEL: define i1 @ole_pinf( 16; CHECK-SAME: half [[X:%.*]]) { 17; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000 18; CHECK-NEXT: ret i1 [[CMP]] 19; 20 %cmp = fcmp ole half %x, 0xH7c00 21 ret i1 %cmp 22} 23 24define i1 @ogt_pinf(half %x) { 25; CHECK-LABEL: define i1 @ogt_pinf( 26; CHECK-SAME: half [[X:%.*]]) { 27; CHECK-NEXT: ret i1 false 28; 29 %cmp = fcmp ogt half %x, 0xH7c00 30 ret i1 %cmp 31} 32 33define i1 @oge_pinf(half %x) { 34; CHECK-LABEL: define i1 @oge_pinf( 35; CHECK-SAME: half [[X:%.*]]) { 36; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq half [[X]], 0xH7C00 37; CHECK-NEXT: ret i1 [[CMP]] 38; 39 %cmp = fcmp oge half %x, 0xH7c00 40 ret i1 %cmp 41} 42 43define i1 @ult_pinf(half %x) { 44; CHECK-LABEL: define i1 @ult_pinf( 45; CHECK-SAME: half [[X:%.*]]) { 46; CHECK-NEXT: [[CMP:%.*]] = fcmp une half [[X]], 0xH7C00 47; CHECK-NEXT: ret i1 [[CMP]] 48; 49 %cmp = fcmp ult half %x, 0xH7c00 50 ret i1 %cmp 51} 52 53define i1 @ule_pinf(half %x) { 54; CHECK-LABEL: define i1 @ule_pinf( 55; CHECK-SAME: half [[X:%.*]]) { 56; CHECK-NEXT: ret i1 true 57; 58 %cmp = fcmp ule half %x, 0xH7c00 59 ret i1 %cmp 60} 61 62define i1 @ugt_pinf(half %x) { 63; CHECK-LABEL: define i1 @ugt_pinf( 64; CHECK-SAME: half [[X:%.*]]) { 65; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000 66; CHECK-NEXT: ret i1 [[CMP]] 67; 68 %cmp = fcmp ugt half %x, 0xH7c00 69 ret i1 %cmp 70} 71 72define i1 @uge_pinf(half %x) { 73; CHECK-LABEL: define i1 @uge_pinf( 74; CHECK-SAME: half [[X:%.*]]) { 75; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq half [[X]], 0xH7C00 76; CHECK-NEXT: ret i1 [[CMP]] 77; 78 %cmp = fcmp uge half %x, 0xH7c00 79 ret i1 %cmp 80} 81 82define i1 @olt_ninf(half %x) { 83; CHECK-LABEL: define i1 @olt_ninf( 84; CHECK-SAME: half [[X:%.*]]) { 85; CHECK-NEXT: ret i1 false 86; 87 %cmp = fcmp olt half %x, 0xHfc00 88 ret i1 %cmp 89} 90 91define i1 @ole_ninf(half %x) { 92; CHECK-LABEL: define i1 @ole_ninf( 93; CHECK-SAME: half [[X:%.*]]) { 94; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq half [[X]], 0xHFC00 95; CHECK-NEXT: ret i1 [[CMP]] 96; 97 %cmp = fcmp ole half %x, 0xHfc00 98 ret i1 %cmp 99} 100 101define i1 @ogt_ninf(half %x) { 102; CHECK-LABEL: define i1 @ogt_ninf( 103; CHECK-SAME: half [[X:%.*]]) { 104; CHECK-NEXT: [[CMP:%.*]] = fcmp one half [[X]], 0xHFC00 105; CHECK-NEXT: ret i1 [[CMP]] 106; 107 %cmp = fcmp ogt half %x, 0xHfc00 108 ret i1 %cmp 109} 110 111define i1 @oge_ninf(half %x) { 112; CHECK-LABEL: define i1 @oge_ninf( 113; CHECK-SAME: half [[X:%.*]]) { 114; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000 115; CHECK-NEXT: ret i1 [[CMP]] 116; 117 %cmp = fcmp oge half %x, 0xHfc00 118 ret i1 %cmp 119} 120 121define i1 @ult_ninf(half %x) { 122; CHECK-LABEL: define i1 @ult_ninf( 123; CHECK-SAME: half [[X:%.*]]) { 124; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000 125; CHECK-NEXT: ret i1 [[CMP]] 126; 127 %cmp = fcmp ult half %x, 0xHfc00 128 ret i1 %cmp 129} 130 131define i1 @ule_ninf(half %x) { 132; CHECK-LABEL: define i1 @ule_ninf( 133; CHECK-SAME: half [[X:%.*]]) { 134; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq half [[X]], 0xHFC00 135; CHECK-NEXT: ret i1 [[CMP]] 136; 137 %cmp = fcmp ule half %x, 0xHfc00 138 ret i1 %cmp 139} 140 141define i1 @ugt_ninf(half %x) { 142; CHECK-LABEL: define i1 @ugt_ninf( 143; CHECK-SAME: half [[X:%.*]]) { 144; CHECK-NEXT: [[CMP:%.*]] = fcmp une half [[X]], 0xHFC00 145; CHECK-NEXT: ret i1 [[CMP]] 146; 147 %cmp = fcmp ugt half %x, 0xHfc00 148 ret i1 %cmp 149} 150 151define i1 @uge_ninf(half %x) { 152; CHECK-LABEL: define i1 @uge_ninf( 153; CHECK-SAME: half [[X:%.*]]) { 154; CHECK-NEXT: ret i1 true 155; 156 %cmp = fcmp uge half %x, 0xHfc00 157 ret i1 %cmp 158} 159 160define i1 @olt_pinf_fmf(half %x) { 161; CHECK-LABEL: define i1 @olt_pinf_fmf( 162; CHECK-SAME: half [[X:%.*]]) { 163; CHECK-NEXT: [[CMP:%.*]] = fcmp nsz one half [[X]], 0xH7C00 164; CHECK-NEXT: ret i1 [[CMP]] 165; 166 %cmp = fcmp nsz olt half %x, 0xH7c00 167 ret i1 %cmp 168} 169 170define i1 @oge_pinf_fmf(half %x) { 171; CHECK-LABEL: define i1 @oge_pinf_fmf( 172; CHECK-SAME: half [[X:%.*]]) { 173; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oeq half [[X]], 0xH7C00 174; CHECK-NEXT: ret i1 [[CMP]] 175; 176 %cmp = fcmp nnan oge half %x, 0xH7c00 177 ret i1 %cmp 178} 179 180define <2 x i1> @olt_pinf_vec(<2 x half> %x) { 181; CHECK-LABEL: define <2 x i1> @olt_pinf_vec( 182; CHECK-SAME: <2 x half> [[X:%.*]]) { 183; CHECK-NEXT: [[CMP:%.*]] = fcmp one <2 x half> [[X]], splat (half 0xH7C00) 184; CHECK-NEXT: ret <2 x i1> [[CMP]] 185; 186 %cmp = fcmp olt <2 x half> %x, <half 0xH7c00, half 0xH7c00> 187 ret <2 x i1> %cmp 188} 189 190define <2 x i1> @oge_ninf_vec(<2 x half> %x) { 191; CHECK-LABEL: define <2 x i1> @oge_ninf_vec( 192; CHECK-SAME: <2 x half> [[X:%.*]]) { 193; CHECK-NEXT: [[CMP:%.*]] = fcmp ord <2 x half> [[X]], zeroinitializer 194; CHECK-NEXT: ret <2 x i1> [[CMP]] 195; 196 %cmp = fcmp oge <2 x half> %x, <half 0xHfc00, half 0xHfc00> 197 ret <2 x i1> %cmp 198} 199 200; Negative tests 201 202define i1 @ord_pinf(half %x) { 203; CHECK-LABEL: define i1 @ord_pinf( 204; CHECK-SAME: half [[X:%.*]]) { 205; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000 206; CHECK-NEXT: ret i1 [[CMP]] 207; 208 %cmp = fcmp ord half %x, 0xH7c00 209 ret i1 %cmp 210} 211 212define i1 @uno_pinf(half %x) { 213; CHECK-LABEL: define i1 @uno_pinf( 214; CHECK-SAME: half [[X:%.*]]) { 215; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000 216; CHECK-NEXT: ret i1 [[CMP]] 217; 218 %cmp = fcmp uno half %x, 0xH7c00 219 ret i1 %cmp 220} 221 222define i1 @true_pinf(half %x) { 223; CHECK-LABEL: define i1 @true_pinf( 224; CHECK-SAME: half [[X:%.*]]) { 225; CHECK-NEXT: ret i1 true 226; 227 %cmp = fcmp true half %x, 0xH7c00 228 ret i1 %cmp 229} 230 231define i1 @false_pinf(half %x) { 232; CHECK-LABEL: define i1 @false_pinf( 233; CHECK-SAME: half [[X:%.*]]) { 234; CHECK-NEXT: ret i1 false 235; 236 %cmp = fcmp false half %x, 0xH7c00 237 ret i1 %cmp 238} 239 240define i1 @ord_ninf(half %x) { 241; CHECK-LABEL: define i1 @ord_ninf( 242; CHECK-SAME: half [[X:%.*]]) { 243; CHECK-NEXT: [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000 244; CHECK-NEXT: ret i1 [[CMP]] 245; 246 %cmp = fcmp ord half %x, 0xHfc00 247 ret i1 %cmp 248} 249 250define i1 @uno_ninf(half %x) { 251; CHECK-LABEL: define i1 @uno_ninf( 252; CHECK-SAME: half [[X:%.*]]) { 253; CHECK-NEXT: [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000 254; CHECK-NEXT: ret i1 [[CMP]] 255; 256 %cmp = fcmp uno half %x, 0xHfc00 257 ret i1 %cmp 258} 259 260define i1 @true_ninf(half %x) { 261; CHECK-LABEL: define i1 @true_ninf( 262; CHECK-SAME: half [[X:%.*]]) { 263; CHECK-NEXT: ret i1 true 264; 265 %cmp = fcmp true half %x, 0xHfc00 266 ret i1 %cmp 267} 268 269define i1 @false_ninf(half %x) { 270; CHECK-LABEL: define i1 @false_ninf( 271; CHECK-SAME: half [[X:%.*]]) { 272; CHECK-NEXT: ret i1 false 273; 274 %cmp = fcmp false half %x, 0xHfc00 275 ret i1 %cmp 276} 277 278define i1 @olt_one(half %x) { 279; CHECK-LABEL: define i1 @olt_one( 280; CHECK-SAME: half [[X:%.*]]) { 281; CHECK-NEXT: [[CMP:%.*]] = fcmp olt half [[X]], 0xH3C00 282; CHECK-NEXT: ret i1 [[CMP]] 283; 284 %cmp = fcmp olt half %x, 1.0 285 ret i1 %cmp 286} 287