diff --git a/.github/workflows/check-implicit-this.yml b/.github/workflows/check-implicit-this.yml
index 8711d7955bc7f..14100ed332525 100644
--- a/.github/workflows/check-implicit-this.yml
+++ b/.github/workflows/check-implicit-this.yml
@@ -13,7 +13,7 @@ jobs:
check:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Check that implicit this warnings is enabled for all packs
shell: bash
run: |
diff --git a/.github/workflows/check-qldoc.yml b/.github/workflows/check-qldoc.yml
index 6cb99154aa494..7996123e9bf3a 100644
--- a/.github/workflows/check-qldoc.yml
+++ b/.github/workflows/check-qldoc.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
with:
fetch-depth: 2
diff --git a/.github/workflows/check-query-ids.yml b/.github/workflows/check-query-ids.yml
index 9ce9ed5ba85a8..9e84fe0b0e352 100644
--- a/.github/workflows/check-query-ids.yml
+++ b/.github/workflows/check-query-ids.yml
@@ -16,6 +16,6 @@ jobs:
name: Check query IDs
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Check for duplicate query IDs
run: python3 misc/scripts/check-query-ids.py
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index dc4fa17c14d6e..b72cf6c6279b1 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -33,7 +33,7 @@ jobs:
dotnet-version: 7.0.102
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml
index ac63af81ccd7f..f3600dc0c5ead 100644
--- a/.github/workflows/compile-queries.yml
+++ b/.github/workflows/compile-queries.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
with:
diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml
index 568bad3a945f9..b7a498699a25d 100644
--- a/.github/workflows/csharp-qltest.yml
+++ b/.github/workflows/csharp-qltest.yml
@@ -29,7 +29,7 @@ jobs:
qlupgrade:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- name: Check DB upgrade scripts
run: |
@@ -52,7 +52,7 @@ jobs:
matrix:
slice: ["1/2", "2/2"]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- uses: ./csharp/actions/create-extractor-pack
- name: Cache compilation cache
@@ -73,7 +73,7 @@ jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Setup dotnet
uses: actions/setup-dotnet@v3
with:
diff --git a/.github/workflows/csv-coverage-metrics.yml b/.github/workflows/csv-coverage-metrics.yml
index f18671441cd72..e24c6bc74a4cb 100644
--- a/.github/workflows/csv-coverage-metrics.yml
+++ b/.github/workflows/csv-coverage-metrics.yml
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database
@@ -47,7 +47,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database
diff --git a/.github/workflows/csv-coverage-pr-artifacts.yml b/.github/workflows/csv-coverage-pr-artifacts.yml
index b560d98a79d9f..48c55b2a6301f 100644
--- a/.github/workflows/csv-coverage-pr-artifacts.yml
+++ b/.github/workflows/csv-coverage-pr-artifacts.yml
@@ -31,11 +31,11 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql) - MERGE
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: merge
- name: Clone self (github/codeql) - BASE
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 2
path: base
diff --git a/.github/workflows/csv-coverage-pr-comment.yml b/.github/workflows/csv-coverage-pr-comment.yml
index 095ab7b3bed28..86fe74d3419a5 100644
--- a/.github/workflows/csv-coverage-pr-comment.yml
+++ b/.github/workflows/csv-coverage-pr-comment.yml
@@ -20,7 +20,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up Python 3.8
uses: actions/setup-python@v4
with:
diff --git a/.github/workflows/csv-coverage-timeseries.yml b/.github/workflows/csv-coverage-timeseries.yml
index 42fd4711dac85..cf2758dd9d344 100644
--- a/.github/workflows/csv-coverage-timeseries.yml
+++ b/.github/workflows/csv-coverage-timeseries.yml
@@ -9,11 +9,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: script
- name: Clone self (github/codeql) for analysis
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: codeqlModels
fetch-depth: 0
diff --git a/.github/workflows/csv-coverage-update.yml b/.github/workflows/csv-coverage-update.yml
index 6474044c4837a..ccf1ffd470538 100644
--- a/.github/workflows/csv-coverage-update.yml
+++ b/.github/workflows/csv-coverage-update.yml
@@ -17,7 +17,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: ql
fetch-depth: 0
diff --git a/.github/workflows/csv-coverage.yml b/.github/workflows/csv-coverage.yml
index e330490b69bab..4fb1d143fc394 100644
--- a/.github/workflows/csv-coverage.yml
+++ b/.github/workflows/csv-coverage.yml
@@ -13,11 +13,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: script
- name: Clone self (github/codeql) for analysis
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: codeqlModels
ref: ${{ github.event.inputs.qlModelShaOverride || github.ref }}
diff --git a/.github/workflows/fast-forward.yml b/.github/workflows/fast-forward.yml
index aedbf3573a716..c89675efc4ed4 100644
--- a/.github/workflows/fast-forward.yml
+++ b/.github/workflows/fast-forward.yml
@@ -25,7 +25,7 @@ jobs:
exit 1
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Git config
shell: bash
diff --git a/.github/workflows/go-tests-other-os.yml b/.github/workflows/go-tests-other-os.yml
index 7b5449fa4c5d3..09765011a18f1 100644
--- a/.github/workflows/go-tests-other-os.yml
+++ b/.github/workflows/go-tests-other-os.yml
@@ -21,7 +21,7 @@ jobs:
id: go
- name: Check out code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Set up CodeQL CLI
uses: ./.github/actions/fetch-codeql
@@ -56,7 +56,7 @@ jobs:
id: go
- name: Check out code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Set up CodeQL CLI
uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml
index 7078c733f01a6..7885f504bba3a 100644
--- a/.github/workflows/go-tests.yml
+++ b/.github/workflows/go-tests.yml
@@ -29,7 +29,7 @@ jobs:
id: go
- name: Check out code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Set up CodeQL CLI
uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/js-ml-tests.yml b/.github/workflows/js-ml-tests.yml
index 90cb569112674..866ca14053e98 100644
--- a/.github/workflows/js-ml-tests.yml
+++ b/.github/workflows/js-ml-tests.yml
@@ -27,7 +27,7 @@ jobs:
name: Test QL
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/mad_modelDiff.yml b/.github/workflows/mad_modelDiff.yml
index 8cfaac6f1347c..17640da9f2e14 100644
--- a/.github/workflows/mad_modelDiff.yml
+++ b/.github/workflows/mad_modelDiff.yml
@@ -27,12 +27,12 @@ jobs:
slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}}
steps:
- name: Clone github/codeql from PR
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
if: github.event.pull_request
with:
path: codeql-pr
- name: Clone github/codeql from main
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: codeql-main
ref: main
diff --git a/.github/workflows/mad_regenerate-models.yml b/.github/workflows/mad_regenerate-models.yml
index 6b3d0347a86e2..3268a17dfbb4e 100644
--- a/.github/workflows/mad_regenerate-models.yml
+++ b/.github/workflows/mad_regenerate-models.yml
@@ -27,11 +27,11 @@ jobs:
ref: "placeholder"
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup CodeQL binaries
uses: ./.github/actions/fetch-codeql
- name: Clone repositories
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: repos/${{ matrix.ref }}
ref: ${{ matrix.ref }}
diff --git a/.github/workflows/qhelp-pr-preview.yml b/.github/workflows/qhelp-pr-preview.yml
index a44ef5ad48d59..8b20fbe00c96a 100644
--- a/.github/workflows/qhelp-pr-preview.yml
+++ b/.github/workflows/qhelp-pr-preview.yml
@@ -43,7 +43,7 @@ jobs:
if-no-files-found: error
retention-days: 1
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
with:
fetch-depth: 2
persist-credentials: false
diff --git a/.github/workflows/ql-for-ql-build.yml b/.github/workflows/ql-for-ql-build.yml
index 10086d78d78a3..e8ac1fa0f1734 100644
--- a/.github/workflows/ql-for-ql-build.yml
+++ b/.github/workflows/ql-for-ql-build.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
### Build the queries ###
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Find codeql
diff --git a/.github/workflows/ql-for-ql-dataset_measure.yml b/.github/workflows/ql-for-ql-dataset_measure.yml
index 2c7d037f9273f..d317d467c9aa2 100644
--- a/.github/workflows/ql-for-ql-dataset_measure.yml
+++ b/.github/workflows/ql-for-ql-dataset_measure.yml
@@ -21,7 +21,7 @@ jobs:
- github/codeql
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Find codeql
id: find-codeql
@@ -42,7 +42,7 @@ jobs:
env:
CODEQL: ${{ steps.find-codeql.outputs.codeql-path }}
- name: Checkout ${{ matrix.repo }}
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -71,7 +71,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name: measurements
diff --git a/.github/workflows/ql-for-ql-tests.yml b/.github/workflows/ql-for-ql-tests.yml
index c89527113df58..4385e3f76bb14 100644
--- a/.github/workflows/ql-for-ql-tests.yml
+++ b/.github/workflows/ql-for-ql-tests.yml
@@ -21,7 +21,7 @@ jobs:
qltest:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Find codeql
id: find-codeql
uses: github/codeql-action/init@v2
@@ -61,7 +61,7 @@ jobs:
needs: [qltest]
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install GNU tar
if: runner.os == 'macOS'
run: |
diff --git a/.github/workflows/query-list.yml b/.github/workflows/query-list.yml
index efb295dfcf8be..07fb3b682da3f 100644
--- a/.github/workflows/query-list.yml
+++ b/.github/workflows/query-list.yml
@@ -20,7 +20,7 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: codeql
- name: Set up Python 3.8
diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml
index 935d9da642b33..392c6ff830262 100644
--- a/.github/workflows/ruby-build.yml
+++ b/.github/workflows/ruby-build.yml
@@ -42,7 +42,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install GNU tar
if: runner.os == 'macOS'
run: |
@@ -113,7 +113,7 @@ jobs:
compile-queries:
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql
- name: Cache compilation cache
@@ -145,7 +145,7 @@ jobs:
runs-on: ubuntu-latest
needs: [build, compile-queries]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name: ruby.dbscheme
@@ -206,7 +206,7 @@ jobs:
runs-on: ${{ matrix.os }}
needs: [package]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/ruby-dataset-measure.yml b/.github/workflows/ruby-dataset-measure.yml
index bb8bb6858fdc0..c064d8d2bfb4b 100644
--- a/.github/workflows/ruby-dataset-measure.yml
+++ b/.github/workflows/ruby-dataset-measure.yml
@@ -27,14 +27,14 @@ jobs:
repo: [rails/rails, discourse/discourse, spree/spree, ruby/ruby]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Checkout ${{ matrix.repo }}
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -59,7 +59,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name: measurements
diff --git a/.github/workflows/ruby-qltest.yml b/.github/workflows/ruby-qltest.yml
index b13cfabcd7d3f..19d5325091fde 100644
--- a/.github/workflows/ruby-qltest.yml
+++ b/.github/workflows/ruby-qltest.yml
@@ -33,7 +33,7 @@ jobs:
qlupgrade:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- name: Check DB upgrade scripts
run: |
@@ -54,7 +54,7 @@ jobs:
strategy:
fail-fast: false
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Cache compilation cache
diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml
index 075a5505f3971..8a04d47411810 100644
--- a/.github/workflows/swift.yml
+++ b/.github/workflows/swift.yml
@@ -39,31 +39,31 @@ jobs:
build-and-test-macos:
runs-on: macos-12-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/build-and-test
build-and-test-linux:
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/build-and-test
qltests-linux:
needs: build-and-test-linux
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/run-ql-tests
qltests-macos:
if : ${{ github.event_name == 'pull_request' }}
needs: build-and-test-macos
runs-on: macos-12-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/run-ql-tests
integration-tests-linux:
needs: build-and-test-linux
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/run-integration-tests
integration-tests-macos:
if : ${{ github.event_name == 'pull_request' }}
@@ -71,13 +71,13 @@ jobs:
runs-on: macos-12-xl
timeout-minutes: 60
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./swift/actions/run-integration-tests
codegen:
if : ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: bazelbuild/setup-bazelisk@v2
- uses: actions/setup-python@v4
with:
@@ -102,6 +102,6 @@ jobs:
if : ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- uses: ./.github/actions/fetch-codeql
- uses: ./swift/actions/database-upgrade-scripts
diff --git a/.github/workflows/sync-files.yml b/.github/workflows/sync-files.yml
index 8f4678f178871..7894eae7f55a8 100644
--- a/.github/workflows/sync-files.yml
+++ b/.github/workflows/sync-files.yml
@@ -14,7 +14,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Check synchronized files
run: python config/sync-files.py
- name: Check dbscheme fragments
diff --git a/.github/workflows/tree-sitter-extractor-test.yml b/.github/workflows/tree-sitter-extractor-test.yml
index d41c9083fdfae..5d13b25466d34 100644
--- a/.github/workflows/tree-sitter-extractor-test.yml
+++ b/.github/workflows/tree-sitter-extractor-test.yml
@@ -27,7 +27,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Check formatting
run: cargo fmt --all -- --check
- name: Run tests
@@ -35,12 +35,12 @@ jobs:
fmt:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Check formatting
run: cargo fmt --check
clippy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Run clippy
run: cargo clippy -- --no-deps -D warnings -A clippy::new_without_default -A clippy::too_many_arguments
diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml
index 44e0dc6df29ee..f8c1d9f650422 100644
--- a/.github/workflows/validate-change-notes.yml
+++ b/.github/workflows/validate-change-notes.yml
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj
index abf4f358a24f3..0c9f70c6d6d62 100644
--- a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj
+++ b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/Semmle.Autobuild.Cpp.Tests.csproj
@@ -11,12 +11,12 @@
-
-
+
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj b/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj
index 5e0d40cdfe228..f8f5c28507483 100644
--- a/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj
+++ b/cpp/autobuilder/Semmle.Autobuild.Cpp/Semmle.Autobuild.Cpp.csproj
@@ -17,7 +17,7 @@
-
+
diff --git a/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md b/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md
new file mode 100644
index 0000000000000..11c3b73668214
--- /dev/null
+++ b/cpp/ql/lib/change-notes/2023-09-06-as-defining-argument-off-by-one-fix.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* The `DataFlow::asDefiningArgument` predicate now takes its argument from the range starting at `1` instead of `2`. Queries that depend on the single-parameter version of `DataFlow::asDefiningArgument` should have their arguments updated accordingly.
diff --git a/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md b/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md
new file mode 100644
index 0000000000000..8f1b8e9be8882
--- /dev/null
+++ b/cpp/ql/lib/change-notes/2023-09-07-return-from-end.md
@@ -0,0 +1,5 @@
+---
+category: minorAnalysis
+---
+* Treat functions that reach the end of the function as returning in the IR.
+ They used to be treated as unreachable but it is allowed in C.
\ No newline at end of file
diff --git a/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md b/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md
new file mode 100644
index 0000000000000..6b2fff3d17678
--- /dev/null
+++ b/cpp/ql/lib/change-notes/2023-09-08-more-unreachble.md
@@ -0,0 +1,5 @@
+---
+category: minorAnalysis
+---
+* Functions that do not return due to calling functions that don't return (e.g. `exit`) are now detected as
+ non-returning in the IR and dataflow.
\ No newline at end of file
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
index 9355493303a82..7cc9d54a3041c 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
@@ -254,9 +254,7 @@ class Node extends TIRDataFlowNode {
* after the `f` has returned.
*/
Expr asDefiningArgument(int index) {
- // Subtract one because `DefinitionByReferenceNode` is defined to be in
- // the range `[0 ... n - 1]` for some `n` instead of `[1 ... n]`.
- this.(DefinitionByReferenceNode).getIndirectionIndex() = index - 1 and
+ this.(DefinitionByReferenceNode).getIndirectionIndex() = index and
result = this.(DefinitionByReferenceNode).getArgument()
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
index 11c77ef9613e6..7c34dc43d07b6 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
@@ -447,9 +447,16 @@ class GlobalUse extends UseImpl, TGlobalUse {
IRFunction getIRFunction() { result = f }
final override predicate hasIndexInBlock(IRBlock block, int index) {
- exists(ExitFunctionInstruction exit |
- exit = f.getExitFunctionInstruction() and
- block.getInstruction(index) = exit
+ // Similar to the `FinalParameterUse` case, we want to generate flow out of
+ // globals at any exit so that we can flow out of non-returning functions.
+ // Obviously this isn't correct as we can't actually flow but the global flow
+ // requires this if we want to flow into children.
+ exists(Instruction return |
+ return instanceof ReturnInstruction or
+ return instanceof UnreachedInstruction
+ |
+ block.getInstruction(index) = return and
+ return.getEnclosingIRFunction() = f
)
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
index 8c0695247f83a..ed4b39bc24bda 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
@@ -405,9 +405,6 @@ predicate hasUnreachedInstruction(IRFunction func) {
exists(Call c |
c.getEnclosingFunction() = func.getFunction() and
any(Options opt).exits(c.getTarget())
- ) and
- not exists(TranslatedUnreachableReturnStmt return |
- return.getEnclosingFunction().getFunction() = func.getFunction()
)
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
index 497c16d407dcb..aa7527451c3c4 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
@@ -442,29 +442,26 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt {
/**
* The IR translation of an implicit `return` statement generated by the extractor to handle control
- * flow that reaches the end of a non-`void`-returning function body. Since such control flow
- * produces undefined behavior, we simply generate an `Unreached` instruction to prevent that flow
- * from continuing on to pollute other analysis. The assumption is that the developer is certain
- * that the implicit `return` is unreachable, even if the compiler cannot prove it.
+ * flow that reaches the end of a non-`void`-returning function body. Such control flow
+ * produces undefined behavior in C++ but not in C. However even in C using the return value is
+ * undefined behaviour. We make it return uninitialized memory to get as much flow as possible.
*/
-class TranslatedUnreachableReturnStmt extends TranslatedReturnStmt {
- TranslatedUnreachableReturnStmt() {
+class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariableInitialization {
+ TranslatedNoValueReturnStmt() {
not stmt.hasExpr() and hasReturnValue(stmt.getEnclosingFunction())
}
- override TranslatedElement getChild(int id) { none() }
-
- override Instruction getFirstInstruction() { result = this.getInstruction(OnlyInstructionTag()) }
-
- override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
- tag = OnlyInstructionTag() and
- opcode instanceof Opcode::Unreached and
- resultType = getVoidType()
+ final override Instruction getInitializationSuccessor() {
+ result = this.getEnclosingFunction().getReturnSuccessorInstruction()
}
- override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
+ final override Type getTargetType() { result = this.getEnclosingFunction().getReturnType() }
- override Instruction getChildSuccessor(TranslatedElement child) { none() }
+ final override TranslatedInitialization getInitialization() { none() }
+
+ final override IRVariable getIRVariable() {
+ result = this.getEnclosingFunction().getReturnVariable()
+ }
}
/**
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
index 277791e2baedf..bd7a1f8da2bd5 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
@@ -10,6 +10,65 @@ predicate isInfeasibleInstructionSuccessor(Instruction instr, EdgeKind kind) {
or
instr.getSuccessor(kind) instanceof UnreachedInstruction and
kind instanceof GotoEdge
+ or
+ isCallToNonReturningFunction(instr) and exists(instr.getSuccessor(kind))
+}
+
+/**
+ * Holds if all calls to `f` never return (e.g. they call `exit` or loop forever)
+ */
+private predicate isNonReturningFunction(IRFunction f) {
+ // If the function has an instruction with a missing successor then
+ // the analysis is probably going to be incorrect, so assume they exit.
+ not hasInstructionWithMissingSuccessor(f) and
+ (
+ // If all flows to the exit block are pass through an unreachable then f never returns.
+ any(UnreachedInstruction instr).getBlock().postDominates(f.getEntryBlock())
+ or
+ // If there is no flow to the exit block then f never returns.
+ not exists(IRBlock entry, IRBlock exit |
+ exit = f.getExitFunctionInstruction().getBlock() and
+ entry = f.getEntryBlock() and
+ exit = entry.getASuccessor*()
+ )
+ or
+ // If all flows to the exit block are pass through a call that never returns then f never returns.
+ exists(CallInstruction ci |
+ ci.getBlock().postDominates(f.getEntryBlock()) and
+ isCallToNonReturningFunction(ci)
+ )
+ )
+}
+
+/**
+ * Holds if `f` has an instruction with a missing successor.
+ * This matches `instructionWithoutSuccessor` from `IRConsistency`, but
+ * avoids generating the error strings.
+ */
+predicate hasInstructionWithMissingSuccessor(IRFunction f) {
+ exists(Instruction missingSucc |
+ missingSucc.getEnclosingIRFunction() = f and
+ not exists(missingSucc.getASuccessor()) and
+ not missingSucc instanceof ExitFunctionInstruction and
+ // Phi instructions aren't linked into the instruction-level flow graph.
+ not missingSucc instanceof PhiInstruction and
+ not missingSucc instanceof UnreachedInstruction
+ )
+}
+
+/**
+ * Holds if the call `ci` never returns.
+ */
+private predicate isCallToNonReturningFunction(CallInstruction ci) {
+ exists(IRFunction callee, Language::Function staticTarget |
+ staticTarget = ci.getStaticCallTarget() and
+ staticTarget = callee.getFunction() and
+ // We can't easily tell if the call is virtual or not
+ // if the callee is virtual. So assume that the call is virtual
+ // if the target is.
+ not staticTarget.isVirtual() and
+ isNonReturningFunction(callee)
+ )
}
pragma[noinline]
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
index 3041b662962b3..5014a96c002af 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
@@ -1,2 +1,3 @@
import semmle.code.cpp.ir.implementation.raw.IR as IR
import semmle.code.cpp.ir.implementation.raw.constant.ConstantAnalysis as ConstantAnalysis
+import semmle.code.cpp.ir.internal.IRCppLanguage as Language
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
index 277791e2baedf..bd7a1f8da2bd5 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
@@ -10,6 +10,65 @@ predicate isInfeasibleInstructionSuccessor(Instruction instr, EdgeKind kind) {
or
instr.getSuccessor(kind) instanceof UnreachedInstruction and
kind instanceof GotoEdge
+ or
+ isCallToNonReturningFunction(instr) and exists(instr.getSuccessor(kind))
+}
+
+/**
+ * Holds if all calls to `f` never return (e.g. they call `exit` or loop forever)
+ */
+private predicate isNonReturningFunction(IRFunction f) {
+ // If the function has an instruction with a missing successor then
+ // the analysis is probably going to be incorrect, so assume they exit.
+ not hasInstructionWithMissingSuccessor(f) and
+ (
+ // If all flows to the exit block are pass through an unreachable then f never returns.
+ any(UnreachedInstruction instr).getBlock().postDominates(f.getEntryBlock())
+ or
+ // If there is no flow to the exit block then f never returns.
+ not exists(IRBlock entry, IRBlock exit |
+ exit = f.getExitFunctionInstruction().getBlock() and
+ entry = f.getEntryBlock() and
+ exit = entry.getASuccessor*()
+ )
+ or
+ // If all flows to the exit block are pass through a call that never returns then f never returns.
+ exists(CallInstruction ci |
+ ci.getBlock().postDominates(f.getEntryBlock()) and
+ isCallToNonReturningFunction(ci)
+ )
+ )
+}
+
+/**
+ * Holds if `f` has an instruction with a missing successor.
+ * This matches `instructionWithoutSuccessor` from `IRConsistency`, but
+ * avoids generating the error strings.
+ */
+predicate hasInstructionWithMissingSuccessor(IRFunction f) {
+ exists(Instruction missingSucc |
+ missingSucc.getEnclosingIRFunction() = f and
+ not exists(missingSucc.getASuccessor()) and
+ not missingSucc instanceof ExitFunctionInstruction and
+ // Phi instructions aren't linked into the instruction-level flow graph.
+ not missingSucc instanceof PhiInstruction and
+ not missingSucc instanceof UnreachedInstruction
+ )
+}
+
+/**
+ * Holds if the call `ci` never returns.
+ */
+private predicate isCallToNonReturningFunction(CallInstruction ci) {
+ exists(IRFunction callee, Language::Function staticTarget |
+ staticTarget = ci.getStaticCallTarget() and
+ staticTarget = callee.getFunction() and
+ // We can't easily tell if the call is virtual or not
+ // if the callee is virtual. So assume that the call is virtual
+ // if the target is.
+ not staticTarget.isVirtual() and
+ isNonReturningFunction(callee)
+ )
}
pragma[noinline]
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
index 61dc1a50399a4..29101e77e6fe9 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
@@ -1,2 +1,3 @@
import semmle.code.cpp.ir.implementation.unaliased_ssa.IR as IR
import semmle.code.cpp.ir.implementation.unaliased_ssa.constant.ConstantAnalysis as ConstantAnalysis
+import semmle.code.cpp.ir.internal.IRCppLanguage as Language
diff --git a/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md b/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md
new file mode 100644
index 0000000000000..1839120619b04
--- /dev/null
+++ b/cpp/ql/src/change-notes/2023-09-08-unreachble-edges.md
@@ -0,0 +1,5 @@
+---
+category: minorAnalysis
+---
+* The queries `cpp/double-free` and `cpp/use-after-free` find fewer false positives
+ in cases where a non-returning function is called.
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index 9c261125c2f95..a698e72a23fe8 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -15740,6 +15740,112 @@ ir.cpp:
# 2072| Value = [VariableAccess] 116
# 2072| ValueCategory = prvalue(load)
# 2073| getStmt(2): [ReturnStmt] return ...
+# 2075| [TopLevelFunction] void exit(int)
+# 2075| :
+# 2075| getParameter(0): [Parameter] code
+# 2075| Type = [IntType] int
+# 2077| [TopLevelFunction] int NonExit()
+# 2077| :
+# 2077| getEntryPoint(): [BlockStmt] { ... }
+# 2078| getStmt(0): [DeclStmt] declaration
+# 2078| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2078| Type = [IntType] int
+# 2078| getVariable().getInitializer(): [Initializer] initializer for x
+# 2078| getExpr(): [FunctionCall] call to Add
+# 2078| Type = [IntType] int
+# 2078| ValueCategory = prvalue
+# 2078| getArgument(0): [Literal] 3
+# 2078| Type = [IntType] int
+# 2078| Value = [Literal] 3
+# 2078| ValueCategory = prvalue
+# 2078| getArgument(1): [Literal] 4
+# 2078| Type = [IntType] int
+# 2078| Value = [Literal] 4
+# 2078| ValueCategory = prvalue
+# 2079| getStmt(1): [IfStmt] if (...) ...
+# 2079| getCondition(): [EQExpr] ... == ...
+# 2079| Type = [BoolType] bool
+# 2079| ValueCategory = prvalue
+# 2079| getLeftOperand(): [VariableAccess] x
+# 2079| Type = [IntType] int
+# 2079| ValueCategory = prvalue(load)
+# 2079| getRightOperand(): [Literal] 7
+# 2079| Type = [IntType] int
+# 2079| Value = [Literal] 7
+# 2079| ValueCategory = prvalue
+# 2080| getThen(): [ExprStmt] ExprStmt
+# 2080| getExpr(): [FunctionCall] call to exit
+# 2080| Type = [VoidType] void
+# 2080| ValueCategory = prvalue
+# 2080| getArgument(0): [Literal] 3
+# 2080| Type = [IntType] int
+# 2080| Value = [Literal] 3
+# 2080| ValueCategory = prvalue
+# 2081| getStmt(2): [ExprStmt] ExprStmt
+# 2081| getExpr(): [FunctionCall] call to VoidFunc
+# 2081| Type = [VoidType] void
+# 2081| ValueCategory = prvalue
+# 2082| getStmt(3): [ReturnStmt] return ...
+# 2082| getExpr(): [VariableAccess] x
+# 2082| Type = [IntType] int
+# 2082| ValueCategory = prvalue(load)
+# 2085| [TopLevelFunction] void CallsNonExit()
+# 2085| :
+# 2085| getEntryPoint(): [BlockStmt] { ... }
+# 2086| getStmt(0): [ExprStmt] ExprStmt
+# 2086| getExpr(): [FunctionCall] call to VoidFunc
+# 2086| Type = [VoidType] void
+# 2086| ValueCategory = prvalue
+# 2087| getStmt(1): [ExprStmt] ExprStmt
+# 2087| getExpr(): [FunctionCall] call to exit
+# 2087| Type = [VoidType] void
+# 2087| ValueCategory = prvalue
+# 2087| getArgument(0): [Literal] 3
+# 2087| Type = [IntType] int
+# 2087| Value = [Literal] 3
+# 2087| ValueCategory = prvalue
+# 2088| getStmt(2): [ReturnStmt] return ...
+# 2090| [TopLevelFunction] int TransNonExit()
+# 2090| :
+# 2090| getEntryPoint(): [BlockStmt] { ... }
+# 2091| getStmt(0): [DeclStmt] declaration
+# 2091| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2091| Type = [IntType] int
+# 2091| getVariable().getInitializer(): [Initializer] initializer for x
+# 2091| getExpr(): [FunctionCall] call to Add
+# 2091| Type = [IntType] int
+# 2091| ValueCategory = prvalue
+# 2091| getArgument(0): [Literal] 3
+# 2091| Type = [IntType] int
+# 2091| Value = [Literal] 3
+# 2091| ValueCategory = prvalue
+# 2091| getArgument(1): [Literal] 4
+# 2091| Type = [IntType] int
+# 2091| Value = [Literal] 4
+# 2091| ValueCategory = prvalue
+# 2092| getStmt(1): [IfStmt] if (...) ...
+# 2092| getCondition(): [EQExpr] ... == ...
+# 2092| Type = [BoolType] bool
+# 2092| ValueCategory = prvalue
+# 2092| getLeftOperand(): [VariableAccess] x
+# 2092| Type = [IntType] int
+# 2092| ValueCategory = prvalue(load)
+# 2092| getRightOperand(): [Literal] 7
+# 2092| Type = [IntType] int
+# 2092| Value = [Literal] 7
+# 2092| ValueCategory = prvalue
+# 2093| getThen(): [ExprStmt] ExprStmt
+# 2093| getExpr(): [FunctionCall] call to CallsNonExit
+# 2093| Type = [VoidType] void
+# 2093| ValueCategory = prvalue
+# 2094| getStmt(2): [ExprStmt] ExprStmt
+# 2094| getExpr(): [FunctionCall] call to VoidFunc
+# 2094| Type = [VoidType] void
+# 2094| ValueCategory = prvalue
+# 2095| getStmt(3): [ReturnStmt] return ...
+# 2095| getExpr(): [VariableAccess] x
+# 2095| Type = [IntType] int
+# 2095| ValueCategory = prvalue(load)
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| :
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
new file mode 100644
index 0000000000000..43525ccf1db8d
--- /dev/null
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
@@ -0,0 +1,12956 @@
+bad_asts.cpp:
+# 9| int Bad::S::MemberFunction(int)
+# 9| Block 0
+# 9| v9_1(void) = EnterFunction :
+# 9| m9_2(unknown) = AliasedDefinition :
+# 9| m9_3(unknown) = InitializeNonLocal :
+# 9| m9_4(unknown) = Chi : total:m9_2, partial:m9_3
+# 9| r9_5(glval) = VariableAddress[#this] :
+# 9| m9_6(glval) = InitializeParameter[#this] : &:r9_5
+# 9| r9_7(glval) = Load[#this] : &:r9_5, m9_6
+# 9| m9_8(S) = InitializeIndirection[#this] : &:r9_7
+# 9| r9_9(glval) = VariableAddress[y] :
+# 9| m9_10(int) = InitializeParameter[y] : &:r9_9
+# 10| r10_1(glval) = VariableAddress[#return] :
+# 10| r10_2(int) = Constant[6] :
+# 10| r10_3(glval) = VariableAddress[#this] :
+# 10| r10_4(S *) = Load[#this] : &:r10_3, m9_6
+# 10| r10_5(glval) = FieldAddress[x] : r10_4
+# 10| r10_6(int) = Load[?] : &:r10_5, ~m9_8
+# 10| r10_7(int) = Add : r10_2, r10_6
+# 10| r10_8(glval) = VariableAddress[y] :
+# 10| r10_9(int) = Load[y] : &:r10_8, m9_10
+# 10| r10_10(int) = Add : r10_7, r10_9
+# 10| m10_11(int) = Store[#return] : &:r10_1, r10_10
+# 9| v9_11(void) = ReturnIndirection[#this] : &:r9_7, m9_8
+# 9| r9_12(glval) = VariableAddress[#return] :
+# 9| v9_13(void) = ReturnValue : &:r9_12, m10_11
+# 9| v9_14(void) = AliasedUse : m9_3
+# 9| v9_15(void) = ExitFunction :
+
+# 14| void Bad::CallBadMemberFunction()
+# 14| Block 0
+# 14| v14_1(void) = EnterFunction :
+# 14| m14_2(unknown) = AliasedDefinition :
+# 14| m14_3(unknown) = InitializeNonLocal :
+# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3
+# 15| r15_1(glval) = VariableAddress[s] :
+# 15| m15_2(S) = Uninitialized[s] : &:r15_1
+# 15| r15_3(glval) = FieldAddress[x] : r15_1
+# 15| r15_4(int) = Constant[0] :
+# 15| m15_5(int) = Store[?] : &:r15_3, r15_4
+# 16| r16_1(glval) = VariableAddress[s] :
+# 16| r16_2(glval) = FunctionAddress[MemberFunction] :
+# 16| r16_3(int) = Constant[1] :
+# 16| r16_4(int) = Call[MemberFunction] : func:r16_2, this:r16_1, 0:r16_3
+# 16| m16_5(unknown) = ^CallSideEffect : ~m14_4
+# 16| m16_6(unknown) = Chi : total:m14_4, partial:m16_5
+# 16| v16_7(void) = ^IndirectReadSideEffect[-1] : &:r16_1, ~m15_5
+# 16| m16_8(S) = ^IndirectMayWriteSideEffect[-1] : &:r16_1
+# 16| m16_9(S) = Chi : total:m15_5, partial:m16_8
+# 17| v17_1(void) = NoOp :
+# 14| v14_5(void) = ReturnVoid :
+# 14| v14_6(void) = AliasedUse : ~m16_6
+# 14| v14_7(void) = ExitFunction :
+
+# 19| void Bad::Point::Point(Bad::Point const&)
+# 19| Block 0
+# 19| v19_1(void) = EnterFunction :
+# 19| m19_2(unknown) = AliasedDefinition :
+# 19| m19_3(unknown) = InitializeNonLocal :
+# 19| m19_4(unknown) = Chi : total:m19_2, partial:m19_3
+# 19| r19_5(glval) = VariableAddress[#this] :
+# 19| m19_6(glval) = InitializeParameter[#this] : &:r19_5
+# 19| r19_7(glval) = Load[#this] : &:r19_5, m19_6
+# 19| m19_8(Point) = InitializeIndirection[#this] : &:r19_7
+#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] :
+#-----| m0_2(Point &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1
+#-----| r0_3(Point &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2
+#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3
+# 19| r19_9(glval) = FieldAddress[x] : m19_6
+# 19| r19_10(glval) = VariableAddress[(unnamed parameter 0)] :
+# 19| r19_11(Point &) = Load[(unnamed parameter 0)] : &:r19_10, m0_2
+# 19| r19_12(glval) = CopyValue : r19_11
+# 19| r19_13(glval) = FieldAddress[x] : r19_12
+# 19| r19_14(int) = Load[?] : &:r19_13, ~m0_4
+# 19| m19_15(int) = Store[?] : &:r19_9, r19_14
+# 19| m19_16(unknown) = Chi : total:m19_8, partial:m19_15
+# 19| r19_17(glval) = FieldAddress[y] : m19_6
+# 19| r19_18(glval) = VariableAddress[(unnamed parameter 0)] :
+# 19| r19_19(Point &) = Load[(unnamed parameter 0)] : &:r19_18, m0_2
+# 19| r19_20(glval) = CopyValue : r19_19
+# 19| r19_21(glval) = FieldAddress[y] : r19_20
+# 19| r19_22(int) = Load[?] : &:r19_21, ~m0_4
+# 19| m19_23(int) = Store[?] : &:r19_17, r19_22
+# 19| m19_24(unknown) = Chi : total:m19_16, partial:m19_23
+# 19| v19_25(void) = NoOp :
+# 19| v19_26(void) = ReturnIndirection[#this] : &:r19_7, m19_24
+#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4
+# 19| v19_27(void) = ReturnVoid :
+# 19| v19_28(void) = AliasedUse : m19_3
+# 19| v19_29(void) = ExitFunction :
+
+# 22| void Bad::Point::Point()
+# 22| Block 0
+# 22| v22_1(void) = EnterFunction :
+# 22| m22_2(unknown) = AliasedDefinition :
+# 22| m22_3(unknown) = InitializeNonLocal :
+# 22| m22_4(unknown) = Chi : total:m22_2, partial:m22_3
+# 22| r22_5(glval) = VariableAddress[#this] :
+# 22| m22_6(glval) = InitializeParameter[#this] : &:r22_5
+# 22| r22_7(glval) = Load[#this] : &:r22_5, m22_6
+# 22| m22_8(Point) = InitializeIndirection[#this] : &:r22_7
+# 23| v23_1(void) = NoOp :
+# 22| v22_9(void) = ReturnIndirection[#this] : &:r22_7, m22_8
+# 22| v22_10(void) = ReturnVoid :
+# 22| v22_11(void) = AliasedUse : m22_3
+# 22| v22_12(void) = ExitFunction :
+
+# 26| void Bad::CallCopyConstructor(Bad::Point const&)
+# 26| Block 0
+# 26| v26_1(void) = EnterFunction :
+# 26| m26_2(unknown) = AliasedDefinition :
+# 26| m26_3(unknown) = InitializeNonLocal :
+# 26| m26_4(unknown) = Chi : total:m26_2, partial:m26_3
+# 26| r26_5(glval) = VariableAddress[a] :
+# 26| m26_6(Point &) = InitializeParameter[a] : &:r26_5
+# 26| r26_7(Point &) = Load[a] : &:r26_5, m26_6
+# 26| m26_8(unknown) = InitializeIndirection[a] : &:r26_7
+# 27| r27_1(glval) = VariableAddress[b] :
+# 27| r27_2(glval) = VariableAddress[a] :
+# 27| r27_3(Point &) = Load[a] : &:r27_2, m26_6
+# 27| r27_4(glval) = CopyValue : r27_3
+# 27| r27_5(glval) = Convert : r27_4
+# 27| r27_6(Point) = Load[?] : &:r27_5, ~m26_8
+# 27| m27_7(Point) = Store[b] : &:r27_1, r27_6
+# 28| v28_1(void) = NoOp :
+# 26| v26_9(void) = ReturnIndirection[a] : &:r26_7, m26_8
+# 26| v26_10(void) = ReturnVoid :
+# 26| v26_11(void) = AliasedUse : m26_3
+# 26| v26_12(void) = ExitFunction :
+
+bad_stmts.cpp:
+# 5| void Bad::errorExpr()
+# 5| Block 0
+# 5| v5_1(void) = EnterFunction :
+# 5| m5_2(unknown) = AliasedDefinition :
+# 5| m5_3(unknown) = InitializeNonLocal :
+# 5| m5_4(unknown) = Chi : total:m5_2, partial:m5_3
+# 6| r6_1(glval) = VariableAddress[intref] :
+# 6| r6_2(error) = Error :
+# 6| m6_3(int &) = Store[intref] : &:r6_1, r6_2
+# 7| r7_1(glval) = VariableAddress[x] :
+# 7| r7_2(error) = Error :
+# 7| m7_3(int) = Store[x] : &:r7_1, r7_2
+# 8| r8_1(glval) = Error :
+# 8| r8_2(error) = Load[?] : &:r8_1, ~m5_4
+# 8| r8_3(glval) = VariableAddress[x] :
+# 8| m8_4(int) = Store[x] : &:r8_3, r8_2
+# 9| v9_1(void) = NoOp :
+# 5| v5_5(void) = ReturnVoid :
+# 5| v5_6(void) = AliasedUse : m5_3
+# 5| v5_7(void) = ExitFunction :
+
+clang.cpp:
+# 5| int* globalIntAddress()
+# 5| Block 0
+# 5| v5_1(void) = EnterFunction :
+# 5| m5_2(unknown) = AliasedDefinition :
+# 5| m5_3(unknown) = InitializeNonLocal :
+# 5| m5_4(unknown) = Chi : total:m5_2, partial:m5_3
+# 6| r6_1(glval) = VariableAddress[#return] :
+# 6| r6_2(glval) = VariableAddress[globalInt] :
+# 6| r6_3(int *) = CopyValue : r6_2
+# 6| m6_4(int *) = Store[#return] : &:r6_1, r6_3
+# 5| r5_5(glval) = VariableAddress[#return] :
+# 5| v5_6(void) = ReturnValue : &:r5_5, m6_4
+# 5| v5_7(void) = AliasedUse : m5_3
+# 5| v5_8(void) = ExitFunction :
+
+complex.c:
+# 1| void complex_literals()
+# 1| Block 0
+# 1| v1_1(void) = EnterFunction :
+# 1| m1_2(unknown) = AliasedDefinition :
+# 1| m1_3(unknown) = InitializeNonLocal :
+# 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3
+# 2| r2_1(glval<_Complex float>) = VariableAddress[cf] :
+# 2| r2_2(double) = Constant[2.0] :
+# 2| r2_3(_Complex float) = Convert : r2_2
+# 2| m2_4(_Complex float) = Store[cf] : &:r2_1, r2_3
+# 3| r3_1(_Imaginary float) = Constant[1.0i] :
+# 3| r3_2(_Complex float) = Convert : r3_1
+# 3| r3_3(glval<_Complex float>) = VariableAddress[cf] :
+# 3| m3_4(_Complex float) = Store[cf] : &:r3_3, r3_2
+# 4| r4_1(glval<_Complex double>) = VariableAddress[cd] :
+# 4| r4_2(double) = Constant[3.0] :
+# 4| r4_3(_Complex double) = Convert : r4_2
+# 4| m4_4(_Complex double) = Store[cd] : &:r4_1, r4_3
+# 5| r5_1(_Imaginary float) = Constant[1.0i] :
+# 5| r5_2(_Complex double) = Convert : r5_1
+# 5| r5_3(glval<_Complex double>) = VariableAddress[cd] :
+# 5| m5_4(_Complex double) = Store[cd] : &:r5_3, r5_2
+# 6| r6_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 6| r6_2(double) = Constant[5.0] :
+# 6| r6_3(_Complex long double) = Convert : r6_2
+# 6| m6_4(_Complex long double) = Store[cld] : &:r6_1, r6_3
+# 7| r7_1(_Imaginary float) = Constant[1.0i] :
+# 7| r7_2(_Complex long double) = Convert : r7_1
+# 7| r7_3(glval<_Complex long double>) = VariableAddress[cld] :
+# 7| m7_4(_Complex long double) = Store[cld] : &:r7_3, r7_2
+# 9| r9_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 9| r9_2(_Imaginary float) = Constant[1.0i] :
+# 9| m9_3(_Imaginary float) = Store[jf] : &:r9_1, r9_2
+# 10| r10_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 10| r10_2(_Imaginary float) = Constant[1.0i] :
+# 10| r10_3(_Imaginary double) = Convert : r10_2
+# 10| m10_4(_Imaginary double) = Store[jd] : &:r10_1, r10_3
+# 11| r11_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 11| r11_2(_Imaginary float) = Constant[1.0i] :
+# 11| r11_3(_Imaginary long double) = Convert : r11_2
+# 11| m11_4(_Imaginary long double) = Store[jld] : &:r11_1, r11_3
+# 12| v12_1(void) = NoOp :
+# 1| v1_5(void) = ReturnVoid :
+# 1| v1_6(void) = AliasedUse : m1_3
+# 1| v1_7(void) = ExitFunction :
+
+# 14| void complex_arithmetic()
+# 14| Block 0
+# 14| v14_1(void) = EnterFunction :
+# 14| m14_2(unknown) = AliasedDefinition :
+# 14| m14_3(unknown) = InitializeNonLocal :
+# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3
+# 15| r15_1(glval) = VariableAddress[f1] :
+# 15| r15_2(float) = Constant[5.0] :
+# 15| m15_3(float) = Store[f1] : &:r15_1, r15_2
+# 16| r16_1(glval) = VariableAddress[f2] :
+# 16| r16_2(float) = Constant[7.0] :
+# 16| m16_3(float) = Store[f2] : &:r16_1, r16_2
+# 17| r17_1(glval) = VariableAddress[f3] :
+# 17| m17_2(float) = Uninitialized[f3] : &:r17_1
+# 18| r18_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 18| r18_2(double) = Constant[2.0] :
+# 18| r18_3(_Complex float) = Convert : r18_2
+# 18| m18_4(_Complex float) = Store[cf1] : &:r18_1, r18_3
+# 19| r19_1(glval<_Complex float>) = VariableAddress[cf2] :
+# 19| r19_2(_Imaginary float) = Constant[1.0i] :
+# 19| r19_3(_Complex float) = Convert : r19_2
+# 19| m19_4(_Complex float) = Store[cf2] : &:r19_1, r19_3
+# 20| r20_1(glval<_Complex float>) = VariableAddress[cf3] :
+# 20| m20_2(_Complex float) = Uninitialized[cf3] : &:r20_1
+# 21| r21_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 21| r21_2(_Imaginary float) = Constant[1.0i] :
+# 21| m21_3(_Imaginary float) = Store[jf1] : &:r21_1, r21_2
+# 22| r22_1(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 22| r22_2(_Imaginary float) = Constant[1.0i] :
+# 22| m22_3(_Imaginary float) = Store[jf2] : &:r22_1, r22_2
+# 23| r23_1(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 23| m23_2(_Imaginary float) = Uninitialized[jf3] : &:r23_1
+# 26| r26_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 26| r26_2(_Complex float) = Load[cf1] : &:r26_1, m18_4
+# 26| r26_3(_Complex float) = CopyValue : r26_2
+# 26| r26_4(glval<_Complex float>) = VariableAddress[cf3] :
+# 26| m26_5(_Complex float) = Store[cf3] : &:r26_4, r26_3
+# 27| r27_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 27| r27_2(_Complex float) = Load[cf1] : &:r27_1, m18_4
+# 27| r27_3(_Complex float) = Negate : r27_2
+# 27| r27_4(glval<_Complex float>) = VariableAddress[cf3] :
+# 27| m27_5(_Complex float) = Store[cf3] : &:r27_4, r27_3
+# 30| r30_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 30| r30_2(_Complex float) = Load[cf1] : &:r30_1, m18_4
+# 30| r30_3(glval<_Complex float>) = VariableAddress[cf2] :
+# 30| r30_4(_Complex float) = Load[cf2] : &:r30_3, m19_4
+# 30| r30_5(_Complex float) = Add : r30_2, r30_4
+# 30| r30_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 30| m30_7(_Complex float) = Store[cf3] : &:r30_6, r30_5
+# 31| r31_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 31| r31_2(_Complex float) = Load[cf1] : &:r31_1, m18_4
+# 31| r31_3(glval<_Complex float>) = VariableAddress[cf2] :
+# 31| r31_4(_Complex float) = Load[cf2] : &:r31_3, m19_4
+# 31| r31_5(_Complex float) = Sub : r31_2, r31_4
+# 31| r31_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 31| m31_7(_Complex float) = Store[cf3] : &:r31_6, r31_5
+# 32| r32_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 32| r32_2(_Complex float) = Load[cf1] : &:r32_1, m18_4
+# 32| r32_3(glval<_Complex float>) = VariableAddress[cf2] :
+# 32| r32_4(_Complex float) = Load[cf2] : &:r32_3, m19_4
+# 32| r32_5(_Complex float) = Mul : r32_2, r32_4
+# 32| r32_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 32| m32_7(_Complex float) = Store[cf3] : &:r32_6, r32_5
+# 33| r33_1(glval<_Complex float>) = VariableAddress[cf1] :
+# 33| r33_2(_Complex float) = Load[cf1] : &:r33_1, m18_4
+# 33| r33_3(glval<_Complex float>) = VariableAddress[cf2] :
+# 33| r33_4(_Complex float) = Load[cf2] : &:r33_3, m19_4
+# 33| r33_5(_Complex float) = Div : r33_2, r33_4
+# 33| r33_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 33| m33_7(_Complex float) = Store[cf3] : &:r33_6, r33_5
+# 36| r36_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 36| r36_2(_Imaginary float) = Load[jf1] : &:r36_1, m21_3
+# 36| r36_3(_Imaginary float) = CopyValue : r36_2
+# 36| r36_4(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 36| m36_5(_Imaginary float) = Store[jf3] : &:r36_4, r36_3
+# 37| r37_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 37| r37_2(_Imaginary float) = Load[jf1] : &:r37_1, m21_3
+# 37| r37_3(_Imaginary float) = Negate : r37_2
+# 37| r37_4(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 37| m37_5(_Imaginary float) = Store[jf3] : &:r37_4, r37_3
+# 40| r40_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 40| r40_2(_Imaginary float) = Load[jf1] : &:r40_1, m21_3
+# 40| r40_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 40| r40_4(_Imaginary float) = Load[jf2] : &:r40_3, m22_3
+# 40| r40_5(_Imaginary float) = Add : r40_2, r40_4
+# 40| r40_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 40| m40_7(_Imaginary float) = Store[jf3] : &:r40_6, r40_5
+# 41| r41_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 41| r41_2(_Imaginary float) = Load[jf1] : &:r41_1, m21_3
+# 41| r41_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 41| r41_4(_Imaginary float) = Load[jf2] : &:r41_3, m22_3
+# 41| r41_5(_Imaginary float) = Sub : r41_2, r41_4
+# 41| r41_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 41| m41_7(_Imaginary float) = Store[jf3] : &:r41_6, r41_5
+# 42| r42_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 42| r42_2(_Imaginary float) = Load[jf1] : &:r42_1, m21_3
+# 42| r42_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 42| r42_4(_Imaginary float) = Load[jf2] : &:r42_3, m22_3
+# 42| r42_5(float) = Mul : r42_2, r42_4
+# 42| r42_6(glval) = VariableAddress[f3] :
+# 42| m42_7(float) = Store[f3] : &:r42_6, r42_5
+# 43| r43_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 43| r43_2(_Imaginary float) = Load[jf1] : &:r43_1, m21_3
+# 43| r43_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 43| r43_4(_Imaginary float) = Load[jf2] : &:r43_3, m22_3
+# 43| r43_5(float) = Div : r43_2, r43_4
+# 43| r43_6(glval) = VariableAddress[f3] :
+# 43| m43_7(float) = Store[f3] : &:r43_6, r43_5
+# 46| r46_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 46| r46_2(_Imaginary float) = Load[jf1] : &:r46_1, m21_3
+# 46| r46_3(glval) = VariableAddress[f2] :
+# 46| r46_4(float) = Load[f2] : &:r46_3, m16_3
+# 46| r46_5(_Complex float) = Add : r46_2, r46_4
+# 46| r46_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 46| m46_7(_Complex float) = Store[cf3] : &:r46_6, r46_5
+# 47| r47_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 47| r47_2(_Imaginary float) = Load[jf1] : &:r47_1, m21_3
+# 47| r47_3(glval) = VariableAddress[f2] :
+# 47| r47_4(float) = Load[f2] : &:r47_3, m16_3
+# 47| r47_5(_Complex float) = Sub : r47_2, r47_4
+# 47| r47_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 47| m47_7(_Complex float) = Store[cf3] : &:r47_6, r47_5
+# 48| r48_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 48| r48_2(_Imaginary float) = Load[jf1] : &:r48_1, m21_3
+# 48| r48_3(glval) = VariableAddress[f2] :
+# 48| r48_4(float) = Load[f2] : &:r48_3, m16_3
+# 48| r48_5(_Imaginary float) = Mul : r48_2, r48_4
+# 48| r48_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 48| m48_7(_Imaginary float) = Store[jf3] : &:r48_6, r48_5
+# 49| r49_1(glval<_Imaginary float>) = VariableAddress[jf1] :
+# 49| r49_2(_Imaginary float) = Load[jf1] : &:r49_1, m21_3
+# 49| r49_3(glval) = VariableAddress[f2] :
+# 49| r49_4(float) = Load[f2] : &:r49_3, m16_3
+# 49| r49_5(_Imaginary float) = Div : r49_2, r49_4
+# 49| r49_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 49| m49_7(_Imaginary float) = Store[jf3] : &:r49_6, r49_5
+# 52| r52_1(glval) = VariableAddress[f1] :
+# 52| r52_2(float) = Load[f1] : &:r52_1, m15_3
+# 52| r52_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 52| r52_4(_Imaginary float) = Load[jf2] : &:r52_3, m22_3
+# 52| r52_5(_Complex float) = Add : r52_2, r52_4
+# 52| r52_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 52| m52_7(_Complex float) = Store[cf3] : &:r52_6, r52_5
+# 53| r53_1(glval) = VariableAddress[f1] :
+# 53| r53_2(float) = Load[f1] : &:r53_1, m15_3
+# 53| r53_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 53| r53_4(_Imaginary float) = Load[jf2] : &:r53_3, m22_3
+# 53| r53_5(_Complex float) = Sub : r53_2, r53_4
+# 53| r53_6(glval<_Complex float>) = VariableAddress[cf3] :
+# 53| m53_7(_Complex float) = Store[cf3] : &:r53_6, r53_5
+# 54| r54_1(glval) = VariableAddress[f1] :
+# 54| r54_2(float) = Load[f1] : &:r54_1, m15_3
+# 54| r54_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 54| r54_4(_Imaginary float) = Load[jf2] : &:r54_3, m22_3
+# 54| r54_5(_Imaginary float) = Mul : r54_2, r54_4
+# 54| r54_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 54| m54_7(_Imaginary float) = Store[jf3] : &:r54_6, r54_5
+# 55| r55_1(glval) = VariableAddress[f1] :
+# 55| r55_2(float) = Load[f1] : &:r55_1, m15_3
+# 55| r55_3(glval<_Imaginary float>) = VariableAddress[jf2] :
+# 55| r55_4(_Imaginary float) = Load[jf2] : &:r55_3, m22_3
+# 55| r55_5(_Imaginary float) = Div : r55_2, r55_4
+# 55| r55_6(glval<_Imaginary float>) = VariableAddress[jf3] :
+# 55| m55_7(_Imaginary float) = Store[jf3] : &:r55_6, r55_5
+# 56| v56_1(void) = NoOp :
+# 14| v14_5(void) = ReturnVoid :
+# 14| v14_6(void) = AliasedUse : m14_3
+# 14| v14_7(void) = ExitFunction :
+
+# 58| void complex_conversions()
+# 58| Block 0
+# 58| v58_1(void) = EnterFunction :
+# 58| m58_2(unknown) = AliasedDefinition :
+# 58| m58_3(unknown) = InitializeNonLocal :
+# 58| m58_4(unknown) = Chi : total:m58_2, partial:m58_3
+# 59| r59_1(glval) = VariableAddress[f] :
+# 59| r59_2(float) = Constant[2.0] :
+# 59| m59_3(float) = Store[f] : &:r59_1, r59_2
+# 60| r60_1(glval) = VariableAddress[d] :
+# 60| r60_2(double) = Constant[3.0] :
+# 60| m60_3(double) = Store[d] : &:r60_1, r60_2
+# 61| r61_1(glval) = VariableAddress[ld] :
+# 61| r61_2(long double) = Constant[5.0] :
+# 61| m61_3(long double) = Store[ld] : &:r61_1, r61_2
+# 62| r62_1(glval<_Complex float>) = VariableAddress[cf] :
+# 62| r62_2(double) = Constant[7.0] :
+# 62| r62_3(_Complex float) = Convert : r62_2
+# 62| m62_4(_Complex float) = Store[cf] : &:r62_1, r62_3
+# 63| r63_1(glval<_Complex double>) = VariableAddress[cd] :
+# 63| r63_2(double) = Constant[11.0] :
+# 63| r63_3(_Complex double) = Convert : r63_2
+# 63| m63_4(_Complex double) = Store[cd] : &:r63_1, r63_3
+# 64| r64_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 64| r64_2(double) = Constant[13.0] :
+# 64| r64_3(_Complex long double) = Convert : r64_2
+# 64| m64_4(_Complex long double) = Store[cld] : &:r64_1, r64_3
+# 65| r65_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 65| r65_2(_Imaginary float) = Constant[1.0i] :
+# 65| m65_3(_Imaginary float) = Store[jf] : &:r65_1, r65_2
+# 66| r66_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 66| r66_2(_Imaginary float) = Constant[1.0i] :
+# 66| r66_3(_Imaginary double) = Convert : r66_2
+# 66| m66_4(_Imaginary double) = Store[jd] : &:r66_1, r66_3
+# 67| r67_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 67| r67_2(_Imaginary float) = Constant[1.0i] :
+# 67| r67_3(_Imaginary long double) = Convert : r67_2
+# 67| m67_4(_Imaginary long double) = Store[jld] : &:r67_1, r67_3
+# 70| r70_1(glval<_Complex float>) = VariableAddress[cf] :
+# 70| r70_2(_Complex float) = Load[cf] : &:r70_1, m62_4
+# 70| r70_3(glval<_Complex float>) = VariableAddress[cf] :
+# 70| m70_4(_Complex float) = Store[cf] : &:r70_3, r70_2
+# 71| r71_1(glval<_Complex double>) = VariableAddress[cd] :
+# 71| r71_2(_Complex double) = Load[cd] : &:r71_1, m63_4
+# 71| r71_3(_Complex float) = Convert : r71_2
+# 71| r71_4(glval<_Complex float>) = VariableAddress[cf] :
+# 71| m71_5(_Complex float) = Store[cf] : &:r71_4, r71_3
+# 72| r72_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 72| r72_2(_Complex long double) = Load[cld] : &:r72_1, m64_4
+# 72| r72_3(_Complex float) = Convert : r72_2
+# 72| r72_4(glval<_Complex float>) = VariableAddress[cf] :
+# 72| m72_5(_Complex float) = Store[cf] : &:r72_4, r72_3
+# 73| r73_1(glval<_Complex float>) = VariableAddress[cf] :
+# 73| r73_2(_Complex float) = Load[cf] : &:r73_1, m72_5
+# 73| r73_3(_Complex double) = Convert : r73_2
+# 73| r73_4(glval<_Complex double>) = VariableAddress[cd] :
+# 73| m73_5(_Complex double) = Store[cd] : &:r73_4, r73_3
+# 74| r74_1(glval<_Complex double>) = VariableAddress[cd] :
+# 74| r74_2(_Complex double) = Load[cd] : &:r74_1, m73_5
+# 74| r74_3(glval<_Complex double>) = VariableAddress[cd] :
+# 74| m74_4(_Complex double) = Store[cd] : &:r74_3, r74_2
+# 75| r75_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 75| r75_2(_Complex long double) = Load[cld] : &:r75_1, m64_4
+# 75| r75_3(_Complex double) = Convert : r75_2
+# 75| r75_4(glval<_Complex double>) = VariableAddress[cd] :
+# 75| m75_5(_Complex double) = Store[cd] : &:r75_4, r75_3
+# 76| r76_1(glval<_Complex float>) = VariableAddress[cf] :
+# 76| r76_2(_Complex float) = Load[cf] : &:r76_1, m72_5
+# 76| r76_3(_Complex long double) = Convert : r76_2
+# 76| r76_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 76| m76_5(_Complex long double) = Store[cld] : &:r76_4, r76_3
+# 77| r77_1(glval<_Complex double>) = VariableAddress[cd] :
+# 77| r77_2(_Complex double) = Load[cd] : &:r77_1, m75_5
+# 77| r77_3(_Complex long double) = Convert : r77_2
+# 77| r77_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 77| m77_5(_Complex long double) = Store[cld] : &:r77_4, r77_3
+# 78| r78_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 78| r78_2(_Complex long double) = Load[cld] : &:r78_1, m77_5
+# 78| r78_3(glval<_Complex long double>) = VariableAddress[cld] :
+# 78| m78_4(_Complex long double) = Store[cld] : &:r78_3, r78_2
+# 81| r81_1(glval) = VariableAddress[f] :
+# 81| r81_2(float) = Load[f] : &:r81_1, m59_3
+# 81| r81_3(_Complex float) = Convert : r81_2
+# 81| r81_4(glval<_Complex float>) = VariableAddress[cf] :
+# 81| m81_5(_Complex float) = Store[cf] : &:r81_4, r81_3
+# 82| r82_1(glval) = VariableAddress[d] :
+# 82| r82_2(double) = Load[d] : &:r82_1, m60_3
+# 82| r82_3(_Complex float) = Convert : r82_2
+# 82| r82_4(glval<_Complex float>) = VariableAddress[cf] :
+# 82| m82_5(_Complex float) = Store[cf] : &:r82_4, r82_3
+# 83| r83_1(glval) = VariableAddress[ld] :
+# 83| r83_2(long double) = Load[ld] : &:r83_1, m61_3
+# 83| r83_3(_Complex float) = Convert : r83_2
+# 83| r83_4(glval<_Complex float>) = VariableAddress[cf] :
+# 83| m83_5(_Complex float) = Store[cf] : &:r83_4, r83_3
+# 84| r84_1(glval) = VariableAddress[f] :
+# 84| r84_2(float) = Load[f] : &:r84_1, m59_3
+# 84| r84_3(_Complex double) = Convert : r84_2
+# 84| r84_4(glval<_Complex double>) = VariableAddress[cd] :
+# 84| m84_5(_Complex double) = Store[cd] : &:r84_4, r84_3
+# 85| r85_1(glval) = VariableAddress[d] :
+# 85| r85_2(double) = Load[d] : &:r85_1, m60_3
+# 85| r85_3(_Complex double) = Convert : r85_2
+# 85| r85_4(glval<_Complex double>) = VariableAddress[cd] :
+# 85| m85_5(_Complex double) = Store[cd] : &:r85_4, r85_3
+# 86| r86_1(glval) = VariableAddress[ld] :
+# 86| r86_2(long double) = Load[ld] : &:r86_1, m61_3
+# 86| r86_3(_Complex double) = Convert : r86_2
+# 86| r86_4(glval<_Complex double>) = VariableAddress[cd] :
+# 86| m86_5(_Complex double) = Store[cd] : &:r86_4, r86_3
+# 87| r87_1(glval) = VariableAddress[f] :
+# 87| r87_2(float) = Load[f] : &:r87_1, m59_3
+# 87| r87_3(_Complex long double) = Convert : r87_2
+# 87| r87_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 87| m87_5(_Complex long double) = Store[cld] : &:r87_4, r87_3
+# 88| r88_1(glval) = VariableAddress[d] :
+# 88| r88_2(double) = Load[d] : &:r88_1, m60_3
+# 88| r88_3(_Complex long double) = Convert : r88_2
+# 88| r88_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 88| m88_5(_Complex long double) = Store[cld] : &:r88_4, r88_3
+# 89| r89_1(glval) = VariableAddress[ld] :
+# 89| r89_2(long double) = Load[ld] : &:r89_1, m61_3
+# 89| r89_3(_Complex long double) = Convert : r89_2
+# 89| r89_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 89| m89_5(_Complex long double) = Store[cld] : &:r89_4, r89_3
+# 92| r92_1(glval<_Complex float>) = VariableAddress[cf] :
+# 92| r92_2(_Complex float) = Load[cf] : &:r92_1, m83_5
+# 92| r92_3(float) = Convert : r92_2
+# 92| r92_4(glval) = VariableAddress[f] :
+# 92| m92_5(float) = Store[f] : &:r92_4, r92_3
+# 93| r93_1(glval<_Complex double>) = VariableAddress[cd] :
+# 93| r93_2(_Complex double) = Load[cd] : &:r93_1, m86_5
+# 93| r93_3(float) = Convert : r93_2
+# 93| r93_4(glval) = VariableAddress[f] :
+# 93| m93_5(float) = Store[f] : &:r93_4, r93_3
+# 94| r94_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 94| r94_2(_Complex long double) = Load[cld] : &:r94_1, m89_5
+# 94| r94_3(float) = Convert : r94_2
+# 94| r94_4(glval) = VariableAddress[f] :
+# 94| m94_5(float) = Store[f] : &:r94_4, r94_3
+# 95| r95_1(glval<_Complex float>) = VariableAddress[cf] :
+# 95| r95_2(_Complex float) = Load[cf] : &:r95_1, m83_5
+# 95| r95_3(double) = Convert : r95_2
+# 95| r95_4(glval) = VariableAddress[d] :
+# 95| m95_5(double) = Store[d] : &:r95_4, r95_3
+# 96| r96_1(glval<_Complex double>) = VariableAddress[cd] :
+# 96| r96_2(_Complex double) = Load[cd] : &:r96_1, m86_5
+# 96| r96_3(double) = Convert : r96_2
+# 96| r96_4(glval) = VariableAddress[d] :
+# 96| m96_5(double) = Store[d] : &:r96_4, r96_3
+# 97| r97_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 97| r97_2(_Complex long double) = Load[cld] : &:r97_1, m89_5
+# 97| r97_3(double) = Convert : r97_2
+# 97| r97_4(glval) = VariableAddress[d] :
+# 97| m97_5(double) = Store[d] : &:r97_4, r97_3
+# 98| r98_1(glval<_Complex float>) = VariableAddress[cf] :
+# 98| r98_2(_Complex float) = Load[cf] : &:r98_1, m83_5
+# 98| r98_3(long double) = Convert : r98_2
+# 98| r98_4(glval) = VariableAddress[ld] :
+# 98| m98_5(long double) = Store[ld] : &:r98_4, r98_3
+# 99| r99_1(glval<_Complex double>) = VariableAddress[cd] :
+# 99| r99_2(_Complex double) = Load[cd] : &:r99_1, m86_5
+# 99| r99_3(long double) = Convert : r99_2
+# 99| r99_4(glval) = VariableAddress[ld] :
+# 99| m99_5(long double) = Store[ld] : &:r99_4, r99_3
+# 100| r100_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 100| r100_2(_Complex long double) = Load[cld] : &:r100_1, m89_5
+# 100| r100_3(long double) = Convert : r100_2
+# 100| r100_4(glval) = VariableAddress[ld] :
+# 100| m100_5(long double) = Store[ld] : &:r100_4, r100_3
+# 103| r103_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 103| r103_2(_Imaginary float) = Load[jf] : &:r103_1, m65_3
+# 103| r103_3(_Complex float) = Convert : r103_2
+# 103| r103_4(glval<_Complex float>) = VariableAddress[cf] :
+# 103| m103_5(_Complex float) = Store[cf] : &:r103_4, r103_3
+# 104| r104_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 104| r104_2(_Imaginary double) = Load[jd] : &:r104_1, m66_4
+# 104| r104_3(_Complex float) = Convert : r104_2
+# 104| r104_4(glval<_Complex float>) = VariableAddress[cf] :
+# 104| m104_5(_Complex float) = Store[cf] : &:r104_4, r104_3
+# 105| r105_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 105| r105_2(_Imaginary long double) = Load[jld] : &:r105_1, m67_4
+# 105| r105_3(_Complex float) = Convert : r105_2
+# 105| r105_4(glval<_Complex float>) = VariableAddress[cf] :
+# 105| m105_5(_Complex float) = Store[cf] : &:r105_4, r105_3
+# 106| r106_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 106| r106_2(_Imaginary float) = Load[jf] : &:r106_1, m65_3
+# 106| r106_3(_Complex double) = Convert : r106_2
+# 106| r106_4(glval<_Complex double>) = VariableAddress[cd] :
+# 106| m106_5(_Complex double) = Store[cd] : &:r106_4, r106_3
+# 107| r107_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 107| r107_2(_Imaginary double) = Load[jd] : &:r107_1, m66_4
+# 107| r107_3(_Complex double) = Convert : r107_2
+# 107| r107_4(glval<_Complex double>) = VariableAddress[cd] :
+# 107| m107_5(_Complex double) = Store[cd] : &:r107_4, r107_3
+# 108| r108_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 108| r108_2(_Imaginary long double) = Load[jld] : &:r108_1, m67_4
+# 108| r108_3(_Complex double) = Convert : r108_2
+# 108| r108_4(glval<_Complex double>) = VariableAddress[cd] :
+# 108| m108_5(_Complex double) = Store[cd] : &:r108_4, r108_3
+# 109| r109_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 109| r109_2(_Imaginary float) = Load[jf] : &:r109_1, m65_3
+# 109| r109_3(_Complex long double) = Convert : r109_2
+# 109| r109_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 109| m109_5(_Complex long double) = Store[cld] : &:r109_4, r109_3
+# 110| r110_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 110| r110_2(_Imaginary double) = Load[jd] : &:r110_1, m66_4
+# 110| r110_3(_Complex long double) = Convert : r110_2
+# 110| r110_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 110| m110_5(_Complex long double) = Store[cld] : &:r110_4, r110_3
+# 111| r111_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 111| r111_2(_Imaginary long double) = Load[jld] : &:r111_1, m67_4
+# 111| r111_3(_Complex long double) = Convert : r111_2
+# 111| r111_4(glval<_Complex long double>) = VariableAddress[cld] :
+# 111| m111_5(_Complex long double) = Store[cld] : &:r111_4, r111_3
+# 114| r114_1(glval<_Complex float>) = VariableAddress[cf] :
+# 114| r114_2(_Complex float) = Load[cf] : &:r114_1, m105_5
+# 114| r114_3(_Imaginary float) = Convert : r114_2
+# 114| r114_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 114| m114_5(_Imaginary float) = Store[jf] : &:r114_4, r114_3
+# 115| r115_1(glval<_Complex double>) = VariableAddress[cd] :
+# 115| r115_2(_Complex double) = Load[cd] : &:r115_1, m108_5
+# 115| r115_3(_Imaginary float) = Convert : r115_2
+# 115| r115_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 115| m115_5(_Imaginary float) = Store[jf] : &:r115_4, r115_3
+# 116| r116_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 116| r116_2(_Complex long double) = Load[cld] : &:r116_1, m111_5
+# 116| r116_3(_Imaginary float) = Convert : r116_2
+# 116| r116_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 116| m116_5(_Imaginary float) = Store[jf] : &:r116_4, r116_3
+# 117| r117_1(glval<_Complex float>) = VariableAddress[cf] :
+# 117| r117_2(_Complex float) = Load[cf] : &:r117_1, m105_5
+# 117| r117_3(_Imaginary double) = Convert : r117_2
+# 117| r117_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 117| m117_5(_Imaginary double) = Store[jd] : &:r117_4, r117_3
+# 118| r118_1(glval<_Complex double>) = VariableAddress[cd] :
+# 118| r118_2(_Complex double) = Load[cd] : &:r118_1, m108_5
+# 118| r118_3(_Imaginary double) = Convert : r118_2
+# 118| r118_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 118| m118_5(_Imaginary double) = Store[jd] : &:r118_4, r118_3
+# 119| r119_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 119| r119_2(_Complex long double) = Load[cld] : &:r119_1, m111_5
+# 119| r119_3(_Imaginary double) = Convert : r119_2
+# 119| r119_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 119| m119_5(_Imaginary double) = Store[jd] : &:r119_4, r119_3
+# 120| r120_1(glval<_Complex float>) = VariableAddress[cf] :
+# 120| r120_2(_Complex float) = Load[cf] : &:r120_1, m105_5
+# 120| r120_3(_Imaginary long double) = Convert : r120_2
+# 120| r120_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 120| m120_5(_Imaginary long double) = Store[jld] : &:r120_4, r120_3
+# 121| r121_1(glval<_Complex double>) = VariableAddress[cd] :
+# 121| r121_2(_Complex double) = Load[cd] : &:r121_1, m108_5
+# 121| r121_3(_Imaginary long double) = Convert : r121_2
+# 121| r121_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 121| m121_5(_Imaginary long double) = Store[jld] : &:r121_4, r121_3
+# 122| r122_1(glval<_Complex long double>) = VariableAddress[cld] :
+# 122| r122_2(_Complex long double) = Load[cld] : &:r122_1, m111_5
+# 122| r122_3(_Imaginary long double) = Convert : r122_2
+# 122| r122_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 122| m122_5(_Imaginary long double) = Store[jld] : &:r122_4, r122_3
+# 125| r125_1(glval) = VariableAddress[f] :
+# 125| r125_2(float) = Load[f] : &:r125_1, m94_5
+# 125| r125_3(_Imaginary float) = Convert : r125_2
+# 125| r125_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 125| m125_5(_Imaginary float) = Store[jf] : &:r125_4, r125_3
+# 126| r126_1(glval) = VariableAddress[d] :
+# 126| r126_2(double) = Load[d] : &:r126_1, m97_5
+# 126| r126_3(_Imaginary float) = Convert : r126_2
+# 126| r126_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 126| m126_5(_Imaginary float) = Store[jf] : &:r126_4, r126_3
+# 127| r127_1(glval) = VariableAddress[ld] :
+# 127| r127_2(long double) = Load[ld] : &:r127_1, m100_5
+# 127| r127_3(_Imaginary float) = Convert : r127_2
+# 127| r127_4(glval<_Imaginary float>) = VariableAddress[jf] :
+# 127| m127_5(_Imaginary float) = Store[jf] : &:r127_4, r127_3
+# 128| r128_1(glval) = VariableAddress[f] :
+# 128| r128_2(float) = Load[f] : &:r128_1, m94_5
+# 128| r128_3(_Imaginary double) = Convert : r128_2
+# 128| r128_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 128| m128_5(_Imaginary double) = Store[jd] : &:r128_4, r128_3
+# 129| r129_1(glval) = VariableAddress[d] :
+# 129| r129_2(double) = Load[d] : &:r129_1, m97_5
+# 129| r129_3(_Imaginary double) = Convert : r129_2
+# 129| r129_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 129| m129_5(_Imaginary double) = Store[jd] : &:r129_4, r129_3
+# 130| r130_1(glval) = VariableAddress[ld] :
+# 130| r130_2(long double) = Load[ld] : &:r130_1, m100_5
+# 130| r130_3(_Imaginary double) = Convert : r130_2
+# 130| r130_4(glval<_Imaginary double>) = VariableAddress[jd] :
+# 130| m130_5(_Imaginary double) = Store[jd] : &:r130_4, r130_3
+# 131| r131_1(glval) = VariableAddress[f] :
+# 131| r131_2(float) = Load[f] : &:r131_1, m94_5
+# 131| r131_3(_Imaginary long double) = Convert : r131_2
+# 131| r131_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 131| m131_5(_Imaginary long double) = Store[jld] : &:r131_4, r131_3
+# 132| r132_1(glval) = VariableAddress[d] :
+# 132| r132_2(double) = Load[d] : &:r132_1, m97_5
+# 132| r132_3(_Imaginary long double) = Convert : r132_2
+# 132| r132_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 132| m132_5(_Imaginary long double) = Store[jld] : &:r132_4, r132_3
+# 133| r133_1(glval) = VariableAddress[ld] :
+# 133| r133_2(long double) = Load[ld] : &:r133_1, m100_5
+# 133| r133_3(_Imaginary long double) = Convert : r133_2
+# 133| r133_4(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 133| m133_5(_Imaginary long double) = Store[jld] : &:r133_4, r133_3
+# 136| r136_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 136| r136_2(_Imaginary float) = Load[jf] : &:r136_1, m127_5
+# 136| r136_3(float) = Convert : r136_2
+# 136| r136_4(glval) = VariableAddress[f] :
+# 136| m136_5(float) = Store[f] : &:r136_4, r136_3
+# 137| r137_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 137| r137_2(_Imaginary double) = Load[jd] : &:r137_1, m130_5
+# 137| r137_3(float) = Convert : r137_2
+# 137| r137_4(glval) = VariableAddress[f] :
+# 137| m137_5(float) = Store[f] : &:r137_4, r137_3
+# 138| r138_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 138| r138_2(_Imaginary long double) = Load[jld] : &:r138_1, m133_5
+# 138| r138_3(float) = Convert : r138_2
+# 138| r138_4(glval) = VariableAddress[f] :
+# 138| m138_5(float) = Store[f] : &:r138_4, r138_3
+# 139| r139_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 139| r139_2(_Imaginary float) = Load[jf] : &:r139_1, m127_5
+# 139| r139_3(double) = Convert : r139_2
+# 139| r139_4(glval) = VariableAddress[d] :
+# 139| m139_5(double) = Store[d] : &:r139_4, r139_3
+# 140| r140_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 140| r140_2(_Imaginary double) = Load[jd] : &:r140_1, m130_5
+# 140| r140_3(double) = Convert : r140_2
+# 140| r140_4(glval) = VariableAddress[d] :
+# 140| m140_5(double) = Store[d] : &:r140_4, r140_3
+# 141| r141_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 141| r141_2(_Imaginary long double) = Load[jld] : &:r141_1, m133_5
+# 141| r141_3(double) = Convert : r141_2
+# 141| r141_4(glval) = VariableAddress[d] :
+# 141| m141_5(double) = Store[d] : &:r141_4, r141_3
+# 142| r142_1(glval<_Imaginary float>) = VariableAddress[jf] :
+# 142| r142_2(_Imaginary float) = Load[jf] : &:r142_1, m127_5
+# 142| r142_3(long double) = Convert : r142_2
+# 142| r142_4(glval) = VariableAddress[ld] :
+# 142| m142_5(long double) = Store[ld] : &:r142_4, r142_3
+# 143| r143_1(glval<_Imaginary double>) = VariableAddress[jd] :
+# 143| r143_2(_Imaginary double) = Load[jd] : &:r143_1, m130_5
+# 143| r143_3(long double) = Convert : r143_2
+# 143| r143_4(glval) = VariableAddress[ld] :
+# 143| m143_5(long double) = Store[ld] : &:r143_4, r143_3
+# 144| r144_1(glval<_Imaginary long double>) = VariableAddress[jld] :
+# 144| r144_2(_Imaginary long double) = Load[jld] : &:r144_1, m133_5
+# 144| r144_3(long double) = Convert : r144_2
+# 144| r144_4(glval) = VariableAddress[ld] :
+# 144| m144_5(long double) = Store[ld] : &:r144_4, r144_3
+# 145| v145_1(void) = NoOp :
+# 58| v58_5(void) = ReturnVoid :
+# 58| v58_6(void) = AliasedUse : m58_3
+# 58| v58_7(void) = ExitFunction :
+
+ir.c:
+# 7| void MyCoordsTest(int)
+# 7| Block 0
+# 7| v7_1(void) = EnterFunction :
+# 7| m7_2(unknown) = AliasedDefinition :
+# 7| m7_3(unknown) = InitializeNonLocal :
+# 7| m7_4(unknown) = Chi : total:m7_2, partial:m7_3
+# 7| r7_5(glval) = VariableAddress[pos] :
+# 7| m7_6(int) = InitializeParameter[pos] : &:r7_5
+# 8| r8_1(glval<(unnamed class/struct/union)>) = VariableAddress[coords] :
+# 8| m8_2((unnamed class/struct/union)) = Uninitialized[coords] : &:r8_1
+# 8| r8_3(glval) = FieldAddress[x] : r8_1
+# 8| r8_4(int) = Constant[0] :
+# 8| m8_5(int) = Store[?] : &:r8_3, r8_4
+# 8| m8_6((unnamed class/struct/union)) = Chi : total:m8_2, partial:m8_5
+# 8| r8_7(glval) = FieldAddress[y] : r8_1
+# 8| r8_8(int) = Constant[0] :
+# 8| m8_9(int) = Store[?] : &:r8_7, r8_8
+# 8| m8_10((unnamed class/struct/union)) = Chi : total:m8_6, partial:m8_9
+# 9| r9_1(glval) = VariableAddress[pos] :
+# 9| r9_2(int) = Load[pos] : &:r9_1, m7_6
+# 9| r9_3(int) = Constant[1] :
+# 9| r9_4(int) = Add : r9_2, r9_3
+# 9| r9_5(glval<(unnamed class/struct/union)>) = VariableAddress[coords] :
+# 9| r9_6(glval) = FieldAddress[y] : r9_5
+# 9| m9_7(int) = Store[?] : &:r9_6, r9_4
+# 9| m9_8((unnamed class/struct/union)) = Chi : total:m8_10, partial:m9_7
+# 9| r9_9(int) = CopyValue : r9_4
+# 9| r9_10(glval<(unnamed class/struct/union)>) = VariableAddress[coords] :
+# 9| r9_11(glval) = FieldAddress[x] : r9_10
+# 9| m9_12(int) = Store[?] : &:r9_11, r9_9
+# 9| m9_13((unnamed class/struct/union)) = Chi : total:m9_8, partial:m9_12
+# 10| r10_1(glval) = FunctionAddress[getX] :
+# 10| r10_2(glval<(unnamed class/struct/union)>) = VariableAddress[coords] :
+# 10| r10_3(struct *) = CopyValue : r10_2
+# 10| r10_4(int) = Call[getX] : func:r10_1, 0:r10_3
+# 10| m10_5(unknown) = ^CallSideEffect : ~m7_4
+# 10| m10_6(unknown) = Chi : total:m7_4, partial:m10_5
+# 10| v10_7(void) = ^BufferReadSideEffect[0] : &:r10_3, ~m9_13
+# 10| m10_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r10_3
+# 10| m10_9((unnamed class/struct/union)) = Chi : total:m9_13, partial:m10_8
+# 10| r10_10(glval<(unnamed class/struct/union)>) = VariableAddress[coords] :
+# 10| r10_11(glval) = FieldAddress[x] : r10_10
+# 10| m10_12(int) = Store[?] : &:r10_11, r10_4
+# 10| m10_13((unnamed class/struct/union)) = Chi : total:m10_9, partial:m10_12
+# 11| v11_1(void) = NoOp :
+# 7| v7_7(void) = ReturnVoid :
+# 7| v7_8(void) = AliasedUse : ~m10_6
+# 7| v7_9(void) = ExitFunction :
+
+# 13| void CStyleCast(void*)
+# 13| Block 0
+# 13| v13_1(void) = EnterFunction :
+# 13| m13_2(unknown) = AliasedDefinition :
+# 13| m13_3(unknown) = InitializeNonLocal :
+# 13| m13_4(unknown) = Chi : total:m13_2, partial:m13_3
+# 13| r13_5(glval) = VariableAddress[src] :
+# 13| m13_6(void *) = InitializeParameter[src] : &:r13_5
+# 13| r13_7(void *) = Load[src] : &:r13_5, m13_6
+# 13| m13_8(unknown) = InitializeIndirection[src] : &:r13_7
+# 15| r15_1(glval) = VariableAddress[dst] :
+# 15| r15_2(glval) = VariableAddress[src] :
+# 15| r15_3(void *) = Load[src] : &:r15_2, m13_6
+# 15| r15_4(char *) = Convert : r15_3
+# 15| m15_5(char *) = Store[dst] : &:r15_1, r15_4
+# 16| v16_1(void) = NoOp :
+# 13| v13_9(void) = ReturnIndirection[src] : &:r13_7, m13_8
+# 13| v13_10(void) = ReturnVoid :
+# 13| v13_11(void) = AliasedUse : m13_3
+# 13| v13_12(void) = ExitFunction :
+
+ir.cpp:
+# 1| void Constants()
+# 1| Block 0
+# 1| v1_1(void) = EnterFunction :
+# 1| m1_2(unknown) = AliasedDefinition :
+# 1| m1_3(unknown) = InitializeNonLocal :
+# 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3
+# 2| r2_1(glval) = VariableAddress[c_i] :
+# 2| r2_2(char) = Constant[1] :
+# 2| m2_3(char) = Store[c_i] : &:r2_1, r2_2
+# 3| r3_1(glval) = VariableAddress[c_c] :
+# 3| r3_2(char) = Constant[65] :
+# 3| m3_3(char) = Store[c_c] : &:r3_1, r3_2
+# 5| r5_1(glval) = VariableAddress[sc_i] :
+# 5| r5_2(signed char) = Constant[-1] :
+# 5| m5_3(signed char) = Store[sc_i] : &:r5_1, r5_2
+# 6| r6_1(glval) = VariableAddress[sc_c] :
+# 6| r6_2(signed char) = Constant[65] :
+# 6| m6_3(signed char) = Store[sc_c] : &:r6_1, r6_2
+# 8| r8_1(glval) = VariableAddress[uc_i] :
+# 8| r8_2(unsigned char) = Constant[5] :
+# 8| m8_3(unsigned char) = Store[uc_i] : &:r8_1, r8_2
+# 9| r9_1(glval) = VariableAddress[uc_c] :
+# 9| r9_2(unsigned char) = Constant[65] :
+# 9| m9_3(unsigned char) = Store[uc_c] : &:r9_1, r9_2
+# 11| r11_1(glval) = VariableAddress[s] :
+# 11| r11_2(short) = Constant[5] :
+# 11| m11_3(short) = Store[s] : &:r11_1, r11_2
+# 12| r12_1(glval) = VariableAddress[us] :
+# 12| r12_2(unsigned short) = Constant[5] :
+# 12| m12_3(unsigned short) = Store[us] : &:r12_1, r12_2
+# 14| r14_1(glval) = VariableAddress[i] :
+# 14| r14_2(int) = Constant[5] :
+# 14| m14_3(int) = Store[i] : &:r14_1, r14_2
+# 15| r15_1(glval) = VariableAddress[ui] :
+# 15| r15_2(unsigned int) = Constant[5] :
+# 15| m15_3(unsigned int) = Store[ui] : &:r15_1, r15_2
+# 17| r17_1(glval) = VariableAddress[l] :
+# 17| r17_2(long) = Constant[5] :
+# 17| m17_3(long) = Store[l] : &:r17_1, r17_2
+# 18| r18_1(glval) = VariableAddress[ul] :
+# 18| r18_2(unsigned long) = Constant[5] :
+# 18| m18_3(unsigned long) = Store[ul] : &:r18_1, r18_2
+# 20| r20_1(glval) = VariableAddress[ll_i] :
+# 20| r20_2(long long) = Constant[5] :
+# 20| m20_3(long long) = Store[ll_i] : &:r20_1, r20_2
+# 21| r21_1(glval) = VariableAddress[ll_ll] :
+# 21| r21_2(long long) = Constant[5] :
+# 21| m21_3(long long) = Store[ll_ll] : &:r21_1, r21_2
+# 22| r22_1(glval) = VariableAddress[ull_i] :
+# 22| r22_2(unsigned long long) = Constant[5] :
+# 22| m22_3(unsigned long long) = Store[ull_i] : &:r22_1, r22_2
+# 23| r23_1(glval) = VariableAddress[ull_ull] :
+# 23| r23_2(unsigned long long) = Constant[5] :
+# 23| m23_3(unsigned long long) = Store[ull_ull] : &:r23_1, r23_2
+# 25| r25_1(glval) = VariableAddress[b_t] :
+# 25| r25_2(bool) = Constant[1] :
+# 25| m25_3(bool) = Store[b_t] : &:r25_1, r25_2
+# 26| r26_1(glval) = VariableAddress[b_f] :
+# 26| r26_2(bool) = Constant[0] :
+# 26| m26_3(bool) = Store[b_f] : &:r26_1, r26_2
+# 28| r28_1(glval) = VariableAddress[wc_i] :
+# 28| r28_2(wchar_t) = Constant[5] :
+# 28| m28_3(wchar_t) = Store[wc_i] : &:r28_1, r28_2
+# 29| r29_1(glval) = VariableAddress[wc_c] :
+# 29| r29_2(wchar_t) = Constant[65] :
+# 29| m29_3(wchar_t) = Store[wc_c] : &:r29_1, r29_2
+# 31| r31_1(glval) = VariableAddress[c16] :
+# 31| r31_2(char16_t) = Constant[65] :
+# 31| m31_3(char16_t) = Store[c16] : &:r31_1, r31_2
+# 32| r32_1(glval) = VariableAddress[c32] :
+# 32| r32_2(char32_t) = Constant[65] :
+# 32| m32_3(char32_t) = Store[c32] : &:r32_1, r32_2
+# 34| r34_1(glval) = VariableAddress[f_i] :
+# 34| r34_2(float) = Constant[1.0] :
+# 34| m34_3(float) = Store[f_i] : &:r34_1, r34_2
+# 35| r35_1(glval) = VariableAddress[f_f] :
+# 35| r35_2(float) = Constant[1.0] :
+# 35| m35_3(float) = Store[f_f] : &:r35_1, r35_2
+# 36| r36_1(glval) = VariableAddress[f_d] :
+# 36| r36_2(float) = Constant[1.0] :
+# 36| m36_3(float) = Store[f_d] : &:r36_1, r36_2
+# 38| r38_1(glval) = VariableAddress[d_i] :
+# 38| r38_2(double) = Constant[1.0] :
+# 38| m38_3(double) = Store[d_i] : &:r38_1, r38_2
+# 39| r39_1(glval) = VariableAddress[d_f] :
+# 39| r39_2(double) = Constant[1.0] :
+# 39| m39_3(double) = Store[d_f] : &:r39_1, r39_2
+# 40| r40_1(glval) = VariableAddress[d_d] :
+# 40| r40_2(double) = Constant[1.0] :
+# 40| m40_3(double) = Store[d_d] : &:r40_1, r40_2
+# 41| v41_1(void) = NoOp :
+# 1| v1_5(void) = ReturnVoid :
+# 1| v1_6(void) = AliasedUse : m1_3
+# 1| v1_7(void) = ExitFunction :
+
+# 43| void Foo()
+# 43| Block 0
+# 43| v43_1(void) = EnterFunction :
+# 43| m43_2(unknown) = AliasedDefinition :
+# 43| m43_3(unknown) = InitializeNonLocal :
+# 43| m43_4(unknown) = Chi : total:m43_2, partial:m43_3
+# 44| r44_1(glval) = VariableAddress[x] :
+# 44| r44_2(int) = Constant[17] :
+# 44| m44_3(int) = Store[x] : &:r44_1, r44_2
+# 45| r45_1(glval) = VariableAddress[y] :
+# 45| r45_2(short) = Constant[7] :
+# 45| m45_3(short) = Store[y] : &:r45_1, r45_2
+# 46| r46_1(glval) = VariableAddress[x] :
+# 46| r46_2(int) = Load[x] : &:r46_1, m44_3
+# 46| r46_3(glval) = VariableAddress[y] :
+# 46| r46_4(short) = Load[y] : &:r46_3, m45_3
+# 46| r46_5(int) = Convert : r46_4
+# 46| r46_6(int) = Add : r46_2, r46_5
+# 46| r46_7(short) = Convert : r46_6
+# 46| r46_8(glval) = VariableAddress[y] :
+# 46| m46_9(short) = Store[y] : &:r46_8, r46_7
+# 47| r47_1(glval) = VariableAddress[x] :
+# 47| r47_2(int) = Load[x] : &:r47_1, m44_3
+# 47| r47_3(glval) = VariableAddress[y] :
+# 47| r47_4(short) = Load[y] : &:r47_3, m46_9
+# 47| r47_5(int) = Convert : r47_4
+# 47| r47_6(int) = Mul : r47_2, r47_5
+# 47| r47_7(glval) = VariableAddress[x] :
+# 47| m47_8(int) = Store[x] : &:r47_7, r47_6
+# 48| v48_1(void) = NoOp :
+# 43| v43_5(void) = ReturnVoid :
+# 43| v43_6(void) = AliasedUse : m43_3
+# 43| v43_7(void) = ExitFunction :
+
+# 50| void IntegerOps(int, int)
+# 50| Block 0
+# 50| v50_1(void) = EnterFunction :
+# 50| m50_2(unknown) = AliasedDefinition :
+# 50| m50_3(unknown) = InitializeNonLocal :
+# 50| m50_4(unknown) = Chi : total:m50_2, partial:m50_3
+# 50| r50_5(glval) = VariableAddress[x] :
+# 50| m50_6(int) = InitializeParameter[x] : &:r50_5
+# 50| r50_7(glval) = VariableAddress[y] :
+# 50| m50_8(int) = InitializeParameter[y] : &:r50_7
+# 51| r51_1(glval) = VariableAddress[z] :
+# 51| m51_2(int) = Uninitialized[z] : &:r51_1
+# 53| r53_1(glval) = VariableAddress[x] :
+# 53| r53_2(int) = Load[x] : &:r53_1, m50_6
+# 53| r53_3(glval) = VariableAddress[y] :
+# 53| r53_4(int) = Load[y] : &:r53_3, m50_8
+# 53| r53_5(int) = Add : r53_2, r53_4
+# 53| r53_6(glval) = VariableAddress[z] :
+# 53| m53_7(int) = Store[z] : &:r53_6, r53_5
+# 54| r54_1(glval) = VariableAddress[x] :
+# 54| r54_2(int) = Load[x] : &:r54_1, m50_6
+# 54| r54_3(glval) = VariableAddress[y] :
+# 54| r54_4(int) = Load[y] : &:r54_3, m50_8
+# 54| r54_5(int) = Sub : r54_2, r54_4
+# 54| r54_6(glval) = VariableAddress[z] :
+# 54| m54_7(int) = Store[z] : &:r54_6, r54_5
+# 55| r55_1(glval) = VariableAddress[x] :
+# 55| r55_2(int) = Load[x] : &:r55_1, m50_6
+# 55| r55_3(glval) = VariableAddress[y] :
+# 55| r55_4(int) = Load[y] : &:r55_3, m50_8
+# 55| r55_5(int) = Mul : r55_2, r55_4
+# 55| r55_6(glval) = VariableAddress[z] :
+# 55| m55_7(int) = Store[z] : &:r55_6, r55_5
+# 56| r56_1(glval) = VariableAddress[x] :
+# 56| r56_2(int) = Load[x] : &:r56_1, m50_6
+# 56| r56_3(glval) = VariableAddress[y] :
+# 56| r56_4(int) = Load[y] : &:r56_3, m50_8
+# 56| r56_5(int) = Div : r56_2, r56_4
+# 56| r56_6(glval) = VariableAddress[z] :
+# 56| m56_7(int) = Store[z] : &:r56_6, r56_5
+# 57| r57_1(glval) = VariableAddress[x] :
+# 57| r57_2(int) = Load[x] : &:r57_1, m50_6
+# 57| r57_3(glval) = VariableAddress[y] :
+# 57| r57_4(int) = Load[y] : &:r57_3, m50_8
+# 57| r57_5(int) = Rem : r57_2, r57_4
+# 57| r57_6(glval) = VariableAddress[z] :
+# 57| m57_7(int) = Store[z] : &:r57_6, r57_5
+# 59| r59_1(glval) = VariableAddress[x] :
+# 59| r59_2(int) = Load[x] : &:r59_1, m50_6
+# 59| r59_3(glval) = VariableAddress[y] :
+# 59| r59_4(int) = Load[y] : &:r59_3, m50_8
+# 59| r59_5(int) = BitAnd : r59_2, r59_4
+# 59| r59_6(glval) = VariableAddress[z] :
+# 59| m59_7(int) = Store[z] : &:r59_6, r59_5
+# 60| r60_1(glval) = VariableAddress[x] :
+# 60| r60_2(int) = Load[x] : &:r60_1, m50_6
+# 60| r60_3(glval) = VariableAddress[y] :
+# 60| r60_4(int) = Load[y] : &:r60_3, m50_8
+# 60| r60_5(int) = BitOr : r60_2, r60_4
+# 60| r60_6(glval) = VariableAddress[z] :
+# 60| m60_7(int) = Store[z] : &:r60_6, r60_5
+# 61| r61_1(glval) = VariableAddress[x] :
+# 61| r61_2(int) = Load[x] : &:r61_1, m50_6
+# 61| r61_3(glval) = VariableAddress[y] :
+# 61| r61_4(int) = Load[y] : &:r61_3, m50_8
+# 61| r61_5(int) = BitXor : r61_2, r61_4
+# 61| r61_6(glval) = VariableAddress[z] :
+# 61| m61_7(int) = Store[z] : &:r61_6, r61_5
+# 63| r63_1(glval) = VariableAddress[x] :
+# 63| r63_2(int) = Load[x] : &:r63_1, m50_6
+# 63| r63_3(glval) = VariableAddress[y] :
+# 63| r63_4(int) = Load[y] : &:r63_3, m50_8
+# 63| r63_5(int) = ShiftLeft : r63_2, r63_4
+# 63| r63_6(glval) = VariableAddress[z] :
+# 63| m63_7(int) = Store[z] : &:r63_6, r63_5
+# 64| r64_1(glval) = VariableAddress[x] :
+# 64| r64_2(int) = Load[x] : &:r64_1, m50_6
+# 64| r64_3(glval) = VariableAddress[y] :
+# 64| r64_4(int) = Load[y] : &:r64_3, m50_8
+# 64| r64_5(int) = ShiftRight : r64_2, r64_4
+# 64| r64_6(glval) = VariableAddress[z] :
+# 64| m64_7(int) = Store[z] : &:r64_6, r64_5
+# 66| r66_1(glval) = VariableAddress[x] :
+# 66| r66_2(int) = Load[x] : &:r66_1, m50_6
+# 66| r66_3(glval) = VariableAddress[z] :
+# 66| m66_4(int) = Store[z] : &:r66_3, r66_2
+# 68| r68_1(glval) = VariableAddress[x] :
+# 68| r68_2(int) = Load[x] : &:r68_1, m50_6
+# 68| r68_3(glval) = VariableAddress[z] :
+# 68| r68_4(int) = Load[z] : &:r68_3, m66_4
+# 68| r68_5(int) = Add : r68_4, r68_2
+# 68| m68_6(int) = Store[z] : &:r68_3, r68_5
+# 69| r69_1(glval) = VariableAddress[x] :
+# 69| r69_2(int) = Load[x] : &:r69_1, m50_6
+# 69| r69_3(glval) = VariableAddress[z] :
+# 69| r69_4(int) = Load[z] : &:r69_3, m68_6
+# 69| r69_5(int) = Sub : r69_4, r69_2
+# 69| m69_6(int) = Store[z] : &:r69_3, r69_5
+# 70| r70_1(glval) = VariableAddress[x] :
+# 70| r70_2(int) = Load[x] : &:r70_1, m50_6
+# 70| r70_3(glval) = VariableAddress[z] :
+# 70| r70_4(int) = Load[z] : &:r70_3, m69_6
+# 70| r70_5(int) = Mul : r70_4, r70_2
+# 70| m70_6(int) = Store[z] : &:r70_3, r70_5
+# 71| r71_1(glval) = VariableAddress[x] :
+# 71| r71_2(int) = Load[x] : &:r71_1, m50_6
+# 71| r71_3(glval) = VariableAddress[z] :
+# 71| r71_4(int) = Load[z] : &:r71_3, m70_6
+# 71| r71_5(int) = Div : r71_4, r71_2
+# 71| m71_6(int) = Store[z] : &:r71_3, r71_5
+# 72| r72_1(glval) = VariableAddress[x] :
+# 72| r72_2(int) = Load[x] : &:r72_1, m50_6
+# 72| r72_3(glval) = VariableAddress[z] :
+# 72| r72_4(int) = Load[z] : &:r72_3, m71_6
+# 72| r72_5(int) = Rem : r72_4, r72_2
+# 72| m72_6(int) = Store[z] : &:r72_3, r72_5
+# 74| r74_1(glval) = VariableAddress[x] :
+# 74| r74_2(int) = Load[x] : &:r74_1, m50_6
+# 74| r74_3(glval) = VariableAddress[z] :
+# 74| r74_4(int) = Load[z] : &:r74_3, m72_6
+# 74| r74_5(int) = BitAnd : r74_4, r74_2
+# 74| m74_6(int) = Store[z] : &:r74_3, r74_5
+# 75| r75_1(glval) = VariableAddress[x] :
+# 75| r75_2(int) = Load[x] : &:r75_1, m50_6
+# 75| r75_3(glval) = VariableAddress[z] :
+# 75| r75_4(int) = Load[z] : &:r75_3, m74_6
+# 75| r75_5(int) = BitOr : r75_4, r75_2
+# 75| m75_6(int) = Store[z] : &:r75_3, r75_5
+# 76| r76_1(glval) = VariableAddress[x] :
+# 76| r76_2(int) = Load[x] : &:r76_1, m50_6
+# 76| r76_3(glval) = VariableAddress[z] :
+# 76| r76_4(int) = Load[z] : &:r76_3, m75_6
+# 76| r76_5(int) = BitXor : r76_4, r76_2
+# 76| m76_6(int) = Store[z] : &:r76_3, r76_5
+# 78| r78_1(glval) = VariableAddress[x] :
+# 78| r78_2(int) = Load[x] : &:r78_1, m50_6
+# 78| r78_3(glval) = VariableAddress[z] :
+# 78| r78_4(int) = Load[z] : &:r78_3, m76_6
+# 78| r78_5(int) = ShiftLeft : r78_4, r78_2
+# 78| m78_6(int) = Store[z] : &:r78_3, r78_5
+# 79| r79_1(glval) = VariableAddress[x] :
+# 79| r79_2(int) = Load[x] : &:r79_1, m50_6
+# 79| r79_3(glval) = VariableAddress[z] :
+# 79| r79_4(int) = Load[z] : &:r79_3, m78_6
+# 79| r79_5(int) = ShiftRight : r79_4, r79_2
+# 79| m79_6(int) = Store[z] : &:r79_3, r79_5
+# 81| r81_1(glval) = VariableAddress[x] :
+# 81| r81_2(int) = Load[x] : &:r81_1, m50_6
+# 81| r81_3(int) = CopyValue : r81_2
+# 81| r81_4(glval) = VariableAddress[z] :
+# 81| m81_5(int) = Store[z] : &:r81_4, r81_3
+# 82| r82_1(glval) = VariableAddress[x] :
+# 82| r82_2(int) = Load[x] : &:r82_1, m50_6
+# 82| r82_3(int) = Negate : r82_2
+# 82| r82_4(glval) = VariableAddress[z] :
+# 82| m82_5(int) = Store[z] : &:r82_4, r82_3
+# 83| r83_1(glval) = VariableAddress[x] :
+# 83| r83_2(int) = Load[x] : &:r83_1, m50_6
+# 83| r83_3(int) = BitComplement : r83_2
+# 83| r83_4(glval) = VariableAddress[z] :
+# 83| m83_5(int) = Store[z] : &:r83_4, r83_3
+# 84| r84_1(glval) = VariableAddress[x] :
+# 84| r84_2(int) = Load[x] : &:r84_1, m50_6
+# 84| r84_3(int) = Constant[0] :
+# 84| r84_4(bool) = CompareNE : r84_2, r84_3
+# 84| r84_5(bool) = LogicalNot : r84_4
+# 84| r84_6(int) = Convert : r84_5
+# 84| r84_7(glval) = VariableAddress[z] :
+# 84| m84_8(int) = Store[z] : &:r84_7, r84_6
+# 85| v85_1(void) = NoOp :
+# 50| v50_9(void) = ReturnVoid :
+# 50| v50_10(void) = AliasedUse : m50_3
+# 50| v50_11(void) = ExitFunction :
+
+# 87| void IntegerCompare(int, int)
+# 87| Block 0
+# 87| v87_1(void) = EnterFunction :
+# 87| m87_2(unknown) = AliasedDefinition :
+# 87| m87_3(unknown) = InitializeNonLocal :
+# 87| m87_4(unknown) = Chi : total:m87_2, partial:m87_3
+# 87| r87_5(glval) = VariableAddress[x] :
+# 87| m87_6(int) = InitializeParameter[x] : &:r87_5
+# 87| r87_7(glval) = VariableAddress[y] :
+# 87| m87_8(int) = InitializeParameter[y] : &:r87_7
+# 88| r88_1(glval) = VariableAddress[b] :
+# 88| m88_2(bool) = Uninitialized[b] : &:r88_1
+# 90| r90_1(glval) = VariableAddress[x] :
+# 90| r90_2(int) = Load[x] : &:r90_1, m87_6
+# 90| r90_3(glval) = VariableAddress[y] :
+# 90| r90_4(int) = Load[y] : &:r90_3, m87_8
+# 90| r90_5(bool) = CompareEQ : r90_2, r90_4
+# 90| r90_6(glval) = VariableAddress[b] :
+# 90| m90_7(bool) = Store[b] : &:r90_6, r90_5
+# 91| r91_1(glval) = VariableAddress[x] :
+# 91| r91_2(int) = Load[x] : &:r91_1, m87_6
+# 91| r91_3(glval) = VariableAddress[y] :
+# 91| r91_4(int) = Load[y] : &:r91_3, m87_8
+# 91| r91_5(bool) = CompareNE : r91_2, r91_4
+# 91| r91_6(glval) = VariableAddress[b] :
+# 91| m91_7(bool) = Store[b] : &:r91_6, r91_5
+# 92| r92_1(glval) = VariableAddress[x] :
+# 92| r92_2(int) = Load[x] : &:r92_1, m87_6
+# 92| r92_3(glval) = VariableAddress[y] :
+# 92| r92_4(int) = Load[y] : &:r92_3, m87_8
+# 92| r92_5(bool) = CompareLT : r92_2, r92_4
+# 92| r92_6(glval) = VariableAddress[b] :
+# 92| m92_7(bool) = Store[b] : &:r92_6, r92_5
+# 93| r93_1(glval) = VariableAddress[x] :
+# 93| r93_2(int) = Load[x] : &:r93_1, m87_6
+# 93| r93_3(glval) = VariableAddress[y] :
+# 93| r93_4(int) = Load[y] : &:r93_3, m87_8
+# 93| r93_5(bool) = CompareGT : r93_2, r93_4
+# 93| r93_6(glval) = VariableAddress[b] :
+# 93| m93_7(bool) = Store[b] : &:r93_6, r93_5
+# 94| r94_1(glval) = VariableAddress[x] :
+# 94| r94_2(int) = Load[x] : &:r94_1, m87_6
+# 94| r94_3(glval) = VariableAddress[y] :
+# 94| r94_4(int) = Load[y] : &:r94_3, m87_8
+# 94| r94_5(bool) = CompareLE : r94_2, r94_4
+# 94| r94_6(glval) = VariableAddress[b] :
+# 94| m94_7(bool) = Store[b] : &:r94_6, r94_5
+# 95| r95_1(glval) = VariableAddress[x] :
+# 95| r95_2(int) = Load[x] : &:r95_1, m87_6
+# 95| r95_3(glval) = VariableAddress[y] :
+# 95| r95_4(int) = Load[y] : &:r95_3, m87_8
+# 95| r95_5(bool) = CompareGE : r95_2, r95_4
+# 95| r95_6(glval) = VariableAddress[b] :
+# 95| m95_7(bool) = Store[b] : &:r95_6, r95_5
+# 96| v96_1(void) = NoOp :
+# 87| v87_9(void) = ReturnVoid :
+# 87| v87_10(void) = AliasedUse : m87_3
+# 87| v87_11(void) = ExitFunction :
+
+# 98| void IntegerCrement(int)
+# 98| Block 0
+# 98| v98_1(void) = EnterFunction :
+# 98| m98_2(unknown) = AliasedDefinition :
+# 98| m98_3(unknown) = InitializeNonLocal :
+# 98| m98_4(unknown) = Chi : total:m98_2, partial:m98_3
+# 98| r98_5(glval) = VariableAddress[x] :
+# 98| m98_6(int) = InitializeParameter[x] : &:r98_5
+# 99| r99_1(glval) = VariableAddress[y] :
+# 99| m99_2(int) = Uninitialized[y] : &:r99_1
+# 101| r101_1(glval) = VariableAddress[x] :
+# 101| r101_2(int) = Load[x] : &:r101_1, m98_6
+# 101| r101_3(int) = Constant[1] :
+# 101| r101_4(int) = Add : r101_2, r101_3
+# 101| m101_5(int) = Store[x] : &:r101_1, r101_4
+# 101| r101_6(glval) = VariableAddress[y] :
+# 101| m101_7(int) = Store[y] : &:r101_6, r101_4
+# 102| r102_1(glval) = VariableAddress[x] :
+# 102| r102_2(int) = Load[x] : &:r102_1, m101_5
+# 102| r102_3(int) = Constant[1] :
+# 102| r102_4(int) = Sub : r102_2, r102_3
+# 102| m102_5(int) = Store[x] : &:r102_1, r102_4
+# 102| r102_6(glval) = VariableAddress[y] :
+# 102| m102_7(int) = Store[y] : &:r102_6, r102_4
+# 103| r103_1(glval) = VariableAddress[x] :
+# 103| r103_2(int) = Load[x] : &:r103_1, m102_5
+# 103| r103_3(int) = Constant[1] :
+# 103| r103_4(int) = Add : r103_2, r103_3
+# 103| m103_5(int) = Store[x] : &:r103_1, r103_4
+# 103| r103_6(int) = CopyValue : r103_2
+# 103| r103_7(glval) = VariableAddress[y] :
+# 103| m103_8(int) = Store[y] : &:r103_7, r103_6
+# 104| r104_1(glval) = VariableAddress[x] :
+# 104| r104_2(int) = Load[x] : &:r104_1, m103_5
+# 104| r104_3(int) = Constant[1] :
+# 104| r104_4(int) = Sub : r104_2, r104_3
+# 104| m104_5(int) = Store[x] : &:r104_1, r104_4
+# 104| r104_6(int) = CopyValue : r104_2
+# 104| r104_7(glval) = VariableAddress[y] :
+# 104| m104_8(int) = Store[y] : &:r104_7, r104_6
+# 105| v105_1(void) = NoOp :
+# 98| v98_7(void) = ReturnVoid :
+# 98| v98_8(void) = AliasedUse : m98_3
+# 98| v98_9(void) = ExitFunction :
+
+# 107| void IntegerCrement_LValue(int)
+# 107| Block 0
+# 107| v107_1(void) = EnterFunction :
+# 107| m107_2(unknown) = AliasedDefinition :
+# 107| m107_3(unknown) = InitializeNonLocal :
+# 107| m107_4(unknown) = Chi : total:m107_2, partial:m107_3
+# 107| r107_5(glval) = VariableAddress[x] :
+# 107| m107_6(int) = InitializeParameter[x] : &:r107_5
+# 108| r108_1(glval) = VariableAddress[p] :
+# 108| m108_2(int *) = Uninitialized[p] : &:r108_1
+# 110| r110_1(glval) = VariableAddress[x] :
+# 110| r110_2(int) = Load[x] : &:r110_1, m107_6
+# 110| r110_3(int) = Constant[1] :
+# 110| r110_4(int) = Add : r110_2, r110_3
+# 110| m110_5(int) = Store[x] : &:r110_1, r110_4
+# 110| r110_6(glval) = CopyValue : r110_1
+# 110| r110_7(int *) = CopyValue : r110_6
+# 110| r110_8(glval) = VariableAddress[p] :
+# 110| m110_9(int *) = Store[p] : &:r110_8, r110_7
+# 111| r111_1(glval) = VariableAddress[x] :
+# 111| r111_2(int) = Load[x] : &:r111_1, m110_5
+# 111| r111_3(int) = Constant[1] :
+# 111| r111_4(int) = Sub : r111_2, r111_3
+# 111| m111_5(int) = Store[x] : &:r111_1, r111_4
+# 111| r111_6(glval) = CopyValue : r111_1
+# 111| r111_7(int *) = CopyValue : r111_6
+# 111| r111_8(glval) = VariableAddress[p] :
+# 111| m111_9(int *) = Store[p] : &:r111_8, r111_7
+# 112| v112_1(void) = NoOp :
+# 107| v107_7(void) = ReturnVoid :
+# 107| v107_8(void) = AliasedUse : m107_3
+# 107| v107_9(void) = ExitFunction :
+
+# 114| void FloatOps(double, double)
+# 114| Block 0
+# 114| v114_1(void) = EnterFunction :
+# 114| m114_2(unknown) = AliasedDefinition :
+# 114| m114_3(unknown) = InitializeNonLocal :
+# 114| m114_4(unknown) = Chi : total:m114_2, partial:m114_3
+# 114| r114_5(glval) = VariableAddress[x] :
+# 114| m114_6(double) = InitializeParameter[x] : &:r114_5
+# 114| r114_7(glval) = VariableAddress[y] :
+# 114| m114_8(double) = InitializeParameter[y] : &:r114_7
+# 115| r115_1(glval) = VariableAddress[z] :
+# 115| m115_2(double) = Uninitialized[z] : &:r115_1
+# 117| r117_1(glval) = VariableAddress[x] :
+# 117| r117_2(double) = Load[x] : &:r117_1, m114_6
+# 117| r117_3(glval) = VariableAddress[y] :
+# 117| r117_4(double) = Load[y] : &:r117_3, m114_8
+# 117| r117_5(double) = Add : r117_2, r117_4
+# 117| r117_6(glval