Index: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp @@ -5334,6 +5334,11 @@ if (!BasicBlockFwdRefs.empty()) return error("Never resolved function from blockaddress"); + // Upgrading intrinsic calls before TBAA can cause TBAA metadata to be lost, + // to prevent this instructions with TBAA tags should be upgraded first. + for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) + UpgradeInstWithTBAATag(InstsWithTBAATag[I]); + // Upgrade any intrinsic calls that slipped through (should not happen!) and // delete the old functions to clean up. We can't do this unless the entire // module is materialized because there could always be another function body @@ -5349,9 +5354,6 @@ } UpgradedIntrinsics.clear(); - for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++) - UpgradeInstWithTBAATag(InstsWithTBAATag[I]); - UpgradeDebugInfo(*TheModule); return std::error_code(); } Index: llvm/trunk/test/Assembler/auto_upgrade_intrinsics.ll =================================================================== --- llvm/trunk/test/Assembler/auto_upgrade_intrinsics.ll +++ llvm/trunk/test/Assembler/auto_upgrade_intrinsics.ll @@ -63,7 +63,7 @@ define <2 x double> @tests.masked.load(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %passthru) { ; CHECK-LABEL: @tests.masked.load( ; CHECK: @llvm.masked.load.v2f64.p0v2f64 - %res = call <2 x double> @llvm.masked.load.v2f64(<2 x double>* %ptr, i32 1, <2 x i1> %mask, <2 x double> %passthru) + %res = call <2 x double> @llvm.masked.load.v2f64(<2 x double>* %ptr, i32 1, <2 x i1> %mask, <2 x double> %passthru), !tbaa !0 ret <2 x double> %res } @@ -72,6 +72,10 @@ define void @tests.masked.store(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %val) { ; CHECK-LABEL: @tests.masked.store( ; CHECK: @llvm.masked.store.v2f64.p0v2f64 - call void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptr, i32 3, <2 x i1> %mask) + call void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptr, i32 3, <2 x i1> %mask), !tbaa !0 ret void -} \ No newline at end of file +} + +!0 = !{!"omnipotent char", !1} +!1 = !{!"Simple C/C++ TBAA"} +!2 = !{!"double", !0}