36 lines · plain
1; RUN: opt < %s -passes=instcombine -S | FileCheck %s2 3; X * Y (when Y is a boolean) --> Y ? X : 04 5define float @fmul_bool(float %x, i1 %y) {6; CHECK-LABEL: @fmul_bool(7; CHECK-NEXT: [[M:%.*]] = select nnan nsz i1 [[Y:%.*]], float [[X:%.*]], float 0.000000e+008; CHECK-NEXT: ret float [[M]]9;10 %z = uitofp i1 %y to float11 %m = fmul nnan nsz float %z, %x12 ret float %m13}14 15define <2 x float> @fmul_bool_vec(<2 x float> %x, <2 x i1> %y) {16; CHECK-LABEL: @fmul_bool_vec(17; CHECK-NEXT: [[M:%.*]] = select nnan nsz <2 x i1> [[Y:%.*]], <2 x float> [[X:%.*]], <2 x float> zeroinitializer18; CHECK-NEXT: ret <2 x float> [[M]]19;20 %z = uitofp <2 x i1> %y to <2 x float>21 %m = fmul nnan nsz <2 x float> %z, %x22 ret <2 x float> %m23}24 25define <2 x float> @fmul_bool_vec_commute(<2 x float> %px, <2 x i1> %y) {26; CHECK-LABEL: @fmul_bool_vec_commute(27; CHECK-NEXT: [[X:%.*]] = fmul nnan nsz <2 x float> [[PX:%.*]], [[PX]]28; CHECK-NEXT: [[M:%.*]] = select nnan nsz <2 x i1> [[Y:%.*]], <2 x float> [[X]], <2 x float> zeroinitializer29; CHECK-NEXT: ret <2 x float> [[M]]30;31 %x = fmul nnan nsz <2 x float> %px, %px ; thwart complexity-based canonicalization32 %z = uitofp <2 x i1> %y to <2 x float>33 %m = fmul nnan nsz <2 x float> %x, %z34 ret <2 x float> %m35}36