diff --git a/llvm/test/tools/llvm-diff/initializers.ll b/llvm/test/tools/llvm-diff/initializers.ll --- a/llvm/test/tools/llvm-diff/initializers.ll +++ b/llvm/test/tools/llvm-diff/initializers.ll @@ -36,3 +36,12 @@ call void undef(%struct.mutex* @vmx_l1d_flush_mutex) ret i32 undef } + +; An initializer could use itself as part of the initialization. + +@kvm_debugfs_entries = internal global %struct.list_head { %struct.list_head* @kvm_debugfs_entries, %struct.list_head* @kvm_debugfs_entries }, align 8 + +define i64 @mux() { + %1 = load i8*, i8** bitcast (%struct.list_head* @kvm_debugfs_entries to i8**), align 8 + ret i64 undef +} diff --git a/llvm/tools/llvm-diff/DifferenceEngine.cpp b/llvm/tools/llvm-diff/DifferenceEngine.cpp --- a/llvm/tools/llvm-diff/DifferenceEngine.cpp +++ b/llvm/tools/llvm-diff/DifferenceEngine.cpp @@ -490,6 +490,16 @@ const Value *LAgg = CSL->getAggregateElement(I); const Value *RAgg = CSR->getAggregateElement(I); + if (LAgg == SavedLHS || RAgg == SavedRHS) { + if (LAgg != SavedLHS || RAgg != SavedRHS) + // If the left and right operands aren't both re-analyzing the + // variable, then the initialiers don't match, so report "false". + // Otherwise, we skip these operands.. + return false; + + continue; + } + if (!equivalentAsOperands(LAgg, RAgg)) { return false; }