[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