@@ -993,6 +993,51 @@ define void @maximal_legal_fpmath(ptr %addr1, ptr %addr2, ptr %result, float %va
993993 ret void
994994}
995995
996+ ; TODO: Peek through (repeated) bitcasts to find a common source value.
997+ define <4 x i64 > @bitcast_smax_v8i32_v4i32 (<4 x i64 > %a , <4 x i64 > %b ) {
998+ ; CHECK-LABEL: @bitcast_smax_v8i32_v4i32(
999+ ; CHECK-NEXT: [[A_BC0:%.*]] = bitcast <4 x i64> [[A:%.*]] to <8 x i32>
1000+ ; CHECK-NEXT: [[B_BC0:%.*]] = bitcast <4 x i64> [[B:%.*]] to <8 x i32>
1001+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i32> [[A_BC0]], [[B_BC0]]
1002+ ; CHECK-NEXT: [[CMP_LO:%.*]] = shufflevector <8 x i1> [[CMP]], <8 x i1> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1003+ ; CHECK-NEXT: [[CMP_HI:%.*]] = shufflevector <8 x i1> [[CMP]], <8 x i1> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1004+ ; CHECK-NEXT: [[A_BC1:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>
1005+ ; CHECK-NEXT: [[B_BC1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32>
1006+ ; CHECK-NEXT: [[A_LO:%.*]] = shufflevector <8 x i32> [[A_BC1]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1007+ ; CHECK-NEXT: [[B_LO:%.*]] = shufflevector <8 x i32> [[B_BC1]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1008+ ; CHECK-NEXT: [[LO:%.*]] = select <4 x i1> [[CMP_LO]], <4 x i32> [[B_LO]], <4 x i32> [[A_LO]]
1009+ ; CHECK-NEXT: [[A_BC2:%.*]] = bitcast <4 x i64> [[A]] to <8 x i32>
1010+ ; CHECK-NEXT: [[B_BC2:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32>
1011+ ; CHECK-NEXT: [[A_HI:%.*]] = shufflevector <8 x i32> [[A_BC2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1012+ ; CHECK-NEXT: [[B_HI:%.*]] = shufflevector <8 x i32> [[B_BC2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
1013+ ; CHECK-NEXT: [[HI:%.*]] = select <4 x i1> [[CMP_HI]], <4 x i32> [[B_HI]], <4 x i32> [[A_HI]]
1014+ ; CHECK-NEXT: [[CONCAT:%.*]] = shufflevector <4 x i32> [[LO]], <4 x i32> [[HI]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1015+ ; CHECK-NEXT: [[RES:%.*]] = bitcast <8 x i32> [[CONCAT]] to <4 x i64>
1016+ ; CHECK-NEXT: ret <4 x i64> [[RES]]
1017+ ;
1018+ %a.bc0 = bitcast <4 x i64 > %a to <8 x i32 >
1019+ %b.bc0 = bitcast <4 x i64 > %b to <8 x i32 >
1020+ %cmp = icmp slt <8 x i32 > %a.bc0 , %b.bc0
1021+ %cmp.lo = shufflevector <8 x i1 > %cmp , <8 x i1 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
1022+ %cmp.hi = shufflevector <8 x i1 > %cmp , <8 x i1 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
1023+
1024+ %a.bc1 = bitcast <4 x i64 > %a to <8 x i32 >
1025+ %b.bc1 = bitcast <4 x i64 > %b to <8 x i32 >
1026+ %a.lo = shufflevector <8 x i32 > %a.bc1 , <8 x i32 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
1027+ %b.lo = shufflevector <8 x i32 > %b.bc1 , <8 x i32 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
1028+ %lo = select <4 x i1 > %cmp.lo , <4 x i32 > %b.lo , <4 x i32 > %a.lo
1029+
1030+ %a.bc2 = bitcast <4 x i64 > %a to <8 x i32 >
1031+ %b.bc2 = bitcast <4 x i64 > %b to <8 x i32 >
1032+ %a.hi = shufflevector <8 x i32 > %a.bc2 , <8 x i32 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
1033+ %b.hi = shufflevector <8 x i32 > %b.bc2 , <8 x i32 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
1034+ %hi = select <4 x i1 > %cmp.hi , <4 x i32 > %b.hi , <4 x i32 > %a.hi
1035+
1036+ %concat = shufflevector <4 x i32 > %lo , <4 x i32 > %hi , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
1037+ %res = bitcast <8 x i32 > %concat to <4 x i64 >
1038+ ret <4 x i64 > %res
1039+ }
1040+
9961041define void @bitcast_srcty_mismatch () {
9971042; CHECK-LABEL: @bitcast_srcty_mismatch(
9981043; CHECK-NEXT: entry:
0 commit comments