@@ -1037,6 +1037,71 @@ exit:
1037
1037
ret i64 %red.mul
1038
1038
}
1039
1039
1040
+ ; Test case for https://github.com/llvm/llvm-project/issues/113526.
1041
+ define i32 @narrowed_reduction (ptr %a , i1 %cmp ) #0 {
1042
+ ; CHECK-LABEL: @narrowed_reduction(
1043
+ ; CHECK-NEXT: entry:
1044
+ ; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP:%.*]] to i32
1045
+ ; CHECK-NEXT: br i1 true, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
1046
+ ; CHECK: vector.ph:
1047
+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[CONV]], i64 0
1048
+ ; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i32> [[BROADCAST_SPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
1049
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
1050
+ ; CHECK: vector.body:
1051
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
1052
+ ; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <16 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP6:%.*]], [[VECTOR_BODY]] ]
1053
+ ; CHECK-NEXT: [[VEC_PHI1:%.*]] = phi <16 x i32> [ zeroinitializer, [[VECTOR_PH]] ], [ [[TMP7:%.*]], [[VECTOR_BODY]] ]
1054
+ ; CHECK-NEXT: [[TMP0:%.*]] = and <16 x i32> [[VEC_PHI]], <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
1055
+ ; CHECK-NEXT: [[TMP1:%.*]] = and <16 x i32> [[VEC_PHI1]], <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
1056
+ ; CHECK-NEXT: [[TMP2:%.*]] = or <16 x i32> [[TMP0]], [[BROADCAST_SPLAT]]
1057
+ ; CHECK-NEXT: [[TMP3:%.*]] = or <16 x i32> [[TMP1]], [[BROADCAST_SPLAT]]
1058
+ ; CHECK-NEXT: [[TMP4:%.*]] = trunc <16 x i32> [[TMP2]] to <16 x i1>
1059
+ ; CHECK-NEXT: [[TMP5:%.*]] = trunc <16 x i32> [[TMP3]] to <16 x i1>
1060
+ ; CHECK-NEXT: [[TMP6]] = zext <16 x i1> [[TMP4]] to <16 x i32>
1061
+ ; CHECK-NEXT: [[TMP7]] = zext <16 x i1> [[TMP5]] to <16 x i32>
1062
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32
1063
+ ; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[INDEX_NEXT]], 0
1064
+ ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
1065
+ ; CHECK: middle.block:
1066
+ ; CHECK-NEXT: [[TMP9:%.*]] = trunc <16 x i32> [[TMP6]] to <16 x i1>
1067
+ ; CHECK-NEXT: [[TMP10:%.*]] = trunc <16 x i32> [[TMP7]] to <16 x i1>
1068
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = or <16 x i1> [[TMP10]], [[TMP9]]
1069
+ ; CHECK-NEXT: [[TMP11:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[BIN_RDX]])
1070
+ ; CHECK-NEXT: [[TMP12:%.*]] = zext i1 [[TMP11]] to i32
1071
+ ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[SCALAR_PH]]
1072
+ ; CHECK: scalar.ph:
1073
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i32 [ 1, [[MIDDLE_BLOCK]] ], [ 1, [[ENTRY:%.*]] ]
1074
+ ; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i32 [ [[TMP12]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
1075
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1076
+ ; CHECK: loop:
1077
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INC:%.*]], [[LOOP]] ]
1078
+ ; CHECK-NEXT: [[OR13:%.*]] = phi i32 [ [[BC_MERGE_RDX]], [[SCALAR_PH]] ], [ [[OR:%.*]], [[LOOP]] ]
1079
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[OR13]], 1
1080
+ ; CHECK-NEXT: [[OR]] = or i32 [[AND]], [[CONV]]
1081
+ ; CHECK-NEXT: [[INC]] = add i32 [[IV]], 1
1082
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 0
1083
+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP27:![0-9]+]]
1084
+ ; CHECK: exit:
1085
+ ; CHECK-NEXT: [[OR_LCSSA:%.*]] = phi i32 [ [[OR]], [[LOOP]] ], [ [[TMP12]], [[MIDDLE_BLOCK]] ]
1086
+ ; CHECK-NEXT: ret i32 [[OR_LCSSA]]
1087
+ ;
1088
+ entry:
1089
+ %conv = zext i1 %cmp to i32
1090
+ br label %loop
1091
+
1092
+ loop:
1093
+ %iv = phi i32 [ 1 , %entry ], [ %inc , %loop ]
1094
+ %or13 = phi i32 [ 0 , %entry ], [ %or , %loop ]
1095
+ %and = and i32 %or13 , 1
1096
+ %or = or i32 %and , %conv
1097
+ %inc = add i32 %iv , 1
1098
+ %ec = icmp eq i32 %iv , 0
1099
+ br i1 %ec , label %exit , label %loop
1100
+
1101
+ exit:
1102
+ ret i32 %or
1103
+ }
1104
+
1040
1105
declare void @llvm.assume (i1 noundef) #0
1041
1106
1042
1107
attributes #0 = { "target-cpu" ="penryn" }
0 commit comments