diff --git a/llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll b/llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll new file mode 100644 index 0000000000000..6a8a88e6f24cd --- /dev/null +++ b/llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll @@ -0,0 +1,74 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes='instcombine' -S %s | FileCheck %s + + +define <4 x double> @shuffle_op0_freeze_poison(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op0_freeze_poison( +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> zeroinitializer, <2 x double> [[A:%.*]], <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> poison + %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> + ret <4 x double> %shuffle +} + +define <4 x double> @shuffle_op1_freeze_poison(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op1_freeze_poison( +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> zeroinitializer, <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> poison + %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> + ret <4 x double> %shuffle +} + +define <4 x double> @shuffle_op0_freeze_poison_use(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op0_freeze_poison_use( +; CHECK-NEXT: call void @use(<2 x double> zeroinitializer) +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> zeroinitializer, <2 x double> [[A:%.*]], <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> poison + call void @use(<2 x double> %b) + %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> + ret <4 x double> %shuffle +} + +define <4 x double> @shuffle_op1_freeze_poison_use(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op1_freeze_poison_use( +; CHECK-NEXT: call void @use(<2 x double> zeroinitializer) +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> zeroinitializer, <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> poison + call void @use(<2 x double> %b) + %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> + ret <4 x double> %shuffle +} + +define <4 x double> @shuffle_op0_freeze_undef(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op0_freeze_undef( +; CHECK-NEXT: call void @use(<2 x double> zeroinitializer) +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> zeroinitializer, <2 x double> [[A:%.*]], <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> undef + call void @use(<2 x double> %b) + %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> + ret <4 x double> %shuffle +} + +define <4 x double> @shuffle_op1_freeze_undef(<2 x double> %a) { +; CHECK-LABEL: @shuffle_op1_freeze_undef( +; CHECK-NEXT: call void @use(<2 x double> zeroinitializer) +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> zeroinitializer, <4 x i32> +; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] +; + %b = freeze <2 x double> undef + call void @use(<2 x double> %b) + %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> + ret <4 x double> %shuffle +} + +declare void @use(<2 x double>) +