1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes='instcombine' -S %s | FileCheck %s 3 4 5define <4 x double> @shuffle_op0_freeze_poison(<2 x double> %a) { 6; CHECK-LABEL: @shuffle_op0_freeze_poison( 7; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> poison 8; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[B]], <2 x double> [[A:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 9; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 10; 11 %b = freeze <2 x double> poison 12 %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 13 ret <4 x double> %shuffle 14} 15 16define <4 x double> @shuffle_op1_freeze_poison(<2 x double> %a) { 17; CHECK-LABEL: @shuffle_op1_freeze_poison( 18; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> poison 19; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 20; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 21; 22 %b = freeze <2 x double> poison 23 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 24 ret <4 x double> %shuffle 25} 26 27define <4 x double> @shuffle_op0_freeze_poison_use(<2 x double> %a) { 28; CHECK-LABEL: @shuffle_op0_freeze_poison_use( 29; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> poison 30; CHECK-NEXT: call void @use(<2 x double> [[B]]) 31; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[B]], <2 x double> [[A:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 32; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 33; 34 %b = freeze <2 x double> poison 35 call void @use(<2 x double> %b) 36 %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 37 ret <4 x double> %shuffle 38} 39 40define <4 x double> @shuffle_op1_freeze_poison_use(<2 x double> %a) { 41; CHECK-LABEL: @shuffle_op1_freeze_poison_use( 42; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> poison 43; CHECK-NEXT: call void @use(<2 x double> [[B]]) 44; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 45; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 46; 47 %b = freeze <2 x double> poison 48 call void @use(<2 x double> %b) 49 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 50 ret <4 x double> %shuffle 51} 52 53define <4 x double> @shuffle_op0_freeze_undef(<2 x double> %a) { 54; CHECK-LABEL: @shuffle_op0_freeze_undef( 55; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> undef 56; CHECK-NEXT: call void @use(<2 x double> [[B]]) 57; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[B]], <2 x double> [[A:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 58; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 59; 60 %b = freeze <2 x double> undef 61 call void @use(<2 x double> %b) 62 %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 63 ret <4 x double> %shuffle 64} 65 66define <4 x double> @shuffle_op1_freeze_undef(<2 x double> %a) { 67; CHECK-LABEL: @shuffle_op1_freeze_undef( 68; CHECK-NEXT: [[B:%.*]] = freeze <2 x double> undef 69; CHECK-NEXT: call void @use(<2 x double> [[B]]) 70; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 71; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 72; 73 %b = freeze <2 x double> undef 74 call void @use(<2 x double> %b) 75 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 76 ret <4 x double> %shuffle 77} 78 79define <4 x double> @shuffle_bc1(<2 x double> %a) { 80; CHECK-LABEL: @shuffle_bc1( 81; CHECK-NEXT: [[B:%.*]] = freeze <4 x float> poison 82; CHECK-NEXT: [[B1:%.*]] = bitcast <4 x float> [[B]] to <2 x double> 83; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> [[B1]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 84; CHECK-NEXT: ret <4 x double> [[SHUFFLE]] 85; 86 %b = freeze <4 x float> poison 87 %b1 = bitcast <4 x float> %b to <2 x double> 88 %shuffle = shufflevector <2 x double> %a, <2 x double> %b1, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 89 ret <4 x double> %shuffle 90} 91 92define <8 x float> @shuffle_bc2(<4 x float> %a) { 93; CHECK-LABEL: @shuffle_bc2( 94; CHECK-NEXT: [[B:%.*]] = freeze <4 x float> poison 95; CHECK-NEXT: [[B1:%.*]] = bitcast <4 x float> [[B]] to <2 x double> 96; CHECK-NEXT: call void @use(<2 x double> [[B1]]) 97; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <4 x float> [[A:%.*]], <4 x float> [[B]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 98; CHECK-NEXT: ret <8 x float> [[SHUFFLE]] 99; 100 %b = freeze <4 x float> poison 101 %b1 = bitcast <4 x float> %b to <2 x double> 102 call void @use(<2 x double> %b1) 103 %b2 = bitcast <2 x double> %b1 to <4 x float> 104 %shuffle = shufflevector <4 x float> %a, <4 x float> %b2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 105 ret <8 x float> %shuffle 106} 107 108declare void @use(<2 x double>) 109 110