[PATCH] D46336: [InstCombine] Apply binary operator simplifications to associative/commutative cases.

Hiroshi Yamauchi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 9 10:08:46 PDT 2018


yamauchi added a comment.

Here's a comparison with https://reviews.llvm.org/D45842 for the 4th test @bit-check-combine-256 (which I understand is a long one, I'll try to see if I can reduce this.)

After -instcombine with this patch

  define i1 @bit-check-combine-256(i32* %bits0, i32* %bits1, i32* %bits2, i32* %bits3, i32* %bits4, i32* %bits5, i32* %bits6, i32* %bits7) {
  entry:
    %0 = load i32, i32* %bits0, align 4
    %1 = icmp eq i32 %0, -2145382392
    %2 = load i32, i32* %bits1, align 4
    %3 = load i32, i32* %bits2, align 4
    %4 = load i32, i32* %bits3, align 4
    %5 = or i32 %3, %4
    %6 = and i32 %5, 2147483647
    %7 = or i32 %2, %6
    %8 = or i32 %3, %4
    %9 = and i32 %8, -2147483648
    %10 = or i32 %9, %7
    %11 = load i32, i32* %bits4, align 4
    %12 = load i32, i32* %bits5, align 4
    %13 = or i32 %11, %12
    %14 = and i32 %13, 2147483647
    %15 = or i32 %10, %14
    %16 = or i32 %11, %12
    %17 = and i32 %16, -2147483648
    %18 = or i32 %17, %15
    %19 = load i32, i32* %bits6, align 4
    %20 = load i32, i32* %bits7, align 4
    %21 = or i32 %19, %20
    %22 = and i32 %21, 2147483647
    %23 = or i32 %18, %22
    %24 = or i32 %19, %20
    %25 = and i32 %24, -2147483648
    %26 = or i32 %25, %23
    %27 = icmp eq i32 %26, 0
    %28 = and i1 %27, %1
    ret i1 %28
  }

After -instcombine -reassociate -instcombine -reassociate -instcombine with https://reviews.llvm.org/D45842

  define i1 @bit-check-combine-256(i32* %bits0, i32* %bits1, i32* %bits2, i32* %bits3, i32* %bits4, i32* %bits5, i32* %bits6, i32* %bits7) {
  entry:
    %0 = load i32, i32* %bits0, align 4
    %1 = icmp eq i32 %0, -2145382392
    %2 = load i32, i32* %bits1, align 4
    %3 = load i32, i32* %bits2, align 4
    %and.i3199 = and i32 %3, 1
    %and.i3201 = and i32 %3, 2
    %and.i3203 = and i32 %3, 4
    %and.i3205 = and i32 %3, 8
    %and.i3207 = and i32 %3, 16
    %and.i3209 = and i32 %3, 32
    %and.i3211 = and i32 %3, 64
    %4 = and i32 %3, 384
    %and.i3216 = and i32 %3, 512
    %and.i3218 = and i32 %3, 1024
    %and.i3220 = and i32 %3, 2048
    %and.i3222 = and i32 %3, 4096
    %and.i3224 = and i32 %3, 8192
    %and.i3226 = and i32 %3, 16384
    %5 = and i32 %3, 98304
    %and.i3231 = and i32 %3, 131072
    %and.i3233 = and i32 %3, 262144
    %and.i3235 = and i32 %3, 524288
    %and.i3237 = and i32 %3, 1048576
    %and.i3239 = and i32 %3, 2097152
    %and.i3241 = and i32 %3, 4194304
    %and.i3243 = and i32 %3, 8388608
    %and.i3249 = and i32 %3, 67108864
    %and.i3255 = and i32 %3, 536870912
    %and.i3257 = and i32 %3, 1073741824
    %6 = and i32 %3, 402653184
    %7 = or i32 %6, %2
    %8 = or i32 %7, %and.i3249
    %9 = or i32 %8, %and.i3257
    %10 = or i32 %9, %and.i3255
    %11 = or i32 %10, %and.i3199
    %12 = or i32 %11, %and.i3201
    %13 = or i32 %12, %and.i3203
    %14 = or i32 %13, %and.i3205
    %15 = or i32 %14, %and.i3207
    %16 = or i32 %15, %and.i3209
    %17 = or i32 %16, %and.i3211
    %18 = or i32 %17, %4
    %19 = or i32 %18, %and.i3216
    %20 = or i32 %19, %and.i3218
    %21 = or i32 %20, %and.i3220
    %22 = or i32 %21, %and.i3222
    %23 = or i32 %22, %and.i3224
    %24 = or i32 %23, %and.i3226
    %25 = or i32 %24, %5
    %26 = or i32 %25, %and.i3231
    %27 = or i32 %26, %and.i3233
    %28 = or i32 %27, %and.i3235
    %29 = or i32 %28, %and.i3237
    %30 = or i32 %29, %and.i3239
    %31 = or i32 %30, %and.i3241
    %32 = or i32 %31, %and.i3243
    %33 = and i32 %3, 50331648
    %34 = or i32 %33, %32
    %35 = icmp eq i32 %34, 0
    %36 = and i1 %1, %35
    %cmp.i3259 = icmp sgt i32 %3, -1
    %and3752918 = and i1 %cmp.i3259, %36
    %37 = load i32, i32* %bits3, align 4
    %38 = load i32, i32* %bits4, align 4
    %and.i3321 = and i32 %38, 1
    %and.i3323 = and i32 %38, 2
    %and.i3325 = and i32 %38, 4
    %and.i3327 = and i32 %38, 8
    %and.i3329 = and i32 %38, 16
    %and.i3331 = and i32 %38, 32
    %and.i3333 = and i32 %38, 64
    %39 = and i32 %38, 384
    %and.i3338 = and i32 %38, 512
    %and.i3340 = and i32 %38, 1024
    %and.i3342 = and i32 %38, 2048
    %and.i3344 = and i32 %38, 4096
    %and.i3346 = and i32 %38, 8192
    %and.i3348 = and i32 %38, 16384
    %40 = and i32 %38, 98304
    %and.i3353 = and i32 %38, 131072
    %and.i3355 = and i32 %38, 262144
    %and.i3357 = and i32 %38, 524288
    %and.i3359 = and i32 %38, 1048576
    %and.i3361 = and i32 %38, 2097152
    %and.i3363 = and i32 %38, 4194304
    %and.i3365 = and i32 %38, 8388608
    %and.i3371 = and i32 %38, 67108864
    %and.i3377 = and i32 %38, 536870912
    %and.i3379 = and i32 %38, 1073741824
    %41 = and i32 %38, 402653184
    %42 = or i32 %41, %37
    %43 = or i32 %42, %and.i3371
    %44 = or i32 %43, %and.i3379
    %45 = or i32 %44, %and.i3377
    %46 = or i32 %45, %and.i3321
    %47 = or i32 %46, %and.i3323
    %48 = or i32 %47, %and.i3325
    %49 = or i32 %48, %and.i3327
    %50 = or i32 %49, %and.i3329
    %51 = or i32 %50, %and.i3331
    %52 = or i32 %51, %and.i3333
    %53 = or i32 %52, %39
    %54 = or i32 %53, %and.i3338
    %55 = or i32 %54, %and.i3340
    %56 = or i32 %55, %and.i3342
    %57 = or i32 %56, %and.i3344
    %58 = or i32 %57, %and.i3346
    %59 = or i32 %58, %and.i3348
    %60 = or i32 %59, %40
    %61 = or i32 %60, %and.i3353
    %62 = or i32 %61, %and.i3355
    %63 = or i32 %62, %and.i3357
    %64 = or i32 %63, %and.i3359
    %65 = or i32 %64, %and.i3361
    %66 = or i32 %65, %and.i3363
    %67 = or i32 %66, %and.i3365
    %68 = and i32 %38, 50331648
    %69 = or i32 %68, %67
    %70 = icmp eq i32 %69, 0
    %71 = and i1 %70, %and3752918
    %cmp.i3381 = icmp sgt i32 %38, -1
    %and6312982 = and i1 %cmp.i3381, %71
    %72 = load i32, i32* %bits5, align 4
    %73 = load i32, i32* %bits6, align 4
    %and.i3443 = and i32 %73, 1
    %and.i3445 = and i32 %73, 2
    %and.i3447 = and i32 %73, 4
    %and.i3449 = and i32 %73, 8
    %and.i3451 = and i32 %73, 16
    %and.i3453 = and i32 %73, 32
    %and.i3455 = and i32 %73, 64
    %74 = and i32 %73, 384
    %and.i3460 = and i32 %73, 512
    %and.i3462 = and i32 %73, 1024
    %and.i3464 = and i32 %73, 2048
    %and.i3466 = and i32 %73, 4096
    %and.i3468 = and i32 %73, 8192
    %and.i3470 = and i32 %73, 16384
    %75 = and i32 %73, 98304
    %and.i3475 = and i32 %73, 131072
    %and.i3477 = and i32 %73, 262144
    %and.i3479 = and i32 %73, 524288
    %and.i3481 = and i32 %73, 1048576
    %and.i3483 = and i32 %73, 2097152
    %and.i3485 = and i32 %73, 4194304
    %and.i3487 = and i32 %73, 8388608
    %and.i3493 = and i32 %73, 67108864
    %and.i3499 = and i32 %73, 536870912
    %and.i3501 = and i32 %73, 1073741824
    %76 = and i32 %73, 402653184
    %77 = or i32 %76, %72
    %78 = or i32 %77, %and.i3493
    %79 = or i32 %78, %and.i3501
    %80 = or i32 %79, %and.i3499
    %81 = or i32 %80, %and.i3443
    %82 = or i32 %81, %and.i3445
    %83 = or i32 %82, %and.i3447
    %84 = or i32 %83, %and.i3449
    %85 = or i32 %84, %and.i3451
    %86 = or i32 %85, %and.i3453
    %87 = or i32 %86, %and.i3455
    %88 = or i32 %87, %74
    %89 = or i32 %88, %and.i3460
    %90 = or i32 %89, %and.i3462
    %91 = or i32 %90, %and.i3464
    %92 = or i32 %91, %and.i3466
    %93 = or i32 %92, %and.i3468
    %94 = or i32 %93, %and.i3470
    %95 = or i32 %94, %75
    %96 = or i32 %95, %and.i3475
    %97 = or i32 %96, %and.i3477
    %98 = or i32 %97, %and.i3479
    %99 = or i32 %98, %and.i3481
    %100 = or i32 %99, %and.i3483
    %101 = or i32 %100, %and.i3485
    %102 = or i32 %101, %and.i3487
    %103 = and i32 %73, 50331648
    %104 = or i32 %103, %102
    %105 = icmp eq i32 %104, 0
    %106 = and i1 %105, %and6312982
    %cmp.i3503 = icmp sgt i32 %73, -1
    %and8873046 = and i1 %cmp.i3503, %106
    %107 = load i32, i32* %bits7, align 4
    %108 = icmp eq i32 %107, 0
    %109 = and i1 %108, %and8873046
    ret i1 %109
  }


Repository:
  rL LLVM

https://reviews.llvm.org/D46336





More information about the llvm-commits mailing list