From: Sanjay Patel Date: Sun, 31 Mar 2019 15:45:47 +0000 (+0000) Subject: [InstCombine] add tests for inverted select-shuffles + binop (PR41304); NFC X-Git-Tag: llvmorg-10-init~8791 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ac1186b583f5bcd0c6db5fa529f239b789dc611;p=platform%2Fupstream%2Fllvm.git [InstCombine] add tests for inverted select-shuffles + binop (PR41304); NFC llvm-svn: 357368 --- diff --git a/llvm/test/Transforms/InstCombine/vec-binop-select.ll b/llvm/test/Transforms/InstCombine/vec-binop-select.ll new file mode 100644 index 0000000..894684b --- /dev/null +++ b/llvm/test/Transforms/InstCombine/vec-binop-select.ll @@ -0,0 +1,244 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -instcombine -S | FileCheck %s + +; Non-canonical mask + +define <4 x i32> @and(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @and( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = and <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %r = and <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @or(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @or( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = or <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = or <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +; Non-canonical masks + +define <4 x i32> @xor(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @xor( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[Y:%.*]], <4 x i32> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = xor <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = xor <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +; Flags + +define <4 x i32> @add(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @add( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = add nsw <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = add nsw <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +; Non-commutative opcode + +define <4 x i32> @sub(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @sub( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = sub <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = sub <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @mul(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @mul( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = mul nuw <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = mul nuw <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @sdiv(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @sdiv( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = sdiv <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = sdiv <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @udiv(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @udiv( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = udiv <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = udiv <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @srem(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @srem( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = srem <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = srem <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @urem(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @urem( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = urem <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = urem <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @shl(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @shl( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = shl nsw <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = shl nsw <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @lshr(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @lshr( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[Y]], <4 x i32> [[X]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = lshr exact <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = lshr exact <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x i32> @ashr(<4 x i32> %x, <4 x i32> %y) { +; CHECK-LABEL: @ashr( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x i32> [[Y:%.*]], <4 x i32> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = ashr <4 x i32> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %sel1 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> + %sel2 = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> + %r = ashr <4 x i32> %sel1, %sel2 + ret <4 x i32> %r +} + +define <4 x float> @fadd(<4 x float> %x, <4 x float> %y) { +; CHECK-LABEL: @fadd( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x float> [[X]], <4 x float> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = fadd <4 x float> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x float> [[R]] +; + %sel1 = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> + %sel2 = shufflevector <4 x float> %y, <4 x float> %x, <4 x i32> + %r = fadd <4 x float> %sel1, %sel2 + ret <4 x float> %r +} + +define <4 x float> @fsub(<4 x float> %x, <4 x float> %y) { +; CHECK-LABEL: @fsub( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x float> [[X]], <4 x float> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = fsub fast <4 x float> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x float> [[R]] +; + %sel1 = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> + %sel2 = shufflevector <4 x float> %y, <4 x float> %x, <4 x i32> + %r = fsub fast <4 x float> %sel1, %sel2 + ret <4 x float> %r +} + +define <4 x double> @fmul(<4 x double> %x, <4 x double> %y) { +; CHECK-LABEL: @fmul( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x double> [[Y:%.*]], <4 x double> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x double> [[X]], <4 x double> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = fmul nnan <4 x double> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x double> [[R]] +; + %sel1 = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> + %sel2 = shufflevector <4 x double> %y, <4 x double> %x, <4 x i32> + %r = fmul nnan <4 x double> %sel1, %sel2 + ret <4 x double> %r +} + +define <4 x double> @fdiv(<4 x double> %x, <4 x double> %y) { +; CHECK-LABEL: @fdiv( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x double> [[Y:%.*]], <4 x double> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x double> [[X]], <4 x double> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = fdiv nnan arcp <4 x double> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x double> [[R]] +; + %sel1 = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> + %sel2 = shufflevector <4 x double> %y, <4 x double> %x, <4 x i32> + %r = fdiv arcp nnan <4 x double> %sel1, %sel2 + ret <4 x double> %r +} + +define <4 x double> @frem(<4 x double> %x, <4 x double> %y) { +; CHECK-LABEL: @frem( +; CHECK-NEXT: [[SEL1:%.*]] = shufflevector <4 x double> [[Y:%.*]], <4 x double> [[X:%.*]], <4 x i32> +; CHECK-NEXT: [[SEL2:%.*]] = shufflevector <4 x double> [[X]], <4 x double> [[Y]], <4 x i32> +; CHECK-NEXT: [[R:%.*]] = frem <4 x double> [[SEL1]], [[SEL2]] +; CHECK-NEXT: ret <4 x double> [[R]] +; + %sel1 = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> + %sel2 = shufflevector <4 x double> %y, <4 x double> %x, <4 x i32> + %r = frem <4 x double> %sel1, %sel2 + ret <4 x double> %r +}