[PATCH] D72396: [InstCombine] fold zext of masked bit set/clear
Krasimir Georgiev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 8 08:37:24 PST 2020
krasimir added a comment.
The original code seems ubsan-clean.
Reproducer:
===========
Running under x86_64.
steps
=====
$ clang -lsdc++ -O3 main.cpp
$ ./a.out < input.txt
main.cpp
========
// main.cpp
#include <cstdint>
#include <cstdio>
int f(uint32_t* olds, const uint32_t* news, uint32_t mask, size_t count) {
size_t i;
uint32_t n = 0;
for (i = 0; i < count; i++) {
n += (news[i] != olds[i] || (mask & (1u << i)) != 0);
}
return n;
}
int main() {
size_t count;
uint32_t mask;
scanf("%zu %u", &count, &mask);
printf("count: %zu\n", count);
printf("mask: %u\n", mask);
uint32_t* olds = new uint32_t[count];
uint32_t* news = new uint32_t[count];
for (int i = 0; i < count; ++i) {
scanf("%u", olds + i);
}
for (int i = 0; i < count; ++i) {
scanf("%u", news + i);
}
printf("olds: ");
for (int i = 0; i < count; ++i) {
printf("%u ", olds[i]);
}
printf("\n");
printf("news: ");
for (int i = 0; i < count; ++i) {
printf("%u ", news[i]);
}
printf("\n");
printf("\n\nn:%d\n", f(olds, news, mask, count));
}
input.txt
=========
7 8
4096 1 4294967295 65535 16384 16777216 0
4096 0 0 4194304 4194304 8192 1
Expected output (without this patch):
=====================================
count: 7
mask: 8
olds: 4096 1 4294967295 65535 16384 16777216 0
news: 4096 0 0 4194304 4194304 8192 1
n:6
Output with this patch:
=======================
(with clang built at revision 903e5c3028d <https://reviews.llvm.org/rG903e5c3028d61481c570c09eeb5e7a920c2d7d38>)
count: 7
mask: 8
olds: 4096 1 4294967295 65535 16384 16777216 0
news: 4096 0 0 4194304 4194304 8192 1
n:1
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D72396/new/
https://reviews.llvm.org/D72396
More information about the llvm-commits
mailing list