Course Contents: I. Parallel programming constructs basics (2 weeks) Introduction to concurrent programming, processes, threads, tasks, mutual-exclusion, synchronization, shared-memory communication, distributed memory communication II. Program analysis basics (3 weeks) Abstract Interpretation, forward analysis (example, reaching definition analysis), backward analysis (example, liveness analysis), dimensions of different analysis (context sensitivity, flow sensitivity), points-to analysis, dependence analysis, call graph construction. III. Parallel program representation (1 week). Introduction to traditional intermediate representation (IR). Representation of parallel programs - program structure trees/graphs, parallel program graphs, IV. MHP analysis and its impact on traditional analysis (4 weeks) May Happen in Parallel (MHP) analysis. Intra-procedural, inter-procedural analysis, whole-program analysis and incremental analysis, impact of MHP analysis on points-to analysis, alias analysis, call-graph construction, and dependence analysis. V. Parallel-Program Specific analysis (2 weeks) Data-race detection - static and dynamic, Deadlock detection. VI. Advanced Topics: (2 weeks) Performance Analysis: Amdahl's law, memory consistency models, impact of memory consistency on program optimizations, reducing communication overheads, analyzing irregular programs. Verification: Owicki-Gries Method, Rely-guarantee.