Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add intrinsic to create an integer bitmask from a vector mask #57269

Merged
merged 1 commit into from
Jan 24, 2019

Conversation

gnzlbg
Copy link
Contributor

@gnzlbg gnzlbg commented Jan 2, 2019

This PR adds a new simd intrinsic: simd_bitmask(vector) -> unsigned integer that creates an integer bitmask from a vector mask by extracting one bit of each vector lane.

This is required to implement: rust-lang/packed_simd#166 .

EDIT: the reason we need an intrinsics for this is that we have to truncate the vector lanes to an <i1 x N> vector, and then bitcast that to an iN integer (while making sure that we only materialize i8, ... , i64 - that is, no i1, i2, i4, types), and we can't do any of that in a Rust library.

r? @rkruppe

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jan 2, 2019
@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:14769f33:start=1546445403986520206,finish=1546445460440510092,duration=56453989886
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---

[00:03:00] travis_fold:start:tidy
travis_time:start:tidy
tidy check
[00:03:00] tidy error: /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:75: line longer than 100 chars
[00:03:00] tidy error: /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:78: line longer than 100 chars
[00:03:00] tidy error: /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:81: line longer than 100 chars
[00:03:00] tidy error: /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:84: line longer than 100 chars
[00:03:00] tidy error: /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:87: line longer than 100 chars
[00:03:01] some tidy checks failed
[00:03:01] 
[00:03:01] 
[00:03:01] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/tidy" "/checkout/src" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0/bin/cargo" "--no-vendor" "--quiet"
[00:03:01] 
[00:03:01] 
[00:03:01] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test src/tools/tidy
[00:03:01] Build completed unsuccessfully in 0:00:43
[00:03:01] Build completed unsuccessfully in 0:00:43
[00:03:01] Makefile:69: recipe for target 'tidy' failed
[00:03:01] make: *** [tidy] Error 1
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:0a9274f4
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Wed Jan  2 16:14:10 UTC 2019
---
travis_time:end:029a69ed:start=1546445651353123241,finish=1546445651357431525,duration=4308284
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:020ad0c0
$ ln -s . checkout && for CORE in obj/cores/core.*; do EXE=$(echo $CORE | sed 's|obj/cores/core\.[0-9]*\.!checkout!\(.*\)|\1|;y|!|/|'); if [ -f "$EXE" ]; then printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" "$CORE"; gdb --batch -q -c "$CORE" "$EXE" -iex 'set auto-load off' -iex 'dir src/' -iex 'set sysroot .' -ex bt -ex q; echo travis_fold":"end:crashlog; fi; done || true
travis_fold:end:after_failure.4
travis_fold:start:after_failure.5
travis_time:start:07c4f2b2
travis_time:start:07c4f2b2
$ cat ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers || true
cat: ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers: No such file or directory
travis_fold:end:after_failure.5
travis_fold:start:after_failure.6
travis_time:start:0c973781
$ dmesg | grep -i kill

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 3, 2019

cc @sunfishcode @alexcrichton

@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:16098de2:start=1546507615723167172,finish=1546507674067662956,duration=58344495784
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---
[01:01:31] .................................................................................................... 4200/5225
[01:01:34] .................................................................................................... 4300/5225
[01:01:38] .................................................................................i.................. 4400/5225
[01:01:45] .................................................................................................... 4500/5225
[01:01:49] ....................................F............................................................... 4600/5225
[01:01:57] .................................................................................................... 4800/5225
[01:02:00] .................................................................................................... 4900/5225
[01:02:03] .................................................................................................... 5000/5225
[01:02:06] .................................................................................................... 5100/5225
[01:02:06] .................................................................................................... 5100/5225
[01:02:09] ................................................................i................................... 5200/5225
[01:02:10] .........................
[01:02:10] failures:
[01:02:10] 
[01:02:10] ---- [ui] ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs stdout ----
[01:02:10] diff of stderr:
[01:02:10] 
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u2`
[01:02:10] +   --> $DIR/simd-intrinsic-generic-bitmask.rs:67:21
[01:02:10] +    |
[01:02:10] + LL |         let _: u8 = simd_bitmask(m2);
[01:02:10] + 
[01:02:10] + 
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u4`
[01:02:10] +   --> $DIR/simd-intrinsic-generic-bitmask.rs:68:21
[01:02:10] +    |
[01:02:10] + LL |         let _: u8 = simd_bitmask(m4);
[01:02:10] + 
[01:02:10] + 
[01:02:10] 1 error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8`
[01:02:10] +   --> $DIR/simd-intrinsic-generic-bitmask.rs:70:22
[01:02:10] +    |
[01:02:10] + LL |         let _: u16 = simd_bitmask(m16);
[01:02:10] + 
[01:02:10] + 
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`
[01:02:10] +   --> $DIR/simd-intrinsic-generic-bitmask.rs:71:22
[01:02:10] +    |
[01:02:10] + LL |         let _: u32 = simd_bitmask(m32);
[01:02:10] + 
[01:02:10] + 
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`
[01:02:10] +   --> $DIR/simd-intrinsic-generic-bitmask.rs:72:22
[01:02:10] +    |
[01:02:10] + LL |         let _: u64 = simd_bitmask(m64);
[01:02:10] + 
[01:02:10] + 
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u2`
[01:02:10] 2   --> $DIR/simd-intrinsic-generic-bitmask.rs:74:22
[01:02:10] 3    |
[01:02:10] 4 LL |         let _: u16 = simd_bitmask(m2);
[01:02:10] 
[01:02:10] 10 LL |         let _: u16 = simd_bitmask(m8);
[01:02:10] 12 
[01:02:10] 12 
[01:02:10] - error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u16`
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`
[01:02:10] 14   --> $DIR/simd-intrinsic-generic-bitmask.rs:80:22
[01:02:10] 15    |
[01:02:10] 16 LL |         let _: u32 = simd_bitmask(m16);
[01:02:10] 17    |                      ^^^^^^^^^^^^^^^^^
[01:02:10] 18 
[01:02:10] 18 
[01:02:10] - error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u32`
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`
[01:02:10] 20   --> $DIR/simd-intrinsic-generic-bitmask.rs:83:22
[01:02:10] 21    |
[01:02:10] 22 LL |         let _: u64 = simd_bitmask(m32);
[01:02:10] 23    |                      ^^^^^^^^^^^^^^^^^
[01:02:10] 24 
[01:02:10] 24 
[01:02:10] - error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u128`, expected `u64`
[01:02:10] + error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u128`, expected `u8`
[01:02:10] 26   --> $DIR/simd-intrinsic-generic-bitmask.rs:86:23
[01:02:10] 27    |
[01:02:10] 28 LL |         let _: u128 = simd_bitmask(m64);
[01:02:10] 29    |                       ^^^^^^^^^^^^^^^^^
[01:02:10] 30 
[01:02:10] - error: aborting due to 5 previous errors
[01:02:10] + error: aborting due to 10 previous errors
[01:02:10] + error: aborting due to 10 previous errors
[01:02:10] 32 
[01:02:10] 33 For more information about this error, try `rustc --explain E0511`.
[01:02:10] 34 
[01:02:10] 
[01:02:10] 
[01:02:10] The actual stderr differed from the expected stderr.
[01:02:10] Actual stderr saved to /checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask/simd-intrinsic-generic-bitmask.stderr
[01:02:10] To update references, rerun the tests and pass the `--bless` flag
[01:02:10] To only update this specific test, also pass `--test-args simd-intrinsic/simd-intrinsic-generic-bitmask.rs`
[01:02:10] error: 1 errors occurred comparing output.
[01:02:10] status: exit code: 1
[01:02:10] status: exit code: 1
[01:02:10] command: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs" "--target=x86_64-unknown-linux-gnu" "--error-format" "json" "-Zui-testing" "-C" "prefer-dynamic" "-o" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask/a" "-Crpath" "-O" "-Zunstable-options" "-Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "-L" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask/auxiliary" "-A" "unused"
[01:02:10] ------------------------------------------
[01:02:10] 
[01:02:10] ------------------------------------------
[01:02:10] stderr:
[01:02:10] stderr:
[01:02:10] ------------------------------------------
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u2`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2272,"byte_end":2288,"line_start":67,"line_end":67,"column_start":21,"column_end":37,"is_primary":true,"text":[{"text":"        let _: u8 = simd_bitmask(m2);","highlight_start":21,"highlight_end":37}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u2`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:67:21\n   |\nLL |         let _: u8 = simd_bitmask(m2);\n   |                     ^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u4`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2310,"byte_end":2326,"line_start":68,"line_end":68,"column_start":21,"column_end":37,"is_primary":true,"text":[{"text":"        let _: u8 = simd_bitmask(m4);","highlight_start":21,"highlight_end":37}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u8`, expected `u4`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:68:21\n   |\nLL |         let _: u8 = simd_bitmask(m4);\n   |                     ^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2387,"byte_end":2404,"line_start":70,"line_end":70,"column_start":22,"column_end":39,"is_primary":true,"text":[{"text":"        let _: u16 = simd_bitmask(m16);","highlight_start":22,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:70:22\n   |\nLL |         let _: u16 = simd_bitmask(m16);\n   |                      ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2427,"byte_end":2444,"line_start":71,"line_end":71,"column_start":22,"column_end":39,"is_primary":true,"text":[{"text":"        let _: u32 = simd_bitmask(m32);","highlight_start":22,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:71:22\n   |\nLL |         let _: u32 = simd_bitmask(m32);\n   |                      ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2467,"byte_end":2484,"line_start":72,"line_end":72,"column_start":22,"column_end":39,"is_primary":true,"text":[{"text":"        let _: u64 = simd_bitmask(m64);","highlight_start":22,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:72:22\n   |\nLL |         let _: u64 = simd_bitmask(m64);\n   |                      ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u2`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2508,"byte_end":2524,"line_start":74,"line_end":74,"column_start":22,"column_end":38,"is_primary":true,"text":[{"text":"        let _: u16 = simd_bitmask(m2);","highlight_start":22,"highlight_end":38}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u2`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:74:22\n   |\nLL |         let _: u16 = simd_bitmask(m2);\n   |                      ^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2596,"byte_end":2612,"line_start":77,"line_end":77,"column_start":22,"column_end":38,"is_primary":true,"text":[{"text":"        let _: u16 = simd_bitmask(m8);","highlight_start":22,"highlight_end":38}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u16`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:77:22\n   |\nLL |         let _: u16 = simd_bitmask(m8);\n   |                      ^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2684,"byte_end":2701,"line_start":80,"line_end":80,"column_start":22,"column_end":39,"is_primary":true,"text":[{"text":"        let _: u32 = simd_bitmask(m16);","highlight_start":22,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u32`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:80:22\n   |\nLL |         let _: u32 = simd_bitmask(m16);\n   |                      ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2774,"byte_end":2791,"line_start":83,"line_end":83,"column_start":22,"column_end":39,"is_primary":true,"text":[{"text":"        let _: u64 = simd_bitmask(m32);","highlight_start":22,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u64`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:83:22\n   |\nLL |         let _: u64 = simd_bitmask(m32);\n   |                      ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u128`, expected `u8`","code":{"code":"E0511","explanation":null},"level":"error","spans":[{"file_name":"/checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs","byte_start":2865,"byte_end":2882,"line_start":86,"line_end":86,"column_start":23,"column_end":40,"is_primary":true,"text":[{"text":"        let _: u128 = simd_bitmask(m64);","highlight_start":23,"highlight_end":40}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: bitmask `u128`, expected `u8`\n  --> /checkout/src/test/ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs:86:23\n   |\nLL |         let _: u128 = simd_bitmask(m64);\n   |                       ^^^^^^^^^^^^^^^^^\n\n"}
[01:02:10] {"message":"aborting due to 10 previous errors","code":null,"level":"error","spans":[],"children":[],"rendered":"error: aborting due to 10 previous errors\n\n"}
[01:02:10] {"message":"For more information about this error, try `rustc --explain E0511`.","code":null,"level":"","spans":[],"children":[],"rendered":"For more information about this error, try `rustc --explain E0511`.\n"}
[01:02:10] ------------------------------------------
[01:02:10] 
[01:02:10] thread '[ui] ui/simd-intrinsic/simd-intrinsic-generic-bitmask.rs' panicked at 'explicit panic', src/tools/compiletest/src/runtest.rs:3245:9
[01:02:10] 
---
[01:02:10] 
[01:02:10] thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:495:22
[01:02:10] 
[01:02:10] 
[01:02:10] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "--compile-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib" "--run-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--rustc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "--src-base" "/checkout/src/test/ui" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/ui" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "ui" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/usr/lib/llvm-6.0/bin/FileCheck" "--host-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--target-rustcflags" "-Crpath -O -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--docck-python" "/usr/bin/python2.7" "--lldb-python" "/usr/bin/python2.7" "--gdb" "/usr/bin/gdb" "--quiet" "--llvm-version" "6.0.0\n" "--system-llvm" "--cc" "" "--cxx" "" "--cflags" "" "--llvm-components" "" "--llvm-cxxflags" "" "--adb-path" "adb" "--adb-test-dir" "/data/tmp/work" "--android-cross-path" "" "--color" "always"
[01:02:10] 
[01:02:10] 
[01:02:10] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:02:10] Build completed unsuccessfully in 0:04:06
[01:02:10] Build completed unsuccessfully in 0:04:06
[01:02:10] Makefile:48: recipe for target 'check' failed
[01:02:10] make: *** [check] Error 1
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:25a3320e
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Thu Jan  3 10:30:13 UTC 2019
---
travis_time:end:0eb961d3:start=1546511414220776297,finish=1546511414231680324,duration=10904027
travis_fold:end:after_failure.4
travis_fold:start:after_failure.5
travis_time:start:287eda60
$ cat ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers || true
cat: ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers: No such file or directory
travis_fold:end:after_failure.5
travis_fold:start:after_failure.6
travis_time:start:071cbf86
$ dmesg | grep -i kill

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@alexcrichton
Copy link
Member

Seems reasonable to me!

@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 3, 2019

I forgot to mention it in the PR description, but the reason we need an intrinsics for this is that we have to truncate the vector lanes to an <i1 x N> vector, and then bitcast that to an iN integer (while making sure that we only materialize i8, .., i64 - that is, no i2 types), and we can't do any of that in a Rust library.

I've amended the PR message with this.

Copy link
Contributor

@hanna-kruppe hanna-kruppe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LTGM in principle, but I'd prefer to not support float vectors. Also some nits about the implementation and tests.

src/librustc_codegen_llvm/intrinsic.rs Outdated Show resolved Hide resolved
src/librustc_codegen_llvm/intrinsic.rs Outdated Show resolved Hide resolved
src/librustc_codegen_llvm/intrinsic.rs Outdated Show resolved Hide resolved
src/test/codegen/simd-intrinsic-generic-bitmask.rs Outdated Show resolved Hide resolved
@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-llvm-6.0 of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
travis_time:end:12da264c:start=1547547072001278578,finish=1547547165887040332,duration=93885761754
$ git checkout -qf FETCH_HEAD
travis_fold:end:git.checkout

Encrypted environment variables have been removed for security reasons.
See https://docs.travis-ci.com/user/pull-requests/#pull-requests-and-security-restrictions
$ export SCCACHE_BUCKET=rust-lang-ci-sccache2
$ export SCCACHE_REGION=us-west-1
Setting environment variables from .travis.yml
$ export IMAGE=x86_64-gnu-llvm-6.0
---

[00:03:19] travis_fold:start:tidy
travis_time:start:tidy
tidy check
[00:03:20] tidy error: /checkout/src/test/codegen/simd-intrinsic-generic-bitmask.rs:66: line longer than 100 chars
[00:03:20] tidy error: /checkout/src/librustc_codegen_llvm/intrinsic.rs:1327: line longer than 100 chars
[00:03:20] tidy error: /checkout/src/librustc_codegen_llvm/intrinsic.rs:1331: line longer than 100 chars
[00:03:21] some tidy checks failed
[00:03:21] 
[00:03:21] 
[00:03:21] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/tidy" "/checkout/src" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0/bin/cargo" "--no-vendor" "--quiet"
[00:03:21] 
[00:03:21] 
[00:03:21] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test src/tools/tidy
[00:03:21] Build completed unsuccessfully in 0:00:46
[00:03:21] Build completed unsuccessfully in 0:00:46
[00:03:21] Makefile:69: recipe for target 'tidy' failed
[00:03:21] make: *** [tidy] Error 1
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:0973f134
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Tue Jan 15 10:16:17 UTC 2019
---
travis_time:end:0eca6fa2:start=1547547378308180806,finish=1547547378313665272,duration=5484466
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:19ebf646
$ ln -s . checkout && for CORE in obj/cores/core.*; do EXE=$(echo $CORE | sed 's|obj/cores/core\.[0-9]*\.!checkout!\(.*\)|\1|;y|!|/|'); if [ -f "$EXE" ]; then printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" "$CORE"; gdb --batch -q -c "$CORE" "$EXE" -iex 'set auto-load off' -iex 'dir src/' -iex 'set sysroot .' -ex bt -ex q; echo travis_fold":"end:crashlog; fi; done || true
travis_fold:end:after_failure.4
travis_fold:start:after_failure.5
travis_time:start:01436d1e
travis_time:start:01436d1e
$ cat ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers || true
cat: ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers: No such file or directory
travis_fold:end:after_failure.5
travis_fold:start:after_failure.6
travis_time:start:107736c2
$ dmesg | grep -i kill

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

Copy link
Contributor

@hanna-kruppe hanna-kruppe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I said I'd still prefer to drop support for float elements, plus a style nit. You can also squash the commits if you don't mind.

src/librustc_codegen_llvm/intrinsic.rs Outdated Show resolved Hide resolved
@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 15, 2019

I've squashed the commits and hopefully fixed the last issues.

@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 21, 2019

@rkruppe this is awaiting your review :)

@hanna-kruppe
Copy link
Contributor

LGTM, sorry for the delay!

@bors r+

@bors
Copy link
Contributor

bors commented Jan 21, 2019

📌 Commit 322a51e216112192d94db949b0fb63be1447cdb4 has been approved by rkruppe

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jan 21, 2019
@bors
Copy link
Contributor

bors commented Jan 21, 2019

⌛ Testing commit 322a51e216112192d94db949b0fb63be1447cdb4 with merge 9ab79f87654feb32c90ba29073ccdbfbe0572f61...

@bors
Copy link
Contributor

bors commented Jan 21, 2019

💔 Test failed - checks-travis

@bors bors added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Jan 21, 2019
@rust-highfive
Copy link
Collaborator

The job x86_64-gnu-nopt of your PR failed on Travis (raw log). Through arcane magic we have determined that the following fragments from the build log may contain information about the problem.

Click to expand the log.
[01:38:10] failures:
[01:38:10] 
[01:38:10] ---- [codegen] codegen/simd-intrinsic-generic-bitmask.rs stdout ----
[01:38:10] 
[01:38:10] error: verification with 'FileCheck' failed
[01:38:10] status: exit code: 1
[01:38:10] command: "/checkout/obj/build/x86_64-unknown-linux-gnu/llvm/build/bin/FileCheck" "--input-file" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/simd-intrinsic-generic-bitmask/simd-intrinsic-generic-bitmask.ll" "/checkout/src/test/codegen/simd-intrinsic-generic-bitmask.rs"
[01:38:10] ------------------------------------------
[01:38:10] 
[01:38:10] ------------------------------------------
[01:38:10] stderr:
[01:38:10] stderr:
[01:38:10] ------------------------------------------
[01:38:10] /checkout/src/test/codegen/simd-intrinsic-generic-bitmask.rs:52:12: error: CHECK: expected string not found in input
[01:38:10]  // CHECK: %2 = lshr <16 x i8> %0, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
[01:38:10]            ^
[01:38:10] /checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/simd-intrinsic-generic-bitmask/simd-intrinsic-generic-bitmask.ll:41:26: note: scanning from here
[01:38:10] define i16 @bitmask_int16(<16 x i8>* noalias nocapture dereferenceable(16) %x) unnamed_addr #0 {
[01:38:10]                          ^
[01:38:10] /checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen/simd-intrinsic-generic-bitmask/simd-intrinsic-generic-bitmask.ll:45:2: note: possible intended match here
[01:38:10]  %1 = lshr <16 x i8> %0, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
[01:38:10] 
[01:38:10] ------------------------------------------
[01:38:10] 
[01:38:10] thread '[codegen] codegen/simd-intrinsic-generic-bitmask.rs' panicked at 'explicit panic', src/tools/compiletest/src/runtest.rs:3245:9
---
[01:38:10] test result: FAILED. 108 passed; 1 failed; 14 ignored; 0 measured; 0 filtered out
[01:38:10] 
[01:38:10] 
[01:38:10] 
[01:38:10] command did not execute successfully: "/checkout/obj/build/x86_64-unknown-linux-gnu/stage0-tools-bin/compiletest" "--compile-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib" "--run-lib-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/x86_64-unknown-linux-gnu/lib" "--rustc-path" "/checkout/obj/build/x86_64-unknown-linux-gnu/stage2/bin/rustc" "--src-base" "/checkout/src/test/codegen" "--build-base" "/checkout/obj/build/x86_64-unknown-linux-gnu/test/codegen" "--stage-id" "stage2-x86_64-unknown-linux-gnu" "--mode" "codegen" "--target" "x86_64-unknown-linux-gnu" "--host" "x86_64-unknown-linux-gnu" "--llvm-filecheck" "/checkout/obj/build/x86_64-unknown-linux-gnu/llvm/build/bin/FileCheck" "--host-rustcflags" "-Crpath -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--target-rustcflags" "-Crpath -Zunstable-options  -Lnative=/checkout/obj/build/x86_64-unknown-linux-gnu/native/rust-test-helpers" "--docck-python" "/usr/bin/python2.7" "--lldb-python" "/usr/bin/python2.7" "--gdb" "/usr/bin/gdb" "--llvm-version" "8.0.0svn\n" "--cc" "" "--cxx" "" "--cflags" "" "--llvm-components" "" "--llvm-cxxflags" "" "--adb-path" "adb" "--adb-test-dir" "/data/tmp/work" "--android-cross-path" "" "--color" "always"
[01:38:10] 
[01:38:10] 
[01:38:10] thread 'main' panicked at 'Some tests failed', src/tools/compiletest/src/main.rs:495:22
[01:38:10] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:38:10] failed to run: /checkout/obj/build/bootstrap/debug/bootstrap test
[01:38:10] Build completed unsuccessfully in 0:19:51
[01:38:10] Makefile:48: recipe for target 'check' failed
[01:38:10] make: *** [check] Error 1
The command "stamp sh -x -c "$RUN_SCRIPT"" exited with 2.
travis_time:start:0dca2350
$ date && (curl -fs --head https://google.com | grep ^Date: | sed 's/Date: //g' || true)
Mon Jan 21 23:08:02 UTC 2019
---
travis_time:end:0c0a6b8a:start=1548112084471790077,finish=1548112084496113427,duration=24323350
travis_fold:end:after_failure.3
travis_fold:start:after_failure.4
travis_time:start:1510246d
$ ln -s . checkout && for CORE in obj/cores/core.*; do EXE=$(echo $CORE | sed 's|obj/cores/core\.[0-9]*\.!checkout!\(.*\)|\1|;y|!|/|'); if [ -f "$EXE" ]; then printf travis_fold":start:crashlog\n\033[31;1m%s\033[0m\n" "$CORE"; gdb --batch -q -c "$CORE" "$EXE" -iex 'set auto-load off' -iex 'dir src/' -iex 'set sysroot .' -ex bt -ex q; echo travis_fold":"end:crashlog; fi; done || true
travis_fold:end:after_failure.4
travis_fold:start:after_failure.5
travis_time:start:23515a9f
travis_time:start:23515a9f
$ cat ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers || true
cat: ./obj/build/x86_64-unknown-linux-gnu/native/asan/build/lib/asan/clang_rt.asan-dynamic-i386.vers: No such file or directory
travis_fold:end:after_failure.5
travis_fold:start:after_failure.6
travis_time:start:009b88a8
$ dmesg | grep -i kill

I'm a bot! I can only do what humans tell me to, so if this was not helpful or you have suggestions for improvements, please ping or otherwise contact @TimNN. (Feature Requests)

@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 22, 2019

So instead of hardcoding the LLVM identifiers (e.g. %0) I changed the codegen test to accept any of them (e.g. %{{[0-9]+}}). We'll see if that works.

@hanna-kruppe
Copy link
Contributor

That should do it, but please use variables to test that the values are actually used as expected.

@gnzlbg
Copy link
Contributor Author

gnzlbg commented Jan 22, 2019

@rkruppe I've done that, cool, I didn't knew about this. That document is really helpful.

@hanna-kruppe
Copy link
Contributor

r=me when travis passes

@hanna-kruppe
Copy link
Contributor

@bors r+

@bors
Copy link
Contributor

bors commented Jan 24, 2019

📌 Commit 785f529 has been approved by rkruppe

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jan 24, 2019
@bors
Copy link
Contributor

bors commented Jan 24, 2019

⌛ Testing commit 785f529 with merge 095b44c...

bors added a commit that referenced this pull request Jan 24, 2019
Add intrinsic to create an integer bitmask from a vector mask

This PR adds a new simd intrinsic: `simd_bitmask(vector) -> unsigned integer` that creates an integer bitmask from a vector mask by extracting one bit of each vector lane.

This is required to implement: rust-lang/packed_simd#166 .

EDIT: the reason we need an intrinsics for this is that we have to truncate the vector lanes to an `<i1 x N>` vector, and then bitcast that to an `iN` integer (while making sure that we only materialize `i8`, ... , `i64` - that is, no `i1`, `i2`, `i4`, types), and we can't do any of that in a Rust library.

r? @rkruppe
@bors
Copy link
Contributor

bors commented Jan 24, 2019

☀️ Test successful - checks-travis, status-appveyor
Approved by: rkruppe
Pushing 095b44c to master...

@bors
Copy link
Contributor

bors commented Jan 24, 2019

☀️ Test successful - checks-travis, status-appveyor
Approved by: rkruppe
Pushing 095b44c to master...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants