@@ -278,3 +278,216 @@ end:
278278}
279279
280280declare void @foo (i32 )
281+
282+
283+ define i1 @simplify_fcmp_implied_by_dom_cond_range_true (float %x ) {
284+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_range_true(
285+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
286+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
287+ ; CHECK: if.then:
288+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp olt float [[X]], 1.000000e+00
289+ ; CHECK-NEXT: ret i1 [[CMP2]]
290+ ; CHECK: if.else:
291+ ; CHECK-NEXT: ret i1 false
292+ ;
293+ %cmp = fcmp olt float %x , 0 .0
294+ br i1 %cmp , label %if.then , label %if.else
295+
296+ if.then:
297+ %cmp2 = fcmp olt float %x , 1 .0
298+ ret i1 %cmp2
299+
300+ if.else:
301+ ret i1 false
302+ }
303+
304+ define i1 @simplify_fcmp_in_else_implied_by_dom_cond_range_true (float %x ) {
305+ ; CHECK-LABEL: @simplify_fcmp_in_else_implied_by_dom_cond_range_true(
306+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], 1.000000e+00
307+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
308+ ; CHECK: if.then:
309+ ; CHECK-NEXT: ret i1 true
310+ ; CHECK: if.else:
311+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp uge float [[X]], 5.000000e-01
312+ ; CHECK-NEXT: ret i1 [[CMP2]]
313+ ;
314+ %cmp = fcmp olt float %x , 1 .0
315+ br i1 %cmp , label %if.then , label %if.else
316+
317+ if.then:
318+ ret i1 true
319+
320+ if.else:
321+ %cmp2 = fcmp uge float %x , 0 .5
322+ ret i1 %cmp2
323+ }
324+
325+ define i1 @simplify_fcmp_implied_by_dom_cond_range_false (float %x ) {
326+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_range_false(
327+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
328+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
329+ ; CHECK: if.then:
330+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp ogt float [[X]], 1.000000e+00
331+ ; CHECK-NEXT: ret i1 [[CMP2]]
332+ ; CHECK: if.else:
333+ ; CHECK-NEXT: ret i1 false
334+ ;
335+ %cmp = fcmp olt float %x , 0 .0
336+ br i1 %cmp , label %if.then , label %if.else
337+
338+ if.then:
339+ %cmp2 = fcmp ogt float %x , 1 .0
340+ ret i1 %cmp2
341+
342+ if.else:
343+ ret i1 false
344+ }
345+
346+ define i1 @simplify_fcmp_implied_by_dom_cond_pred_true (float %x , float %y ) {
347+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_pred_true(
348+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
349+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
350+ ; CHECK: if.then:
351+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp ole float [[X]], [[Y]]
352+ ; CHECK-NEXT: ret i1 [[CMP2]]
353+ ; CHECK: if.else:
354+ ; CHECK-NEXT: ret i1 false
355+ ;
356+ %cmp = fcmp olt float %x , %y
357+ br i1 %cmp , label %if.then , label %if.else
358+
359+ if.then:
360+ %cmp2 = fcmp ole float %x , %y
361+ ret i1 %cmp2
362+
363+ if.else:
364+ ret i1 false
365+ }
366+
367+ define i1 @simplify_fcmp_implied_by_dom_cond_pred_false (float %x , float %y ) {
368+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_pred_false(
369+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
370+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
371+ ; CHECK: if.then:
372+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp ogt float [[X]], [[Y]]
373+ ; CHECK-NEXT: ret i1 [[CMP2]]
374+ ; CHECK: if.else:
375+ ; CHECK-NEXT: ret i1 false
376+ ;
377+ %cmp = fcmp olt float %x , %y
378+ br i1 %cmp , label %if.then , label %if.else
379+
380+ if.then:
381+ %cmp2 = fcmp ogt float %x , %y
382+ ret i1 %cmp2
383+
384+ if.else:
385+ ret i1 false
386+ }
387+
388+ define i1 @simplify_fcmp_implied_by_dom_cond_pred_commuted (float %x , float %y ) {
389+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_pred_commuted(
390+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
391+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
392+ ; CHECK: if.then:
393+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp oge float [[Y]], [[X]]
394+ ; CHECK-NEXT: ret i1 [[CMP2]]
395+ ; CHECK: if.else:
396+ ; CHECK-NEXT: ret i1 false
397+ ;
398+ %cmp = fcmp olt float %x , %y
399+ br i1 %cmp , label %if.then , label %if.else
400+
401+ if.then:
402+ %cmp2 = fcmp oge float %y , %x
403+ ret i1 %cmp2
404+
405+ if.else:
406+ ret i1 false
407+ }
408+
409+ ; Negative tests
410+
411+ define i1 @simplify_fcmp_implied_by_dom_cond_wrong_range (float %x ) {
412+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_wrong_range(
413+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
414+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
415+ ; CHECK: if.then:
416+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp olt float [[X]], -1.000000e+00
417+ ; CHECK-NEXT: ret i1 [[CMP2]]
418+ ; CHECK: if.else:
419+ ; CHECK-NEXT: ret i1 false
420+ ;
421+ %cmp = fcmp olt float %x , 0 .0
422+ br i1 %cmp , label %if.then , label %if.else
423+
424+ if.then:
425+ %cmp2 = fcmp olt float %x , -1 .0
426+ ret i1 %cmp2
427+
428+ if.else:
429+ ret i1 false
430+ }
431+
432+ define i1 @simplify_fcmp_implied_by_dom_cond_range_mismatched_operand (float %x , float %y ) {
433+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_range_mismatched_operand(
434+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], 0.000000e+00
435+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
436+ ; CHECK: if.then:
437+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp olt float [[Y:%.*]], 1.000000e+00
438+ ; CHECK-NEXT: ret i1 [[CMP2]]
439+ ; CHECK: if.else:
440+ ; CHECK-NEXT: ret i1 false
441+ ;
442+ %cmp = fcmp olt float %x , 0 .0
443+ br i1 %cmp , label %if.then , label %if.else
444+
445+ if.then:
446+ %cmp2 = fcmp olt float %y , 1 .0
447+ ret i1 %cmp2
448+
449+ if.else:
450+ ret i1 false
451+ }
452+
453+ define i1 @simplify_fcmp_implied_by_dom_cond_wrong_pred (float %x , float %y ) {
454+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_wrong_pred(
455+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ole float [[X:%.*]], [[Y:%.*]]
456+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
457+ ; CHECK: if.then:
458+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp olt float [[X]], [[Y]]
459+ ; CHECK-NEXT: ret i1 [[CMP2]]
460+ ; CHECK: if.else:
461+ ; CHECK-NEXT: ret i1 false
462+ ;
463+ %cmp = fcmp ole float %x , %y
464+ br i1 %cmp , label %if.then , label %if.else
465+
466+ if.then:
467+ %cmp2 = fcmp olt float %x , %y
468+ ret i1 %cmp2
469+
470+ if.else:
471+ ret i1 false
472+ }
473+
474+ define i1 @simplify_fcmp_implied_by_dom_cond_pred_mismatched_operand (float %x , float %y , float %z ) {
475+ ; CHECK-LABEL: @simplify_fcmp_implied_by_dom_cond_pred_mismatched_operand(
476+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
477+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
478+ ; CHECK: if.then:
479+ ; CHECK-NEXT: [[CMP2:%.*]] = fcmp ole float [[X]], [[Z:%.*]]
480+ ; CHECK-NEXT: ret i1 [[CMP2]]
481+ ; CHECK: if.else:
482+ ; CHECK-NEXT: ret i1 false
483+ ;
484+ %cmp = fcmp olt float %x , %y
485+ br i1 %cmp , label %if.then , label %if.else
486+
487+ if.then:
488+ %cmp2 = fcmp ole float %x , %z
489+ ret i1 %cmp2
490+
491+ if.else:
492+ ret i1 false
493+ }
0 commit comments