@@ -75,27 +75,33 @@ namespace Slang
75
75
}
76
76
}
77
77
// Check all address loads.
78
- List<IRLoad *> loads ;
78
+ List<IRInst *> loadsAndReturns ;
79
79
for (auto addr : addresses)
80
80
{
81
81
for (auto use = addr->firstUse ; use; use = use->nextUse )
82
82
{
83
83
if (auto load = as<IRLoad>(use->getUser ()))
84
- loads .add (load);
84
+ loadsAndReturns .add (load);
85
85
}
86
86
}
87
+ for (const auto & b : func->getBlocks ())
88
+ {
89
+ auto t = b->getTerminator ();
90
+ if (t->m_op == kIROp_Return )
91
+ loadsAndReturns.add (t);
92
+ }
87
93
88
94
for (auto store : stores)
89
95
{
90
96
// Remove insts from `loads` that is reachable from the store.
91
- for (Index i = 0 ; i < loads .getCount ();)
97
+ for (Index i = 0 ; i < loadsAndReturns .getCount ();)
92
98
{
93
- auto load = loads [i];
94
- if (!canAddressesPotentiallyAlias (func, store.address , loads[i] ->getPtr ()))
99
+ auto load = as<IRLoad>(loadsAndReturns [i]) ;
100
+ if (load && !canAddressesPotentiallyAlias (func, store.address , load ->getPtr ()))
95
101
continue ;
96
- if (reachability.isInstReachable (store.storeInst , load ))
102
+ if (reachability.isInstReachable (store.storeInst , loadsAndReturns[i] ))
97
103
{
98
- loads .fastRemoveAt (i);
104
+ loadsAndReturns .fastRemoveAt (i);
99
105
}
100
106
else
101
107
{
@@ -104,9 +110,14 @@ namespace Slang
104
110
}
105
111
}
106
112
// If there are any loads left, it means they are using uninitialized out params.
107
- for (auto load : loads )
113
+ for (auto load : loadsAndReturns )
108
114
{
109
- sink->diagnose (load, Diagnostics::usingUninitializedValue);
115
+ sink->diagnose (
116
+ load,
117
+ load->m_op == kIROp_Return
118
+ ? Diagnostics::returningWithUninitializedOut
119
+ : Diagnostics::usingUninitializedValue,
120
+ param);
110
121
}
111
122
}
112
123
}
0 commit comments