-
Notifications
You must be signed in to change notification settings - Fork 14.5k
Closed
llvm/llvm-project-release-prs
#674Description
For the following IR:
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "aarch64-none-linux-gnu"
define void @foo() #0 {
bb:
br label %bb173
bb173: ; preds = %bb173, %bb
%phi177 = phi <2 x i32> [ %add190, %bb173 ], [ zeroinitializer, %bb ]
%phi178 = phi <2 x i32> [ %add187, %bb173 ], [ zeroinitializer, %bb ]
%add185 = add <2 x i32> %phi178, <i32 1, i32 1>
%add186 = add <2 x i32> %phi177, <i32 1, i32 1>
%shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
%add187 = add <2 x i32> %add185, %shufflevector
%shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
%add190 = add <2 x i32> %add186, %shufflevector189
br i1 poison, label %bb193, label %bb173
bb193: ; preds = %bb173
%add194 = or <2 x i32> %add190, %add187
store volatile i32 0, ptr null, align 4
unreachable
}
attributes #0 = { "target-cpu"="neoverse-v1" }
Complex deinterleaving produced broken code:
identifyNode on %add187 = add <2 x i32> %add185, %shufflevector / %add190 = add <2 x i32> %add186, %shufflevector189
identifyNode on %add185 = add <2 x i32> %phi178, <i32 1, i32 1> / %add186 = add <2 x i32> %phi177, <i32 1, i32 1>
identifyNode on %phi178 = phi <2 x i32> [ %add187, %bb173 ], [ zeroinitializer, %bb ] / %phi177 = phi <2 x i32> [ %add190, %bb173 ], [ zeroinitializer, %bb ]
identifyNode on <2 x i32> <i32 1, i32 1> / <2 x i32> <i32 1, i32 1>
identifyNode on %shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer / %shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
Identified reduction starting from instructions: %add187 = add <2 x i32> %add185, %shufflevector / %add190 = add <2 x i32> %add186, %shufflevector189
Verifying parent property of node %bb173
Verifying parent property of node %bb
*** IR Dump After Complex Deinterleaving Pass (complex-deinterleaving) ***
define void @foo() #0 {
bb:
%0 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> zeroinitializer, <2 x i32> zeroinitializer)
br label %bb173
bb173: ; preds = %bb173, %bb
%1 = phi <4 x i32> [ %0, %bb ], [ %4, %bb173 ]
%shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
%2 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> <i32 1, i32 1>, <2 x i32> <i32 1, i32 1>)
%3 = add <4 x i32> %1, %2
%4 = add <4 x i32> %3, %5
%shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
%5 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> %shufflevector, <2 x i32> %shufflevector189)
br i1 true, label %bb193, label %bb173
bb193: ; preds = %bb173
%6 = call { <2 x i32>, <2 x i32> } @llvm.experimental.vector.deinterleave2.v4i32(<4 x i32> %4)
%7 = extractvalue { <2 x i32>, <2 x i32> } %6, 0
%8 = extractvalue { <2 x i32>, <2 x i32> } %6, 1
%add194 = or <2 x i32> %8, %7
store volatile i32 0, ptr null, align 4
unreachable
}
... eventually
Instruction does not dominate all uses!
%4 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> %shufflevector, <2 x i32> %shufflevector189)
%3 = add <4 x i32> %2, %4
in function foo
LLVM ERROR: Broken function found, compilation aborted!
Godbolt link https://godbolt.org/z/7zbbePPd6
Bisect pointed to c15557d by @igogo-x86
Metadata
Metadata
Assignees
Type
Projects
Status
Done