|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -p loop-vectorize -S %s | FileCheck %s |
| 3 | + |
| 4 | +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" |
| 5 | +target triple = "x86_64-apple-macosx10.15.0" |
| 6 | + |
| 7 | +define void @test_free_instructions_feeding_geps_for_interleave_groups(ptr noalias %p.invar, ptr noalias %dst.1, ptr noalias %dst.2) { |
| 8 | +; CHECK-LABEL: define void @test_free_instructions_feeding_geps_for_interleave_groups( |
| 9 | +; CHECK-SAME: ptr noalias [[P_INVAR:%.*]], ptr noalias [[DST_1:%.*]], ptr noalias [[DST_2:%.*]]) { |
| 10 | +; CHECK-NEXT: [[ENTRY:.*]]: |
| 11 | +; CHECK-NEXT: br i1 true, label %[[SCALAR_PH:.*]], label %[[VECTOR_SCEVCHECK:.*]] |
| 12 | +; CHECK: [[VECTOR_SCEVCHECK]]: |
| 13 | +; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[DST_1]], i64 8 |
| 14 | +; CHECK-NEXT: [[MUL:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 15 | +; CHECK-NEXT: [[MUL_RESULT:%.*]] = extractvalue { i64, i1 } [[MUL]], 0 |
| 16 | +; CHECK-NEXT: [[MUL_OVERFLOW:%.*]] = extractvalue { i64, i1 } [[MUL]], 1 |
| 17 | +; CHECK-NEXT: [[TMP0:%.*]] = sub i64 0, [[MUL_RESULT]] |
| 18 | +; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[SCEVGEP]], i64 [[MUL_RESULT]] |
| 19 | +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult ptr [[TMP1]], [[SCEVGEP]] |
| 20 | +; CHECK-NEXT: [[TMP3:%.*]] = or i1 [[TMP2]], [[MUL_OVERFLOW]] |
| 21 | +; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[DST_1]], i64 12 |
| 22 | +; CHECK-NEXT: [[MUL2:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 23 | +; CHECK-NEXT: [[MUL_RESULT3:%.*]] = extractvalue { i64, i1 } [[MUL2]], 0 |
| 24 | +; CHECK-NEXT: [[MUL_OVERFLOW4:%.*]] = extractvalue { i64, i1 } [[MUL2]], 1 |
| 25 | +; CHECK-NEXT: [[TMP4:%.*]] = sub i64 0, [[MUL_RESULT3]] |
| 26 | +; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[SCEVGEP1]], i64 [[MUL_RESULT3]] |
| 27 | +; CHECK-NEXT: [[TMP6:%.*]] = icmp ult ptr [[TMP5]], [[SCEVGEP1]] |
| 28 | +; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP6]], [[MUL_OVERFLOW4]] |
| 29 | +; CHECK-NEXT: [[SCEVGEP5:%.*]] = getelementptr i8, ptr [[DST_1]], i64 4 |
| 30 | +; CHECK-NEXT: [[MUL6:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 31 | +; CHECK-NEXT: [[MUL_RESULT7:%.*]] = extractvalue { i64, i1 } [[MUL6]], 0 |
| 32 | +; CHECK-NEXT: [[MUL_OVERFLOW8:%.*]] = extractvalue { i64, i1 } [[MUL6]], 1 |
| 33 | +; CHECK-NEXT: [[TMP8:%.*]] = sub i64 0, [[MUL_RESULT7]] |
| 34 | +; CHECK-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[SCEVGEP5]], i64 [[MUL_RESULT7]] |
| 35 | +; CHECK-NEXT: [[TMP10:%.*]] = icmp ult ptr [[TMP9]], [[SCEVGEP5]] |
| 36 | +; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP10]], [[MUL_OVERFLOW8]] |
| 37 | +; CHECK-NEXT: [[MUL9:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 38 | +; CHECK-NEXT: [[MUL_RESULT10:%.*]] = extractvalue { i64, i1 } [[MUL9]], 0 |
| 39 | +; CHECK-NEXT: [[MUL_OVERFLOW11:%.*]] = extractvalue { i64, i1 } [[MUL9]], 1 |
| 40 | +; CHECK-NEXT: [[TMP12:%.*]] = sub i64 0, [[MUL_RESULT10]] |
| 41 | +; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[DST_1]], i64 [[MUL_RESULT10]] |
| 42 | +; CHECK-NEXT: [[TMP14:%.*]] = icmp ult ptr [[TMP13]], [[DST_1]] |
| 43 | +; CHECK-NEXT: [[TMP15:%.*]] = or i1 [[TMP14]], [[MUL_OVERFLOW11]] |
| 44 | +; CHECK-NEXT: [[SCEVGEP12:%.*]] = getelementptr i8, ptr [[DST_2]], i64 8 |
| 45 | +; CHECK-NEXT: [[MUL13:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 46 | +; CHECK-NEXT: [[MUL_RESULT14:%.*]] = extractvalue { i64, i1 } [[MUL13]], 0 |
| 47 | +; CHECK-NEXT: [[MUL_OVERFLOW15:%.*]] = extractvalue { i64, i1 } [[MUL13]], 1 |
| 48 | +; CHECK-NEXT: [[TMP16:%.*]] = sub i64 0, [[MUL_RESULT14]] |
| 49 | +; CHECK-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[SCEVGEP12]], i64 [[MUL_RESULT14]] |
| 50 | +; CHECK-NEXT: [[TMP18:%.*]] = icmp ult ptr [[TMP17]], [[SCEVGEP12]] |
| 51 | +; CHECK-NEXT: [[TMP19:%.*]] = or i1 [[TMP18]], [[MUL_OVERFLOW15]] |
| 52 | +; CHECK-NEXT: [[SCEVGEP16:%.*]] = getelementptr i8, ptr [[DST_2]], i64 12 |
| 53 | +; CHECK-NEXT: [[MUL17:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 54 | +; CHECK-NEXT: [[MUL_RESULT18:%.*]] = extractvalue { i64, i1 } [[MUL17]], 0 |
| 55 | +; CHECK-NEXT: [[MUL_OVERFLOW19:%.*]] = extractvalue { i64, i1 } [[MUL17]], 1 |
| 56 | +; CHECK-NEXT: [[TMP20:%.*]] = sub i64 0, [[MUL_RESULT18]] |
| 57 | +; CHECK-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr [[SCEVGEP16]], i64 [[MUL_RESULT18]] |
| 58 | +; CHECK-NEXT: [[TMP22:%.*]] = icmp ult ptr [[TMP21]], [[SCEVGEP16]] |
| 59 | +; CHECK-NEXT: [[TMP23:%.*]] = or i1 [[TMP22]], [[MUL_OVERFLOW19]] |
| 60 | +; CHECK-NEXT: [[SCEVGEP20:%.*]] = getelementptr i8, ptr [[DST_2]], i64 4 |
| 61 | +; CHECK-NEXT: [[MUL21:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 62 | +; CHECK-NEXT: [[MUL_RESULT22:%.*]] = extractvalue { i64, i1 } [[MUL21]], 0 |
| 63 | +; CHECK-NEXT: [[MUL_OVERFLOW23:%.*]] = extractvalue { i64, i1 } [[MUL21]], 1 |
| 64 | +; CHECK-NEXT: [[TMP24:%.*]] = sub i64 0, [[MUL_RESULT22]] |
| 65 | +; CHECK-NEXT: [[TMP25:%.*]] = getelementptr i8, ptr [[SCEVGEP20]], i64 [[MUL_RESULT22]] |
| 66 | +; CHECK-NEXT: [[TMP26:%.*]] = icmp ult ptr [[TMP25]], [[SCEVGEP20]] |
| 67 | +; CHECK-NEXT: [[TMP27:%.*]] = or i1 [[TMP26]], [[MUL_OVERFLOW23]] |
| 68 | +; CHECK-NEXT: [[MUL24:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 16, i64 -1) |
| 69 | +; CHECK-NEXT: [[MUL_RESULT25:%.*]] = extractvalue { i64, i1 } [[MUL24]], 0 |
| 70 | +; CHECK-NEXT: [[MUL_OVERFLOW26:%.*]] = extractvalue { i64, i1 } [[MUL24]], 1 |
| 71 | +; CHECK-NEXT: [[TMP28:%.*]] = sub i64 0, [[MUL_RESULT25]] |
| 72 | +; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[DST_2]], i64 [[MUL_RESULT25]] |
| 73 | +; CHECK-NEXT: [[TMP30:%.*]] = icmp ult ptr [[TMP29]], [[DST_2]] |
| 74 | +; CHECK-NEXT: [[TMP31:%.*]] = or i1 [[TMP30]], [[MUL_OVERFLOW26]] |
| 75 | +; CHECK-NEXT: [[TMP32:%.*]] = or i1 [[TMP3]], [[TMP7]] |
| 76 | +; CHECK-NEXT: [[TMP33:%.*]] = or i1 [[TMP32]], [[TMP11]] |
| 77 | +; CHECK-NEXT: [[TMP34:%.*]] = or i1 [[TMP33]], [[TMP15]] |
| 78 | +; CHECK-NEXT: [[TMP35:%.*]] = or i1 [[TMP34]], [[TMP19]] |
| 79 | +; CHECK-NEXT: [[TMP36:%.*]] = or i1 [[TMP35]], [[TMP23]] |
| 80 | +; CHECK-NEXT: [[TMP37:%.*]] = or i1 [[TMP36]], [[TMP27]] |
| 81 | +; CHECK-NEXT: [[TMP38:%.*]] = or i1 [[TMP37]], [[TMP31]] |
| 82 | +; CHECK-NEXT: br i1 [[TMP38]], label %[[SCALAR_PH]], label %[[VECTOR_PH:.*]] |
| 83 | +; CHECK: [[VECTOR_PH]]: |
| 84 | +; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] |
| 85 | +; CHECK: [[VECTOR_BODY]]: |
| 86 | +; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ] |
| 87 | +; CHECK-NEXT: [[TMP39:%.*]] = add i64 [[INDEX]], 0 |
| 88 | +; CHECK-NEXT: [[TMP40:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 89 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <4 x float> poison, float [[TMP40]], i64 0 |
| 90 | +; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT]], <4 x float> poison, <4 x i32> zeroinitializer |
| 91 | +; CHECK-NEXT: [[TMP41:%.*]] = shl i64 [[TMP39]], 2 |
| 92 | +; CHECK-NEXT: [[TMP42:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 93 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT33:%.*]] = insertelement <4 x float> poison, float [[TMP42]], i64 0 |
| 94 | +; CHECK-NEXT: [[BROADCAST_SPLAT34:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT33]], <4 x float> poison, <4 x i32> zeroinitializer |
| 95 | +; CHECK-NEXT: [[TMP43:%.*]] = or disjoint i64 [[TMP41]], 3 |
| 96 | +; CHECK-NEXT: [[TMP44:%.*]] = getelementptr float, ptr [[DST_1]], i64 [[TMP43]] |
| 97 | +; CHECK-NEXT: [[TMP45:%.*]] = getelementptr float, ptr [[TMP44]], i32 -3 |
| 98 | +; CHECK-NEXT: [[TMP46:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLAT]], <4 x float> [[BROADCAST_SPLAT34]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> |
| 99 | +; CHECK-NEXT: [[TMP47:%.*]] = shufflevector <8 x float> [[TMP46]], <8 x float> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> |
| 100 | +; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <16 x float> [[TMP47]], <16 x float> poison, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15> |
| 101 | +; CHECK-NEXT: store <16 x float> [[INTERLEAVED_VEC]], ptr [[TMP45]], align 4 |
| 102 | +; CHECK-NEXT: [[TMP48:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 103 | +; CHECK-NEXT: [[BROADCAST_SPLATINSERT35:%.*]] = insertelement <4 x float> poison, float [[TMP48]], i64 0 |
| 104 | +; CHECK-NEXT: [[BROADCAST_SPLAT36:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLATINSERT35]], <4 x float> poison, <4 x i32> zeroinitializer |
| 105 | +; CHECK-NEXT: [[TMP49:%.*]] = getelementptr float, ptr [[DST_2]], i64 [[TMP43]] |
| 106 | +; CHECK-NEXT: [[TMP50:%.*]] = getelementptr float, ptr [[TMP49]], i32 -3 |
| 107 | +; CHECK-NEXT: [[TMP51:%.*]] = shufflevector <4 x float> [[BROADCAST_SPLAT36]], <4 x float> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> |
| 108 | +; CHECK-NEXT: [[TMP52:%.*]] = shufflevector <8 x float> [[TMP51]], <8 x float> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> |
| 109 | +; CHECK-NEXT: [[INTERLEAVED_VEC37:%.*]] = shufflevector <16 x float> [[TMP52]], <16 x float> poison, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15> |
| 110 | +; CHECK-NEXT: store <16 x float> [[INTERLEAVED_VEC37]], ptr [[TMP50]], align 4 |
| 111 | +; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 |
| 112 | +; CHECK-NEXT: [[TMP53:%.*]] = icmp eq i64 [[INDEX_NEXT]], 0 |
| 113 | +; CHECK-NEXT: br i1 [[TMP53]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] |
| 114 | +; CHECK: [[MIDDLE_BLOCK]]: |
| 115 | +; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]] |
| 116 | +; CHECK: [[SCALAR_PH]]: |
| 117 | +; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 0, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ], [ 0, %[[VECTOR_SCEVCHECK]] ] |
| 118 | +; CHECK-NEXT: br label %[[LOOP:.*]] |
| 119 | +; CHECK: [[LOOP]]: |
| 120 | +; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ] |
| 121 | +; CHECK-NEXT: [[L_0:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 122 | +; CHECK-NEXT: [[IV_MUL:%.*]] = shl i64 [[IV]], 2 |
| 123 | +; CHECK-NEXT: [[GEP_DST_19:%.*]] = getelementptr float, ptr [[DST_1]], i64 [[IV_MUL]] |
| 124 | +; CHECK-NEXT: store float [[L_0]], ptr [[GEP_DST_19]], align 4 |
| 125 | +; CHECK-NEXT: [[L_1:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 126 | +; CHECK-NEXT: [[ADD_1:%.*]] = or disjoint i64 [[IV_MUL]], 1 |
| 127 | +; CHECK-NEXT: [[GEP_DST_119:%.*]] = getelementptr float, ptr [[DST_1]], i64 [[ADD_1]] |
| 128 | +; CHECK-NEXT: store float [[L_1]], ptr [[GEP_DST_119]], align 4 |
| 129 | +; CHECK-NEXT: [[ADD_2:%.*]] = or disjoint i64 [[IV_MUL]], 2 |
| 130 | +; CHECK-NEXT: [[GEP_DST_129:%.*]] = getelementptr float, ptr [[DST_1]], i64 [[ADD_2]] |
| 131 | +; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_DST_129]], align 4 |
| 132 | +; CHECK-NEXT: [[ADD_3:%.*]] = or disjoint i64 [[IV_MUL]], 3 |
| 133 | +; CHECK-NEXT: [[GEP_DST_140:%.*]] = getelementptr float, ptr [[DST_1]], i64 [[ADD_3]] |
| 134 | +; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_DST_140]], align 4 |
| 135 | +; CHECK-NEXT: [[L_2:%.*]] = load float, ptr [[P_INVAR]], align 4 |
| 136 | +; CHECK-NEXT: [[GEP_DST_247:%.*]] = getelementptr float, ptr [[DST_2]], i64 [[IV_MUL]] |
| 137 | +; CHECK-NEXT: store float [[L_2]], ptr [[GEP_DST_247]], align 4 |
| 138 | +; CHECK-NEXT: [[GEP_DST_255:%.*]] = getelementptr float, ptr [[DST_2]], i64 [[ADD_1]] |
| 139 | +; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_DST_255]], align 4 |
| 140 | +; CHECK-NEXT: [[GEP_DST_265:%.*]] = getelementptr float, ptr [[DST_2]], i64 [[ADD_2]] |
| 141 | +; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_DST_265]], align 4 |
| 142 | +; CHECK-NEXT: [[GEP_DST_276:%.*]] = getelementptr float, ptr [[DST_2]], i64 [[ADD_3]] |
| 143 | +; CHECK-NEXT: store float 0.000000e+00, ptr [[GEP_DST_276]], align 4 |
| 144 | +; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1 |
| 145 | +; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 0 |
| 146 | +; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP3:![0-9]+]] |
| 147 | +; CHECK: [[EXIT]]: |
| 148 | +; CHECK-NEXT: ret void |
| 149 | +; |
| 150 | +entry: |
| 151 | + br label %loop |
| 152 | + |
| 153 | +loop: |
| 154 | + %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] |
| 155 | + %l.0 = load float, ptr %p.invar, align 4 |
| 156 | + %iv.mul = shl i64 %iv, 2 |
| 157 | + %gep.dst.19 = getelementptr float, ptr %dst.1, i64 %iv.mul |
| 158 | + store float %l.0, ptr %gep.dst.19, align 4 |
| 159 | + %l.1 = load float, ptr %p.invar, align 4 |
| 160 | + %add.1 = or disjoint i64 %iv.mul, 1 |
| 161 | + %gep.dst.119 = getelementptr float, ptr %dst.1, i64 %add.1 |
| 162 | + store float %l.1, ptr %gep.dst.119, align 4 |
| 163 | + %add.2 = or disjoint i64 %iv.mul, 2 |
| 164 | + %gep.dst.129 = getelementptr float, ptr %dst.1, i64 %add.2 |
| 165 | + store float 0.000000e+00, ptr %gep.dst.129, align 4 |
| 166 | + %add.3 = or disjoint i64 %iv.mul, 3 |
| 167 | + %gep.dst.140 = getelementptr float, ptr %dst.1, i64 %add.3 |
| 168 | + store float 0.000000e+00, ptr %gep.dst.140, align 4 |
| 169 | + %l.2 = load float, ptr %p.invar, align 4 |
| 170 | + %gep.dst.247 = getelementptr float, ptr %dst.2, i64 %iv.mul |
| 171 | + store float %l.2, ptr %gep.dst.247, align 4 |
| 172 | + %gep.dst.255 = getelementptr float, ptr %dst.2, i64 %add.1 |
| 173 | + store float 0.000000e+00, ptr %gep.dst.255, align 4 |
| 174 | + %gep.dst.265 = getelementptr float, ptr %dst.2, i64 %add.2 |
| 175 | + store float 0.000000e+00, ptr %gep.dst.265, align 4 |
| 176 | + %gep.dst.276 = getelementptr float, ptr %dst.2, i64 %add.3 |
| 177 | + store float 0.000000e+00, ptr %gep.dst.276, align 4 |
| 178 | + %iv.next = add i64 %iv, 1 |
| 179 | + %ec = icmp eq i64 %iv.next, 0 |
| 180 | + br i1 %ec, label %exit, label %loop |
| 181 | + |
| 182 | +exit: |
| 183 | + ret void |
| 184 | +} |
| 185 | +;. |
| 186 | +; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]} |
| 187 | +; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1} |
| 188 | +; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"} |
| 189 | +; CHECK: [[LOOP3]] = distinct !{[[LOOP3]], [[META1]]} |
| 190 | +;. |
0 commit comments