[llvm] [LoopVectorize] Don't replace widen with replicate for ExtractValueInst (PR #193404)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 23 01:43:15 PDT 2026


================
@@ -0,0 +1,61 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=loop-vectorize -force-vector-width=2 -force-vector-interleave=1 -S 2>%t | FileCheck %s
+
+; Regression test from https://github.com/llvm/llvm-project/issues/193275
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+
+; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
+declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64)
+
+define void @func(ptr %p) #1 {
+; CHECK-LABEL: define void @func(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]
+; CHECK:       [[VECTOR_PH]]:
+; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
+; CHECK:       [[VECTOR_BODY]]:
+; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = call { <2 x i64>, <2 x i1> } @llvm.sadd.with.overflow.v2i64(<2 x i64> [[VEC_IND]], <2 x i64> splat (i64 1))
+; CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { <2 x i64>, <2 x i1> } [[TMP0]], 0
+; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i64> [[TMP1]], i64 0
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr [8 x i8], ptr [[P]], i64 [[TMP2]]
+; CHECK-NEXT:    store <2 x i64> zeroinitializer, ptr [[TMP3]], align 8
+; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
+; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
+; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], -9223372036854775808
+; CHECK-NEXT:    br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK:       [[MIDDLE_BLOCK]]:
+; CHECK-NEXT:    br label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop.header
+
+loop.header:                                           ; preds = %loop.latch, %entry
+  %var4 = phi i64 [ 0, %entry ], [ %sum2, %loop.latch ]
+  %n.026 = phi i64 [ 0, %entry ], [ %sum1, %loop.latch ]
+  %res1 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %n.026, i64 1)
+  %sum1 = extractvalue { i64, i1 } %res1, 0
+  br label %loop.latch
+
+loop.latch:                                         ; preds = %loop.header
+  %n.02 = phi i64 [ %sum1, %loop.header ]
+  %arrayidx37 = getelementptr [8 x i8], ptr %p, i64 %n.02
+  store i64 0, ptr %arrayidx37, align 8
+  %res2 = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %var4, i64 1)
+  %sum2 = extractvalue { i64, i1 } %res2, 0
+  %overflow2 = extractvalue { i64, i1 } %res2, 1
+  br i1 %overflow2, label %exit, label %loop.header
+
+exit:                          ; preds = %loop.latch
+  ret void
+}
+;.
+; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
+; CHECK: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
+; CHECK: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
+;.
----------------
fhahn wrote:

can you generate with `--check-globals=none`

https://github.com/llvm/llvm-project/pull/193404


More information about the llvm-commits mailing list