[llvm] r343244 - [ScalarizeMaskedMemIntrin] Don't emit 'icmp eq i1 %x, 1' to check mask values. That's just %x so use that directly.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 27 11:01:48 PDT 2018


Author: ctopper
Date: Thu Sep 27 11:01:48 2018
New Revision: 343244

URL: http://llvm.org/viewvc/llvm-project?rev=343244&view=rev
Log:
[ScalarizeMaskedMemIntrin] Don't emit 'icmp eq i1 %x, 1' to check mask values. That's just %x so use that directly.

Had we emitted this IR earlier, InstCombine would have removed icmp so I'm going to assume using the i1 directly would be considered canonical.

Modified:
    llvm/trunk/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
    llvm/trunk/test/CodeGen/X86/masked_gather_scatter.ll
    llvm/trunk/test/CodeGen/X86/masked_gather_scatter_widen.ll
    llvm/trunk/test/CodeGen/X86/masked_memop.ll

Modified: llvm/trunk/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp?rev=343244&r1=343243&r2=343244&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp (original)
+++ llvm/trunk/lib/CodeGen/ScalarizeMaskedMemIntrin.cpp Thu Sep 27 11:01:48 2018
@@ -181,8 +181,7 @@ static void scalarizeMaskedLoad(CallInst
     //
     //  %res.phi.else3 = phi <16 x i32> [ %11, %cond.load1 ], [ %res.phi.else, %else ]
     //  %mask_1 = extractelement <16 x i1> %mask, i32 Idx
-    //  %to_load = icmp eq i1 %mask_1, true
-    //  br i1 %to_load, label %cond.load, label %else
+    //  br i1 %mask_1, label %cond.load, label %else
     //
     if (Idx > 0) {
       Phi = Builder.CreatePHI(VecType, 2, "res.phi.else");
@@ -194,8 +193,6 @@ static void scalarizeMaskedLoad(CallInst
 
     Value *Predicate =
         Builder.CreateExtractElement(Mask, Builder.getInt32(Idx));
-    Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Predicate,
-                                    ConstantInt::get(Predicate->getType(), 1));
 
     // Create "cond" block
     //
@@ -216,7 +213,7 @@ static void scalarizeMaskedLoad(CallInst
         CondBlock->splitBasicBlock(InsertPt->getIterator(), "else");
     Builder.SetInsertPoint(InsertPt);
     Instruction *OldBr = IfBlock->getTerminator();
-    BranchInst::Create(CondBlock, NewIfBlock, Cmp, OldBr);
+    BranchInst::Create(CondBlock, NewIfBlock, Predicate, OldBr);
     OldBr->eraseFromParent();
     PrevIfBlock = IfBlock;
     IfBlock = NewIfBlock;
@@ -311,13 +308,10 @@ static void scalarizeMaskedStore(CallIns
     // Fill the "else" block, created in the previous iteration
     //
     //  %mask_1 = extractelement <16 x i1> %mask, i32 Idx
-    //  %to_store = icmp eq i1 %mask_1, true
-    //  br i1 %to_store, label %cond.store, label %else
+    //  br i1 %mask_1, label %cond.store, label %else
     //
     Value *Predicate =
         Builder.CreateExtractElement(Mask, Builder.getInt32(Idx));
-    Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Predicate,
-                                    ConstantInt::get(Predicate->getType(), 1));
 
     // Create "cond" block
     //
@@ -339,7 +333,7 @@ static void scalarizeMaskedStore(CallIns
         CondBlock->splitBasicBlock(InsertPt->getIterator(), "else");
     Builder.SetInsertPoint(InsertPt);
     Instruction *OldBr = IfBlock->getTerminator();
-    BranchInst::Create(CondBlock, NewIfBlock, Cmp, OldBr);
+    BranchInst::Create(CondBlock, NewIfBlock, Predicate, OldBr);
     OldBr->eraseFromParent();
     IfBlock = NewIfBlock;
   }
@@ -430,8 +424,7 @@ static void scalarizeMaskedGather(CallIn
     // Fill the "else" block, created in the previous iteration
     //
     //  %Mask1 = extractelement <16 x i1> %Mask, i32 1
-    //  %ToLoad1 = icmp eq i1 %Mask1, true
-    //  br i1 %ToLoad1, label %cond.load, label %else
+    //  br i1 %Mask1, label %cond.load, label %else
     //
     if (Idx > 0) {
       Phi = Builder.CreatePHI(VecType, 2, "res.phi.else");
@@ -443,9 +436,6 @@ static void scalarizeMaskedGather(CallIn
 
     Value *Predicate = Builder.CreateExtractElement(Mask, Builder.getInt32(Idx),
                                                     "Mask" + Twine(Idx));
-    Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Predicate,
-                                    ConstantInt::get(Predicate->getType(), 1),
-                                    "ToLoad" + Twine(Idx));
 
     // Create "cond" block
     //
@@ -467,7 +457,7 @@ static void scalarizeMaskedGather(CallIn
     BasicBlock *NewIfBlock = CondBlock->splitBasicBlock(InsertPt, "else");
     Builder.SetInsertPoint(InsertPt);
     Instruction *OldBr = IfBlock->getTerminator();
-    BranchInst::Create(CondBlock, NewIfBlock, Cmp, OldBr);
+    BranchInst::Create(CondBlock, NewIfBlock, Predicate, OldBr);
     OldBr->eraseFromParent();
     PrevIfBlock = IfBlock;
     IfBlock = NewIfBlock;
@@ -549,15 +539,11 @@ static void scalarizeMaskedScatter(CallI
   for (unsigned Idx = 0; Idx < VectorWidth; ++Idx) {
     // Fill the "else" block, created in the previous iteration
     //
-    //  % Mask1 = extractelement <16 x i1> % Mask, i32 Idx
-    //  % ToStore = icmp eq i1 % Mask1, true
-    //  br i1 % ToStore, label %cond.store, label %else
+    //  %Mask1 = extractelement <16 x i1> %Mask, i32 Idx
+    //  br i1 %Mask1, label %cond.store, label %else
     //
     Value *Predicate = Builder.CreateExtractElement(Mask, Builder.getInt32(Idx),
                                                     "Mask" + Twine(Idx));
-    Value *Cmp = Builder.CreateICmp(ICmpInst::ICMP_EQ, Predicate,
-                                    ConstantInt::get(Predicate->getType(), 1),
-                                    "ToStore" + Twine(Idx));
 
     // Create "cond" block
     //
@@ -578,7 +564,7 @@ static void scalarizeMaskedScatter(CallI
     BasicBlock *NewIfBlock = CondBlock->splitBasicBlock(InsertPt, "else");
     Builder.SetInsertPoint(InsertPt);
     Instruction *OldBr = IfBlock->getTerminator();
-    BranchInst::Create(CondBlock, NewIfBlock, Cmp, OldBr);
+    BranchInst::Create(CondBlock, NewIfBlock, Predicate, OldBr);
     OldBr->eraseFromParent();
     IfBlock = NewIfBlock;
   }

Modified: llvm/trunk/test/CodeGen/X86/masked_gather_scatter.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/masked_gather_scatter.ll?rev=343244&r1=343243&r2=343244&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/masked_gather_scatter.ll (original)
+++ llvm/trunk/test/CodeGen/X86/masked_gather_scatter.ll Thu Sep 27 11:01:48 2018
@@ -70,8 +70,7 @@ declare <8 x i32> @llvm.masked.gather.v8
 ; SCALAR: else:
 ; SCALAR-NEXT:  %res.phi.else = phi
 ; SCALAR-NEXT:  %Mask1 = extractelement <16 x i1> %imask, i32 1
-; SCALAR-NEXT:  %ToLoad1 = icmp eq i1 %Mask1, true
-; SCALAR-NEXT:  br i1 %ToLoad1, label %cond.load1, label %else2
+; SCALAR-NEXT:  br i1 %Mask1, label %cond.load1, label %else2
 
 define <16 x float> @test2(float* %base, <16 x i32> %ind, i16 %mask) {
 ; KNL_64-LABEL: test2:
@@ -213,8 +212,7 @@ define <16 x i32> @test4(i32* %base, <16
 
 ; SCALAR-LABEL: test5
 ; SCALAR:        %Mask0 = extractelement <16 x i1> %imask, i32 0
-; SCALAR-NEXT:   %ToStore0 = icmp eq i1 %Mask0, true
-; SCALAR-NEXT:   br i1 %ToStore0, label %cond.store, label %else
+; SCALAR-NEXT:   br i1 %Mask0, label %cond.store, label %else
 ; SCALAR: cond.store:
 ; SCALAR-NEXT:  %Elt0 = extractelement <16 x i32> %val, i32 0
 ; SCALAR-NEXT:  %Ptr0 = extractelement <16 x i32*> %gep.random, i32 0
@@ -222,8 +220,7 @@ define <16 x i32> @test4(i32* %base, <16
 ; SCALAR-NEXT:  br label %else
 ; SCALAR: else:
 ; SCALAR-NEXT: %Mask1 = extractelement <16 x i1> %imask, i32 1
-; SCALAR-NEXT:  %ToStore1 = icmp eq i1 %Mask1, true
-; SCALAR-NEXT:  br i1 %ToStore1, label %cond.store1, label %else2
+; SCALAR-NEXT:  br i1 %Mask1, label %cond.store1, label %else2
 
 define void @test5(i32* %base, <16 x i32> %ind, i16 %mask, <16 x i32>%val) {
 ; KNL_64-LABEL: test5:
@@ -2448,45 +2445,41 @@ define void @v1_scatter(<1 x i32>%a1, <1
 ; KNL_64-LABEL: v1_scatter:
 ; KNL_64:       # %bb.0:
 ; KNL_64-NEXT:    testb $1, %dl
-; KNL_64-NEXT:    jne .LBB43_1
-; KNL_64-NEXT:  # %bb.2: # %else
-; KNL_64-NEXT:    retq
-; KNL_64-NEXT:  .LBB43_1: # %cond.store
+; KNL_64-NEXT:    je .LBB43_2
+; KNL_64-NEXT:  # %bb.1: # %cond.store
 ; KNL_64-NEXT:    movl %edi, (%rsi)
+; KNL_64-NEXT:  .LBB43_2: # %else
 ; KNL_64-NEXT:    retq
 ;
 ; KNL_32-LABEL: v1_scatter:
 ; KNL_32:       # %bb.0:
 ; KNL_32-NEXT:    testb $1, {{[0-9]+}}(%esp)
-; KNL_32-NEXT:    jne .LBB43_1
-; KNL_32-NEXT:  # %bb.2: # %else
-; KNL_32-NEXT:    retl
-; KNL_32-NEXT:  .LBB43_1: # %cond.store
+; KNL_32-NEXT:    je .LBB43_2
+; KNL_32-NEXT:  # %bb.1: # %cond.store
 ; KNL_32-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; KNL_32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; KNL_32-NEXT:    movl %ecx, (%eax)
+; KNL_32-NEXT:  .LBB43_2: # %else
 ; KNL_32-NEXT:    retl
 ;
 ; SKX-LABEL: v1_scatter:
 ; SKX:       # %bb.0:
 ; SKX-NEXT:    testb $1, %dl
-; SKX-NEXT:    jne .LBB43_1
-; SKX-NEXT:  # %bb.2: # %else
-; SKX-NEXT:    retq
-; SKX-NEXT:  .LBB43_1: # %cond.store
+; SKX-NEXT:    je .LBB43_2
+; SKX-NEXT:  # %bb.1: # %cond.store
 ; SKX-NEXT:    movl %edi, (%rsi)
+; SKX-NEXT:  .LBB43_2: # %else
 ; SKX-NEXT:    retq
 ;
 ; SKX_32-LABEL: v1_scatter:
 ; SKX_32:       # %bb.0:
 ; SKX_32-NEXT:    testb $1, {{[0-9]+}}(%esp)
-; SKX_32-NEXT:    jne .LBB43_1
-; SKX_32-NEXT:  # %bb.2: # %else
-; SKX_32-NEXT:    retl
-; SKX_32-NEXT:  .LBB43_1: # %cond.store
+; SKX_32-NEXT:    je .LBB43_2
+; SKX_32-NEXT:  # %bb.1: # %cond.store
 ; SKX_32-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; SKX_32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; SKX_32-NEXT:    movl %ecx, (%eax)
+; SKX_32-NEXT:  .LBB43_2: # %else
 ; SKX_32-NEXT:    retl
   call void @llvm.masked.scatter.v1i32.v1p0i32(<1 x i32> %a1, <1 x i32*> %ptr, i32 4, <1 x i1> %mask)
   ret void

Modified: llvm/trunk/test/CodeGen/X86/masked_gather_scatter_widen.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/masked_gather_scatter_widen.ll?rev=343244&r1=343243&r2=343244&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/masked_gather_scatter_widen.ll (original)
+++ llvm/trunk/test/CodeGen/X86/masked_gather_scatter_widen.ll Thu Sep 27 11:01:48 2018
@@ -131,12 +131,11 @@ define void @test_scatter_v2i32_index(<2
 ; WIDEN_AVX2-NEXT:  .LBB1_2: # %else
 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; WIDEN_AVX2-NEXT:    testb $1, %al
-; WIDEN_AVX2-NEXT:    jne .LBB1_3
-; WIDEN_AVX2-NEXT:  # %bb.4: # %else2
-; WIDEN_AVX2-NEXT:    retq
-; WIDEN_AVX2-NEXT:  .LBB1_3: # %cond.store1
+; WIDEN_AVX2-NEXT:    je .LBB1_4
+; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; WIDEN_AVX2-NEXT:    vmovhpd %xmm0, (%rax)
+; WIDEN_AVX2-NEXT:  .LBB1_4: # %else2
 ; WIDEN_AVX2-NEXT:    retq
 ;
 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_index:
@@ -157,12 +156,11 @@ define void @test_scatter_v2i32_index(<2
 ; PROMOTE_AVX2-NEXT:  .LBB1_2: # %else
 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; PROMOTE_AVX2-NEXT:    testb $1, %al
-; PROMOTE_AVX2-NEXT:    jne .LBB1_3
-; PROMOTE_AVX2-NEXT:  # %bb.4: # %else2
-; PROMOTE_AVX2-NEXT:    retq
-; PROMOTE_AVX2-NEXT:  .LBB1_3: # %cond.store1
+; PROMOTE_AVX2-NEXT:    je .LBB1_4
+; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; PROMOTE_AVX2-NEXT:    vmovhpd %xmm0, (%rax)
+; PROMOTE_AVX2-NEXT:  .LBB1_4: # %else2
 ; PROMOTE_AVX2-NEXT:    retq
   %gep = getelementptr double, double *%base, <2 x i32> %ind
   call void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double> %a1, <2 x double*> %gep, i32 4, <2 x i1> %mask)
@@ -284,12 +282,11 @@ define void @test_scatter_v2i32_data(<2
 ; WIDEN_AVX2-NEXT:  .LBB3_2: # %else
 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; WIDEN_AVX2-NEXT:    testb $1, %al
-; WIDEN_AVX2-NEXT:    jne .LBB3_3
-; WIDEN_AVX2-NEXT:  # %bb.4: # %else2
-; WIDEN_AVX2-NEXT:    retq
-; WIDEN_AVX2-NEXT:  .LBB3_3: # %cond.store1
+; WIDEN_AVX2-NEXT:    je .LBB3_4
+; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; WIDEN_AVX2-NEXT:    vextractps $1, %xmm0, (%rax)
+; WIDEN_AVX2-NEXT:  .LBB3_4: # %else2
 ; WIDEN_AVX2-NEXT:    retq
 ;
 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data:
@@ -303,12 +300,11 @@ define void @test_scatter_v2i32_data(<2
 ; PROMOTE_AVX2-NEXT:  .LBB3_2: # %else
 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; PROMOTE_AVX2-NEXT:    testb $1, %al
-; PROMOTE_AVX2-NEXT:    jne .LBB3_3
-; PROMOTE_AVX2-NEXT:  # %bb.4: # %else2
-; PROMOTE_AVX2-NEXT:    retq
-; PROMOTE_AVX2-NEXT:  .LBB3_3: # %cond.store1
+; PROMOTE_AVX2-NEXT:    je .LBB3_4
+; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; PROMOTE_AVX2-NEXT:    vextractps $2, %xmm0, (%rax)
+; PROMOTE_AVX2-NEXT:  .LBB3_4: # %else2
 ; PROMOTE_AVX2-NEXT:    retq
   call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %ptr, i32 4, <2 x i1> %mask)
   ret void
@@ -438,12 +434,11 @@ define void @test_scatter_v2i32_data_ind
 ; WIDEN_AVX2-NEXT:  .LBB5_2: # %else
 ; WIDEN_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; WIDEN_AVX2-NEXT:    testb $1, %al
-; WIDEN_AVX2-NEXT:    jne .LBB5_3
-; WIDEN_AVX2-NEXT:  # %bb.4: # %else2
-; WIDEN_AVX2-NEXT:    retq
-; WIDEN_AVX2-NEXT:  .LBB5_3: # %cond.store1
+; WIDEN_AVX2-NEXT:    je .LBB5_4
+; WIDEN_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; WIDEN_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; WIDEN_AVX2-NEXT:    vextractps $1, %xmm0, (%rax)
+; WIDEN_AVX2-NEXT:  .LBB5_4: # %else2
 ; WIDEN_AVX2-NEXT:    retq
 ;
 ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data_index:
@@ -464,12 +459,11 @@ define void @test_scatter_v2i32_data_ind
 ; PROMOTE_AVX2-NEXT:  .LBB5_2: # %else
 ; PROMOTE_AVX2-NEXT:    vpextrb $8, %xmm2, %eax
 ; PROMOTE_AVX2-NEXT:    testb $1, %al
-; PROMOTE_AVX2-NEXT:    jne .LBB5_3
-; PROMOTE_AVX2-NEXT:  # %bb.4: # %else2
-; PROMOTE_AVX2-NEXT:    retq
-; PROMOTE_AVX2-NEXT:  .LBB5_3: # %cond.store1
+; PROMOTE_AVX2-NEXT:    je .LBB5_4
+; PROMOTE_AVX2-NEXT:  # %bb.3: # %cond.store1
 ; PROMOTE_AVX2-NEXT:    vpextrq $1, %xmm1, %rax
 ; PROMOTE_AVX2-NEXT:    vextractps $2, %xmm0, (%rax)
+; PROMOTE_AVX2-NEXT:  .LBB5_4: # %else2
 ; PROMOTE_AVX2-NEXT:    retq
   %gep = getelementptr i32, i32 *%base, <2 x i32> %ind
   call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %gep, i32 4, <2 x i1> %mask)

Modified: llvm/trunk/test/CodeGen/X86/masked_memop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/masked_memop.ll?rev=343244&r1=343243&r2=343244&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/masked_memop.ll (original)
+++ llvm/trunk/test/CodeGen/X86/masked_memop.ll Thu Sep 27 11:01:48 2018
@@ -66,21 +66,19 @@ define void @storev1(<1 x i32> %trigger,
 ; AVX-LABEL: storev1:
 ; AVX:       ## %bb.0:
 ; AVX-NEXT:    testl %edi, %edi
-; AVX-NEXT:    je LBB1_1
-; AVX-NEXT:  ## %bb.2: ## %else
-; AVX-NEXT:    retq
-; AVX-NEXT:  LBB1_1: ## %cond.store
+; AVX-NEXT:    jne LBB1_2
+; AVX-NEXT:  ## %bb.1: ## %cond.store
 ; AVX-NEXT:    movl %edx, (%rsi)
+; AVX-NEXT:  LBB1_2: ## %else
 ; AVX-NEXT:    retq
 ;
 ; AVX512-LABEL: storev1:
 ; AVX512:       ## %bb.0:
 ; AVX512-NEXT:    testl %edi, %edi
-; AVX512-NEXT:    je LBB1_1
-; AVX512-NEXT:  ## %bb.2: ## %else
-; AVX512-NEXT:    retq
-; AVX512-NEXT:  LBB1_1: ## %cond.store
+; AVX512-NEXT:    jne LBB1_2
+; AVX512-NEXT:  ## %bb.1: ## %cond.store
 ; AVX512-NEXT:    movl %edx, (%rsi)
+; AVX512-NEXT:  LBB1_2: ## %else
 ; AVX512-NEXT:    retq
   %mask = icmp eq <1 x i32> %trigger, zeroinitializer
   call void @llvm.masked.store.v1i32.p0v1i32(<1 x i32>%val, <1 x i32>* %addr, i32 4, <1 x i1>%mask)




More information about the llvm-commits mailing list