brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.8 KiB · 02042b1 Raw
547 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -S -passes=instcombine < %s | FileCheck %s3 4define i1 @test1(float %x) {5; CHECK-LABEL: define i1 @test1(6; CHECK-SAME: float [[X:%.*]]) {7; CHECK-NEXT:  entry:8; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+009; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]10; CHECK:       if.then:11; CHECK-NEXT:    ret i1 false12; CHECK:       if.else:13; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)14; CHECK-NEXT:    ret i1 [[RET]]15;16entry:17  %cond = fcmp ueq float %x, 0.000000e+0018  br i1 %cond, label %if.then, label %if.else19 20if.then:21  ret i1 false22 23if.else:24  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)25  ret i1 %ret26}27 28define i1 @test2(double %x) {29; CHECK-LABEL: define i1 @test2(30; CHECK-SAME: double [[X:%.*]]) {31; CHECK-NEXT:  entry:32; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A000000033; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]34; CHECK:       if.then:35; CHECK-NEXT:    ret i1 false36; CHECK:       if.end:37; CHECK-NEXT:    ret i1 false38;39entry:40  %cmp = fcmp olt double %x, 0x3EB0C6F7A000000041  br i1 %cmp, label %if.then, label %if.end42if.then:43  ret i1 false44if.end:45  %cmp.i = fcmp oeq double %x, 0.000000e+0046  ret i1 %cmp.i47}48 49define i1 @test2_or(double %x, i1 %cond) {50; CHECK-LABEL: define i1 @test2_or(51; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {52; CHECK-NEXT:  entry:53; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A000000054; CHECK-NEXT:    [[OR:%.*]] = or i1 [[CMP]], [[COND]]55; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]56; CHECK:       if.then:57; CHECK-NEXT:    ret i1 false58; CHECK:       if.end:59; CHECK-NEXT:    ret i1 false60;61entry:62  %cmp = fcmp olt double %x, 0x3EB0C6F7A000000063  %or = or i1 %cmp, %cond64  br i1 %or, label %if.then, label %if.end65 66if.then:67  ret i1 false68 69if.end:70  %cmp.i = fcmp oeq double %x, 0.000000e+0071  ret i1 %cmp.i72}73 74define i1 @test3(float %x) {75; CHECK-LABEL: define i1 @test3(76; CHECK-SAME: float [[X:%.*]]) {77; CHECK-NEXT:  entry:78; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+0079; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]80; CHECK:       if.then:81; CHECK-NEXT:    [[RET:%.*]] = fcmp oeq float [[X]], 0x7FF000000000000082; CHECK-NEXT:    ret i1 [[RET]]83; CHECK:       if.else:84; CHECK-NEXT:    ret i1 false85;86entry:87  %cmp = fcmp ogt float %x, 3.000000e+0088  br i1 %cmp, label %if.then, label %if.else89if.then:90  %abs = call float @llvm.fabs.f32(float %x)91  %ret = fcmp oeq float %abs, 0x7FF000000000000092  ret i1 %ret93if.else:94  ret i1 false95}96 97define float @test4(float %x) {98; CHECK-LABEL: define float @test4(99; CHECK-SAME: float [[X:%.*]]) {100; CHECK-NEXT:  entry:101; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000102; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]103; CHECK:       if.then:104; CHECK-NEXT:    ret float 1.000000e+00105; CHECK:       if.end:106; CHECK-NEXT:    [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]]107; CHECK-NEXT:    ret float [[DIV]]108;109entry:110  %cmp = fcmp olt float %x, 0x3EB0C6F7A0000000111  br i1 %cmp, label %if.then, label %if.end112 113if.then:114  ret float 1.0115 116if.end:117  %cmp.i = fcmp oeq float %x, 0.000000e+00118  %div = fdiv float 1.000000e+00, %x119  %ret = select i1 %cmp.i, float 1.000000e+00, float %div120  ret float %ret121}122 123define i1 @test5(double %x, i1 %cond) {124; CHECK-LABEL: define i1 @test5(125; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) {126; CHECK-NEXT:  entry:127; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]128; CHECK:       if:129; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00130; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]131; CHECK:       if.then:132; CHECK-NEXT:    ret i1 false133; CHECK:       if.end:134; CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[X]], i32 408)135; CHECK-NEXT:    br label [[EXIT]]136; CHECK:       exit:137; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[TMP0]], [[IF_END]] ]138; CHECK-NEXT:    ret i1 [[RET]]139;140entry:141  br i1 %cond, label %if, label %exit142if:143  %cmp = fcmp uno double %x, 0.000000e+00144  br i1 %cmp, label %if.then, label %if.end145if.then:146  ret i1 false147if.end:148  br label %exit149exit:150  %y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ]151  %ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411)152  ret i1 %ret153}154 155define i1 @test6(double %x) {156; CHECK-LABEL: define i1 @test6(157; CHECK-SAME: double [[X:%.*]]) {158; CHECK-NEXT:  entry:159; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00160; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]]161; CHECK:       land.rhs:162; CHECK-NEXT:    [[CMP_I:%.*]] = fcmp oeq double [[X]], 0x7FF0000000000000163; CHECK-NEXT:    br label [[LAND_END]]164; CHECK:       land.end:165; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ]166; CHECK-NEXT:    ret i1 [[RET]]167;168entry:169  %cmp = fcmp ogt double %x, 0.000000e+00170  br i1 %cmp, label %land.rhs, label %land.end171 172land.rhs:173  %abs = tail call double @llvm.fabs.f64(double %x)174  %and.i = bitcast double %abs to i64175  %cmp.i = icmp eq i64 %and.i, 9218868437227405312176  br label %land.end177 178land.end:179  %ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ]180  ret i1 %ret181}182 183define i1 @test7(float %x) {184; CHECK-LABEL: define i1 @test7(185; CHECK-SAME: float [[X:%.*]]) {186; CHECK-NEXT:    [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345)187; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]188; CHECK:       if.then:189; CHECK-NEXT:    [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 328)190; CHECK-NEXT:    ret i1 [[RET1]]191; CHECK:       if.else:192; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 128)193; CHECK-NEXT:    ret i1 [[RET2]]194;195  %cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345)196  br i1 %cond, label %if.then, label %if.else197if.then:198  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)199  ret i1 %ret1200if.else:201  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456)202  ret i1 %ret2203}204 205; TODO: These two is.fpclass can be simplified.206define i1 @test8(float %x) {207; CHECK-LABEL: define i1 @test8(208; CHECK-SAME: float [[X:%.*]]) {209; CHECK-NEXT:    [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]])210; CHECK-NEXT:    [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000211; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]212; CHECK:       if.then:213; CHECK-NEXT:    ret i1 true214; CHECK:       if.else:215; CHECK-NEXT:    [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59)216; CHECK-NEXT:    ret i1 [[RET2]]217;218  %abs = call float @llvm.fabs.f32(float %x)219  %cond = fcmp oeq float %abs, 0x7FF0000000000000220  br i1 %cond, label %if.then, label %if.else221if.then:222  %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)223  ret i1 %ret1224if.else:225  %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575)226  ret i1 %ret2227}228 229define i1 @test9(float %x) {230; CHECK-LABEL: define i1 @test9(231; CHECK-SAME: float [[X:%.*]]) {232; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00233; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]234; CHECK:       if.then:235; CHECK-NEXT:    ret i1 false236; CHECK:       if.else:237; CHECK-NEXT:    ret i1 false238;239  %cond = fcmp olt float %x, -1.0240  br i1 %cond, label %if.then, label %if.else241if.then:242  %ret1 = fcmp oeq float %x, 0x7FF0000000000000243  ret i1 %ret1244if.else:245  ret i1 false246}247 248define i1 @test10(float %x) {249; CHECK-LABEL: define i1 @test10(250; CHECK-SAME: float [[X:%.*]]) {251; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00252; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]253; CHECK:       if.then:254; CHECK-NEXT:    ret i1 false255; CHECK:       if.else:256; CHECK-NEXT:    ret i1 false257;258  %cond = fcmp olt float %x, -1.0259  %neg = fneg float %x260  br i1 %cond, label %if.then, label %if.else261if.then:262  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000263  ret i1 %ret1264if.else:265  ret i1 false266}267 268define i1 @test11_and(float %x, i1 %cond2) {269; CHECK-LABEL: define i1 @test11_and(270; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {271; CHECK-NEXT:    [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00272; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND]], [[COND2]]273; CHECK-NEXT:    br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]274; CHECK:       if.then:275; CHECK-NEXT:    ret i1 false276; CHECK:       if.else:277; CHECK-NEXT:    ret i1 false278;279  %cond = fcmp olt float %x, -1.0280  %neg = fneg float %x281  %and = and i1 %cond, %cond2282  br i1 %and, label %if.then, label %if.else283if.then:284  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000285  ret i1 %ret1286if.else:287  ret i1 false288}289 290define i1 @test12_or(float %x, i1 %cond2) {291; CHECK-LABEL: define i1 @test12_or(292; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {293; CHECK-NEXT:  entry:294; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00295; CHECK-NEXT:    [[OR:%.*]] = or i1 [[COND]], [[COND2]]296; CHECK-NEXT:    br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]297; CHECK:       if.then:298; CHECK-NEXT:    ret i1 false299; CHECK:       if.else:300; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780)301; CHECK-NEXT:    ret i1 [[RET]]302;303entry:304  %cond = fcmp ueq float %x, 0.000000e+00305  %or = or i1 %cond, %cond2306  br i1 %or, label %if.then, label %if.else307 308if.then:309  ret i1 false310 311if.else:312  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)313  ret i1 %ret314}315 316define i1 @test1_no_dominating(float %x, i1 %c) {317; CHECK-LABEL: define i1 @test1_no_dominating(318; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) {319; CHECK-NEXT:  entry0:320; CHECK-NEXT:    br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]]321; CHECK:       entry:322; CHECK-NEXT:    [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00323; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]]324; CHECK:       if.then:325; CHECK-NEXT:    ret i1 false326; CHECK:       if.else:327; CHECK-NEXT:    [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783)328; CHECK-NEXT:    ret i1 [[RET]]329;330entry0:331  br i1 %c, label %entry, label %if.else332 333entry:334  %cond = fcmp ueq float %x, 0.000000e+00335  br i1 %cond, label %if.then, label %if.else336 337if.then:338  ret i1 false339 340if.else:341  %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783)342  ret i1 %ret343}344 345define float @test_signbit_check(float %x, i1 %cond) {346; CHECK-LABEL: define float @test_signbit_check(347; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {348; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32349; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0350; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]351; CHECK:       if.then1:352; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]353; CHECK-NEXT:    br label [[IF_END:%.*]]354; CHECK:       if.else:355; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]356; CHECK:       if.then2:357; CHECK-NEXT:    br label [[IF_END]]358; CHECK:       if.end:359; CHECK-NEXT:    [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]360; CHECK-NEXT:    ret float [[VALUE]]361;362  %i32 = bitcast float %x to i32363  %cmp = icmp slt i32 %i32, 0364  br i1 %cmp, label %if.then1, label %if.else365 366if.then1:367  %fneg = fneg float %x368  br label %if.end369 370if.else:371  br i1 %cond, label %if.then2, label %if.end372 373if.then2:374  br label %if.end375 376if.end:377  %value = phi float [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]378  %ret = call float @llvm.fabs.f32(float %value)379  ret float %ret380}381 382define float @test_signbit_check_fail(float %x, i1 %cond) {383; CHECK-LABEL: define float @test_signbit_check_fail(384; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {385; CHECK-NEXT:    [[I32:%.*]] = bitcast float [[X]] to i32386; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I32]], 0387; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]388; CHECK:       if.then1:389; CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[X]]390; CHECK-NEXT:    br label [[IF_END:%.*]]391; CHECK:       if.else:392; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]393; CHECK:       if.then2:394; CHECK-NEXT:    br label [[IF_END]]395; CHECK:       if.end:396; CHECK-NEXT:    [[RET:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]397; CHECK-NEXT:    ret float [[RET]]398;399  %i32 = bitcast float %x to i32400  %cmp = icmp slt i32 %i32, 0401  br i1 %cmp, label %if.then1, label %if.else402 403if.then1:404  %fneg = fneg float %x405  br label %if.end406 407if.else:408  br i1 %cond, label %if.then2, label %if.end409 410if.then2:411  %fneg2 = fneg float %x412  br label %if.end413 414if.end:415  %value = phi float [ %fneg, %if.then1 ], [ %fneg2, %if.then2 ], [ %x, %if.else ]416  %ret = call float @llvm.fabs.f32(float %value)417  ret float %ret418}419 420define <2 x float> @test_signbit_check_wrong_type(<2 x float> %x, i1 %cond) {421; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type(422; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) {423; CHECK-NEXT:    [[I32:%.*]] = bitcast <2 x float> [[X]] to i64424; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I32]], 0425; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]426; CHECK:       if.then1:427; CHECK-NEXT:    [[FNEG:%.*]] = fneg <2 x float> [[X]]428; CHECK-NEXT:    br label [[IF_END:%.*]]429; CHECK:       if.else:430; CHECK-NEXT:    br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]431; CHECK:       if.then2:432; CHECK-NEXT:    br label [[IF_END]]433; CHECK:       if.end:434; CHECK-NEXT:    [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]435; CHECK-NEXT:    [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]])436; CHECK-NEXT:    ret <2 x float> [[RET]]437;438  %i32 = bitcast <2 x float> %x to i64439  %cmp = icmp slt i64 %i32, 0440  br i1 %cmp, label %if.then1, label %if.else441 442if.then1:443  %fneg = fneg <2 x float> %x444  br label %if.end445 446if.else:447  br i1 %cond, label %if.then2, label %if.end448 449if.then2:450  br label %if.end451 452if.end:453  %value = phi <2 x float> [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ]454  %ret = call <2 x float> @llvm.fabs.v2f32(<2 x float> %value)455  ret <2 x float> %ret456}457 458define i1 @pr118257(half %v0, half %v1) {459; CHECK-LABEL: define i1 @pr118257(460; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {461; CHECK-NEXT:  entry:462; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000463; CHECK-NEXT:    [[CAST0:%.*]] = bitcast half [[V0]] to i16464; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[CAST0]], 0465; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]466; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]467; CHECK:       if.else:468; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16469; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0470; CHECK-NEXT:    ret i1 [[CMP3]]471; CHECK:       if.end:472; CHECK-NEXT:    ret i1 false473;474entry:475  %cmp1 = fcmp une half %v1, 0.000000e+00476  %cast0 = bitcast half %v0 to i16477  %cmp2 = icmp slt i16 %cast0, 0478  %or.cond = or i1 %cmp1, %cmp2479  br i1 %or.cond, label %if.end, label %if.else480 481if.else:482  %cast1 = bitcast half %v1 to i16483  %cmp3 = icmp slt i16 %cast1, 0484  ret i1 %cmp3485 486if.end:487  ret i1 false488}489 490define i1 @pr118257_is_fpclass(half %v0, half %v1) {491; CHECK-LABEL: define i1 @pr118257_is_fpclass(492; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) {493; CHECK-NEXT:  entry:494; CHECK-NEXT:    [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000495; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @llvm.is.fpclass.f16(half [[V0]], i32 35)496; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]]497; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]]498; CHECK:       if.else:499; CHECK-NEXT:    [[CAST1:%.*]] = bitcast half [[V1]] to i16500; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0501; CHECK-NEXT:    ret i1 [[CMP3]]502; CHECK:       if.end:503; CHECK-NEXT:    ret i1 false504;505entry:506  %cmp1 = fcmp une half %v1, 0.000000e+00507  %cmp2 = call i1 @llvm.is.fpclass.half(half %v0, i32 35)508  %or.cond = or i1 %cmp1, %cmp2509  br i1 %or.cond, label %if.end, label %if.else510 511if.else:512  %cast1 = bitcast half %v1 to i16513  %cmp3 = icmp slt i16 %cast1, 0514  ret i1 %cmp3515 516if.end:517  ret i1 false518}519 520define i1 @test_inv_and(float %x, i1 %cond2) {521; CHECK-LABEL: define i1 @test_inv_and(522; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) {523; CHECK-NEXT:    [[COND:%.*]] = fcmp oge float [[X]], -1.000000e+00524; CHECK-NEXT:    call void @use(i1 [[COND]])525; CHECK-NEXT:    [[NOT:%.*]] = xor i1 [[COND]], true526; CHECK-NEXT:    [[AND:%.*]] = and i1 [[COND2]], [[NOT]]527; CHECK-NEXT:    br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]528; CHECK:       if.then:529; CHECK-NEXT:    ret i1 false530; CHECK:       if.else:531; CHECK-NEXT:    ret i1 false532;533  %cond = fcmp oge float %x, -1.0534  %neg = fneg float %x535  call void @use(i1 %cond)536  %not = xor i1 %cond, true537  %and = and i1 %not, %cond2538  br i1 %and, label %if.then, label %if.else539if.then:540  %ret1 = fcmp oeq float %neg, 0xFFF0000000000000541  ret i1 %ret1542if.else:543  ret i1 false544}545 546declare void @use(i1)547