From 5c3c23afe77a2ce784b613af12cf9278c38fdcbf Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 8 Sep 2010 22:16:17 +0000 Subject: Generalize instcombine's support for combining multiple bit checks into a single test. Patch by Dirk Steinke! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113423 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/InstCombine/bit-checks.ll | 348 +++++++++++++++++++++++++++++- 1 file changed, 347 insertions(+), 1 deletion(-) (limited to 'test/Transforms/InstCombine/bit-checks.ll') diff --git a/test/Transforms/InstCombine/bit-checks.ll b/test/Transforms/InstCombine/bit-checks.ll index d774c0972d..79a096ff0f 100644 --- a/test/Transforms/InstCombine/bit-checks.ll +++ b/test/Transforms/InstCombine/bit-checks.ll @@ -23,4 +23,350 @@ entry: %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] ret i32 %storemerge -} \ No newline at end of file +} + +; tests to check combining (icmp eq (A & B), C) & (icmp eq (A & D), E) +; tests to check if (icmp eq (A & B), 0) is treated like (icmp eq (A & B), B) +; if B is a single bit constant + +; (icmp eq (A & B), 0) & (icmp eq (A & D), 0) -> (icmp eq (A & (B|D)), 0) +define i32 @main3(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 0 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main3b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 16 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main3e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp eq i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 0 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp ne (A & B), 0) | (icmp ne (A & D), 0) -> (icmp ne (A & (B|D)), 0) +define i32 @main3c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 0 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main3d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 16 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main3f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp ne i32 %and, 0 ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 0 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp eq (A & B), B) & (icmp eq (A & D), D) -> (icmp eq (A & (B|D)), (B|D)) +define i32 @main4(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 48 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main4b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 0 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main4e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp eq i32 %and, %argc2 ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, %argc3 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp ne (A & B), B) | (icmp ne (A & D), D) -> (icmp ne (A & (B|D)), (B|D)) +define i32 @main4c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 48 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main4d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 0 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main4f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp ne i32 %and, %argc2 ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, %argc3 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp eq (A & B), A) & (icmp eq (A & D), A) -> (icmp eq (A & (B&D)), A) +define i32 @main5_like(i32 %argc, i32 %argc2, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc2, 7 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 7 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main5e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp eq i32 %and, %argc ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, %argc ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp ne (A & B), A) | (icmp ne (A & D), A) -> (icmp ne (A & (B&D)), A) +define i32 @main5c_like(i32 %argc, i32 %argc2, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 7 ; [#uses=1] + %and2 = and i32 %argc2, 7 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 7 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main5f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp ne i32 %and, %argc ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, %argc ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp eq (A & B), C) & (icmp eq (A & D), E) -> (icmp eq (A & (B|D)), (C|E)) +; if B, C, D, E are constant, and it's possible +define i32 @main6(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 3 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 16 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main6b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp eq i32 %and, 3 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 0 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (icmp ne (A & B), C) | (icmp ne (A & D), E) -> (icmp ne (A & (B|D)), (C|E)) +; if B, C, D, E are constant, and it's possible +define i32 @main6c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 3 ; [#uses=1] + %and2 = and i32 %argc, 48 ; [#uses=1] + %tobool3 = icmp ne i32 %and2, 16 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +define i32 @main6d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp { +entry: + %and = and i32 %argc, 7 ; [#uses=1] + %tobool = icmp ne i32 %and, 3 ; [#uses=1] + %and2 = and i32 %argc, 16 ; [#uses=1] + %tobool3 = icmp eq i32 %and2, 0 ; [#uses=1] + %or.cond = or i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %or.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; test parameter permutations +; (B & A) == B & (D & A) == D +define i32 @main7a(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and1 = and i32 %argc2, %argc ; [#uses=1] + %tobool = icmp eq i32 %and1, %argc2 ; [#uses=1] + %and2 = and i32 %argc3, %argc ; [#uses=1] + %tobool3 = icmp eq i32 %and2, %argc3 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; B == (A & B) & D == (A & D) +define i32 @main7b(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and1 = and i32 %argc, %argc2 ; [#uses=1] + %tobool = icmp eq i32 %argc2, %and1 ; [#uses=1] + %and2 = and i32 %argc, %argc3 ; [#uses=1] + %tobool3 = icmp eq i32 %argc3, %and2 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; B == (B & A) & D == (D & A) +define i32 @main7c(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %and1 = and i32 %argc2, %argc ; [#uses=1] + %tobool = icmp eq i32 %argc2, %and1 ; [#uses=1] + %and2 = and i32 %argc3, %argc ; [#uses=1] + %tobool3 = icmp eq i32 %argc3, %and2 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (A & (B & C)) == (B & C) & (A & (D & E)) == (D & E) +define i32 @main7d(i32 %argc, i32 %argc2, i32 %argc3, + i32 %argc4, i32 %argc5, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %bc = and i32 %argc2, %argc4 ; [#uses=1] + %de = and i32 %argc3, %argc5 ; [#uses=1] + %and1 = and i32 %argc, %bc ; [#uses=1] + %tobool = icmp eq i32 %and1, %bc ; [#uses=1] + %and2 = and i32 %argc, %de ; [#uses=1] + %tobool3 = icmp eq i32 %and2, %de ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; ((B & C) & A) == (B & C) & ((D & E) & A) == (D & E) +define i32 @main7e(i32 %argc, i32 %argc2, i32 %argc3, + i32 %argc4, i32 %argc5, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %bc = and i32 %argc2, %argc4 ; [#uses=1] + %de = and i32 %argc3, %argc5 ; [#uses=1] + %and1 = and i32 %bc, %argc ; [#uses=1] + %tobool = icmp eq i32 %and1, %bc ; [#uses=1] + %and2 = and i32 %de, %argc ; [#uses=1] + %tobool3 = icmp eq i32 %and2, %de ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (B & C) == (A & (B & C)) & (D & E) == (A & (D & E)) +define i32 @main7f(i32 %argc, i32 %argc2, i32 %argc3, + i32 %argc4, i32 %argc5, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %bc = and i32 %argc2, %argc4 ; [#uses=1] + %de = and i32 %argc3, %argc5 ; [#uses=1] + %and1 = and i32 %argc, %bc ; [#uses=1] + %tobool = icmp eq i32 %bc, %and1 ; [#uses=1] + %and2 = and i32 %argc, %de ; [#uses=1] + %tobool3 = icmp eq i32 %de, %and2 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} + +; (B & C) == ((B & C) & A) & (D & E) == ((D & E) & A) +define i32 @main7g(i32 %argc, i32 %argc2, i32 %argc3, + i32 %argc4, i32 %argc5, i8** nocapture %argv) + nounwind readnone ssp { +entry: + %bc = and i32 %argc2, %argc4 ; [#uses=1] + %de = and i32 %argc3, %argc5 ; [#uses=1] + %and1 = and i32 %bc, %argc ; [#uses=1] + %tobool = icmp eq i32 %bc, %and1 ; [#uses=1] + %and2 = and i32 %de, %argc ; [#uses=1] + %tobool3 = icmp eq i32 %de, %and2 ; [#uses=1] + %and.cond = and i1 %tobool, %tobool3 ; [#uses=1] + %storemerge = select i1 %and.cond, i32 0, i32 1 ; [#uses=1] + ret i32 %storemerge +} -- cgit v1.2.3