[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: An unique regression: ``` diff --git a/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll b/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll index 534c0a07..85a097fc 100644 --- a/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll +++ b/bench/openssl/optimized/hexstr_test-bin-hexstr_test.ll @@ -48,7 +48,7 @@ entry: %idxprom = sext i32 %test_index to i64 %arrayidx = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom %0 = load ptr, ptr %arrayidx, align 16 - %sep = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 3 + %sep = getelementptr inbounds i8, ptr %arrayidx, i64 24 %1 = load i8, ptr %sep, align 8 %call = call ptr @ossl_hexstr2buf_sep(ptr noundef %0, ptr noundef nonnull %len, i8 noundef signext %1) #2 %call1 = call i32 @test_ptr(ptr noundef nonnull @.str.3, i32 noundef 71, ptr noundef nonnull @.str.4, ptr noundef %call) #2 @@ -57,9 +57,9 @@ entry: lor.lhs.false:; preds = %entry %2 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %3 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %4 = load i64, ptr %expected_len, align 16 %call2 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 72, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef %call, i64 noundef %2, ptr noundef %3, i64 noundef %4) #2 %tobool3.not = icmp eq i32 %call2, 0 @@ -93,8 +93,9 @@ entry: store i64 0, ptr %len, align 8 %idxprom = sext i32 %test_index to i64 %arrayidx = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom - %0 = and i32 %test_index, -2 - %cmp.not = icmp eq i32 %0, 2 + %sep = getelementptr inbounds i8, ptr %arrayidx, i64 24 + %0 = load i8, ptr %sep, align 8 + %cmp.not = icmp eq i8 %0, 95 %1 = load ptr, ptr %arrayidx, align 16 %call28 = call ptr @OPENSSL_hexstr2buf(ptr noundef %1, ptr noundef nonnull %len) #2 br i1 %cmp.not, label %if.else26, label %if.then @@ -106,9 +107,9 @@ if.then: ; preds = %entry lor.lhs.false:; preds = %if.then %2 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %3 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %4 = load i64, ptr %expected_len, align 16 %call3 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 94, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef %call28, i64 noundef %2, ptr noundef %3, i64 noundef %4) #2 %tobool4.not = icmp eq i32 %call3, 0 @@ -122,7 +123,7 @@ lor.lhs.false5: ; preds = %lor.lhs.false br i1 %tobool8.not, label %err, label %if.end if.end: ; preds = %lor.lhs.false5 - %cmp12 = icmp ult i32 %test_index, 2 + %cmp12 = icmp eq i8 %0, 58 br i1 %cmp12, label %if.then14, label %if.else if.then14:; preds = %if.end @@ -171,9 +172,9 @@ entry: land.lhs.true:; preds = %entry %1 = load i64, ptr %len, align 8 - %expected = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 1 + %expected = getelementptr inbounds i8, ptr %arrayidx, i64 8 %2 = load ptr, ptr %expected, align 8 - %expected_len = getelementptr inbounds [6 x %struct.testdata], ptr @tbl_testdata, i64 0, i64 %idxprom, i32 2 + %expected_len = getelementptr inbounds i8, ptr %arrayidx, i64 16 %3 = load i64, ptr %expected_len, align 16 %call3 = call i32 @test_mem_eq(ptr noundef nonnull @.str.3, i32 noundef 122, ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.6, ptr noundef nonnull %buf, i64 noundef %1, ptr noundef %2, i64 noundef %3) #2 %tobool4.not = icmp eq i32 %call3, 0 ``` https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: > @dtcxzyw GitHub can't display the diff, and struggles to clone the repo. Can > you share the diffs for just the mentioned files? I have posted the diff between optimized IRs. https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[flang] [llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
dtcxzyw wrote: @nikic Could you please have a look at https://github.com/dtcxzyw/llvm-opt-benchmark/pull/17? One regression: ``` diff --git a/bench/brotli/optimized/compound_dictionary.c.ll b/bench/brotli/optimized/compound_dictionary.c.ll index 21fd37fd..b9894810 100644 --- a/bench/brotli/optimized/compound_dictionary.c.ll +++ b/bench/brotli/optimized/compound_dictionary.c.ll @@ -3,9 +3,6 @@ source_filename = "bench/brotli/original/compound_dictionary.c.ll" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -%struct.PreparedDictionary = type { i32, i32, i32, i32, i32, i32 } -%struct.CompoundDictionary = type { i64, i64, [16 x ptr], [16 x ptr], [16 x i64], i64, [16 x ptr] } - ; Function Attrs: nounwind uwtable define hidden ptr @CreatePreparedDictionary(ptr noundef %m, ptr noundef %source, i64 noundef %source_size) local_unnamed_addr #0 { entry: @@ -168,25 +165,29 @@ cond.true119.i: ; preds = %for.end106.i cond.end123.i:; preds = %cond.true119.i, %for.end106.i %cond124.i = phi ptr [ %call121.i, %cond.true119.i ], [ null, %for.end106.i ] - %arrayidx125.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 1 + %arrayidx125.i = getelementptr inbounds i8, ptr %cond124.i, i64 24 %arrayidx127.i = getelementptr inbounds i32, ptr %arrayidx125.i, i64 %idxprom.i %arrayidx129.i = getelementptr inbounds i16, ptr %arrayidx127.i, i64 %idxprom26.i %arrayidx131.i = getelementptr inbounds i32, ptr %arrayidx129.i, i64 %conv113.i store i32 -558043677, ptr %cond124.i, align 4 - %num_items.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 1 + %num_items.i = getelementptr inbounds i8, ptr %cond124.i, i64 4 store i32 %add100.i, ptr %num_items.i, align 4 %conv132.i = trunc i64 %source_size to i32 - %source_size133.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 2 + %source_size133.i = getelementptr inbounds i8, ptr %cond124.i, i64 8 store i32 %conv132.i, ptr %source_size133.i, align 4 - %hash_bits134.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 3 + %hash_bits134.i = getelementptr inbounds i8, ptr %cond124.i, i64 12 store i32 40, ptr %hash_bits134.i, align 4 - %bucket_bits135.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 4 + %bucket_bits135.i = getelementptr inbounds i8, ptr %cond124.i, i64 16 store i32 %bucket_bits.0.lcssa, ptr %bucket_bits135.i, align 4 - %slot_bits136.i = getelementptr inbounds %struct.PreparedDictionary, ptr %cond124.i, i64 0, i32 5 + %slot_bits136.i = getelementptr inbounds i8, ptr %cond124.i, i64 20 store i32 %slot_bits.0.lcssa, ptr %slot_bits136.i, align 4 store ptr %source, ptr %arrayidx131.i, align 1 br label %for.body140.i +for.cond151.preheader.i: ; preds = %for.body140.i + %invariant.gep.i = getelementptr i8, ptr %arrayidx129.i, i64 -4 + br label %for.body154.i + for.body140.i:; preds = %for.body140.i, %cond.end123.i %indvars.iv145.i = phi i64 [ 0, %cond.end123.i ], [ %indvars.iv.next146.i, %for.body140.i ] %total_items.1139.i = phi i32 [ 0, %cond.end123.i ], [ %add145.i, %for.body140.i ] @@ -198,10 +199,10 @@ for.body140.i:; preds = %for.body140.i, %con store i32 0, ptr %arrayidx144.i, align 4 %indvars.iv.next146.i = add nuw nsw i64 %indvars.iv145.i, 1 %exitcond150.not.i = icmp eq i64 %indvars.iv.next146.i, %idxprom.i - br i1 %exitcond150.not.i, label %for.body154.i, label %for.body140.i, !llvm.loop !9 + br i1 %exitcond150.not.i, label %for.cond151.preheader.i, label %for.body140.i, !llvm.loop !9 -for.body154.i:; preds = %for.body140.i, %for.inc204.i - %indvars.iv152.i = phi i64 [ %indvars.iv.next153.i, %for.inc204.i ], [ 0, %for.body140.i ] +for.body154.i:; preds = %for.inc204.i, %for.cond151.preheader.i + %indvars.iv152.i = phi i64 [ 0, %for.cond151.preheader.i ], [ %indvars.iv.next153.i, %for.inc204.i ] %5 = trunc i64 %indvars.iv152.i to i32 %and155.i = and i32 %sub3.i, %5 %arrayidx158.i = getelementptr inbounds i16, ptr %arrayidx25.i, i64 %indvars.iv152.i @@ -243,7 +244,7 @@ for.body194.i:; preds = %for.body194.i, %if. %pos.0.in140.i = phi ptr [ %arrayidx189.i, %if.end177.i ], [ %arrayidx198.i, %for.body194.i ] %pos.0.i = load i32, ptr %pos.0.in140.i, align 4 %inc195.i = add nuw nsw i64 %cursor.0142.i, 1 - %arrayidx196.i = getelementptr i32, ptr %arrayidx129.i, i64 %cursor.0142.i + %arrayidx196.i = getelementptr inbounds i32, ptr %arrayidx129.i, i64 %cursor.0142.i store i32 %pos.0.i, ptr %arrayidx196.i, align 4 %idxprom197.i = zext
[llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
https://github.com/nikic edited https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
https://github.com/nikic edited https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
@@ -2282,6 +2282,15 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst ) { if (MadeChange) return + // Canonicalize constant GEPs to i8 type. nikic wrote: GEP operates in terms of bytes, not bits. The size of i8 is required to be 1. GEP doesn't care how the mapping from size to size in bits looks like. So if you want to map i8 to 32 bits, then that should be fine as far as GEP/ptradd are concerned (though of course breaks all kinds of other assumptions). https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] [InstCombine] Canonicalize constant GEPs to i8 source element type (PR #68882)
@@ -2282,6 +2282,15 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst ) { if (MadeChange) return + // Canonicalize constant GEPs to i8 type. bjope wrote: FWIW, this is a bit interesting downstream with non-8-bit addressing units :-) Today i8 would be quite rare as GEP type for us as it is smaller than the addressing unit size. But I figure that canonicalizing to some other type downstream could end up as a lot of work (or lots of missed optimizations). Afaict accumulateConstantOffset is returning an offset that depends on TypeStoreSize. So as long as this is used in a way so that the address still would be given by `baseptr + DL.getTypeStoreSize(i8) * Offset` and not `baseptr + 8 * Offset` , then I guess things will be fine (i.e not assuming that the offset is an 8-bit offset). As far as I can tell you could just as well have picked i1 instead of i8 (given that `DL.getTypeStoreSize(i1)==DL.getTypeStoreSize(i8)`). That would probably look confusing, but that is what happens for us when using i8 as type as we can't address individual octets. (I also see this as a reminder for looking at the ptradd RFC to understand how that will impact us, so that we are prepared for that.) https://github.com/llvm/llvm-project/pull/68882 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits