diff --git a/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp b/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp index 7dc4d9ee9e341..7cbeb4b7cbbd0 100644 --- a/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp +++ b/llvm/lib/Transforms/IPO/IPConstantPropagation.cpp @@ -254,7 +254,7 @@ static bool PropagateConstantReturn(Function &F) { // Find the index of the retval to replace with int index = -1; if (ExtractValueInst *EV = dyn_cast(Ins)) - if (EV->hasIndices()) + if (EV->getNumIndices() == 1) index = *EV->idx_begin(); // If this use uses a specific return value, and we have a replacement, diff --git a/llvm/test/Transforms/IPConstantProp/PR43857.ll b/llvm/test/Transforms/IPConstantProp/PR43857.ll new file mode 100644 index 0000000000000..d098d552b3fc7 --- /dev/null +++ b/llvm/test/Transforms/IPConstantProp/PR43857.ll @@ -0,0 +1,29 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -ipconstprop | FileCheck %s + +%struct.wobble = type { i32 } +%struct.zot = type { %struct.wobble, %struct.wobble, %struct.wobble } + +declare dso_local fastcc float @bar(%struct.wobble* noalias, <8 x i32>) unnamed_addr + +define %struct.zot @widget(<8 x i32> %arg) local_unnamed_addr { +; CHECK-LABEL: define {{[^@]+}}@widget( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret [[STRUCT_ZOT:%.*]] undef +; +bb: + ret %struct.zot undef +} + +define void @baz(<8 x i32> %arg) local_unnamed_addr { +; CHECK-LABEL: define {{[^@]+}}@baz( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP:%.*]] = call [[STRUCT_ZOT:%.*]] @widget(<8 x i32> [[ARG:%.*]]) +; CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_ZOT]] %tmp, 0, 0 +; CHECK-NEXT: ret void +; +bb: + %tmp = call %struct.zot @widget(<8 x i32> %arg) + %tmp1 = extractvalue %struct.zot %tmp, 0, 0 + ret void +}