Skip to content

Commit e665e78

Browse files
authored
[SelectionDAG] Use the nuw flag when expanding loads. (#119288)
When expanding a load into two loads, use nuw for the add that computes the offset from the base of the second load, because the original load doesn't straddle the address space. It turns out there's already a dedicated helper function for doing this, `getObjectPtrOffset`. This is in target-independent code, however in practice it only seems to affact WebAssembly code, because WebAssembly load and store instructions' constant offsets don't perform wrapping, so constant folding often depends on the nuw flag being present. This was noticed in the development of #119204.
1 parent 0ee5924 commit e665e78

10 files changed

+990
-1167
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
265265

266266
// Increment the pointer to the other half.
267267
unsigned IncrementSize = NVT.getSizeInBits() / 8;
268-
Ptr = DAG.getMemBasePlusOffset(Ptr, TypeSize::getFixed(IncrementSize), dl);
268+
Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
269269
Hi = DAG.getLoad(
270270
NVT, dl, Chain, Ptr, LD->getPointerInfo().getWithOffset(IncrementSize),
271271
LD->getOriginalAlign(), LD->getMemOperand()->getFlags(), AAInfo);

llvm/test/CodeGen/AMDGPU/buffer-intrinsics-mmo-offsets.ll

+144-147
Large diffs are not rendered by default.

llvm/test/CodeGen/WebAssembly/fpclamptosat.ll

+15-45
Original file line numberDiff line numberDiff line change
@@ -524,9 +524,7 @@ define i64 @utest_f64i64(double %x) {
524524
; CHECK-NEXT: local.get 0
525525
; CHECK-NEXT: call __fixunsdfti
526526
; CHECK-NEXT: local.get 1
527-
; CHECK-NEXT: i32.const 8
528-
; CHECK-NEXT: i32.add
529-
; CHECK-NEXT: i64.load 0
527+
; CHECK-NEXT: i64.load 8
530528
; CHECK-NEXT: local.set 2
531529
; CHECK-NEXT: local.get 1
532530
; CHECK-NEXT: i64.load 0
@@ -563,9 +561,7 @@ define i64 @utest_f64i64_cse_combine(double %x) #0 {
563561
; CHECK-NEXT: local.get 0
564562
; CHECK-NEXT: call __fixunsdfti
565563
; CHECK-NEXT: local.get 1
566-
; CHECK-NEXT: i32.const 8
567-
; CHECK-NEXT: i32.add
568-
; CHECK-NEXT: i64.load 0
564+
; CHECK-NEXT: i64.load 8
569565
; CHECK-NEXT: local.set 2
570566
; CHECK-NEXT: local.get 1
571567
; CHECK-NEXT: i64.load 0
@@ -602,9 +598,7 @@ define i64 @ustest_f64i64(double %x) {
602598
; CHECK-NEXT: local.get 0
603599
; CHECK-NEXT: call __fixdfti
604600
; CHECK-NEXT: local.get 1
605-
; CHECK-NEXT: i32.const 8
606-
; CHECK-NEXT: i32.add
607-
; CHECK-NEXT: i64.load 0
601+
; CHECK-NEXT: i64.load 8
608602
; CHECK-NEXT: local.set 2
609603
; CHECK-NEXT: local.get 1
610604
; CHECK-NEXT: i64.load 0
@@ -661,9 +655,7 @@ define i64 @ustest_f64i64_cse_combine(double %x) #0 {
661655
; CHECK-NEXT: local.get 0
662656
; CHECK-NEXT: call __fixdfti
663657
; CHECK-NEXT: local.get 1
664-
; CHECK-NEXT: i32.const 8
665-
; CHECK-NEXT: i32.add
666-
; CHECK-NEXT: i64.load 0
658+
; CHECK-NEXT: i64.load 8
667659
; CHECK-NEXT: local.set 2
668660
; CHECK-NEXT: local.get 1
669661
; CHECK-NEXT: i64.load 0
@@ -727,9 +719,7 @@ define i64 @utest_f32i64(float %x) {
727719
; CHECK-NEXT: local.get 0
728720
; CHECK-NEXT: call __fixunssfti
729721
; CHECK-NEXT: local.get 1
730-
; CHECK-NEXT: i32.const 8
731-
; CHECK-NEXT: i32.add
732-
; CHECK-NEXT: i64.load 0
722+
; CHECK-NEXT: i64.load 8
733723
; CHECK-NEXT: local.set 2
734724
; CHECK-NEXT: local.get 1
735725
; CHECK-NEXT: i64.load 0
@@ -781,9 +771,7 @@ define i64 @ustest_f32i64(float %x) {
781771
; CHECK-NEXT: local.get 0
782772
; CHECK-NEXT: call __fixsfti
783773
; CHECK-NEXT: local.get 1
784-
; CHECK-NEXT: i32.const 8
785-
; CHECK-NEXT: i32.add
786-
; CHECK-NEXT: i64.load 0
774+
; CHECK-NEXT: i64.load 8
787775
; CHECK-NEXT: local.set 2
788776
; CHECK-NEXT: local.get 1
789777
; CHECK-NEXT: i64.load 0
@@ -840,9 +828,7 @@ define i64 @ustest_f32i64_cse_combine(float %x) #0 {
840828
; CHECK-NEXT: local.get 0
841829
; CHECK-NEXT: call __fixsfti
842830
; CHECK-NEXT: local.get 1
843-
; CHECK-NEXT: i32.const 8
844-
; CHECK-NEXT: i32.add
845-
; CHECK-NEXT: i64.load 0
831+
; CHECK-NEXT: i64.load 8
846832
; CHECK-NEXT: local.set 2
847833
; CHECK-NEXT: local.get 1
848834
; CHECK-NEXT: i64.load 0
@@ -910,9 +896,7 @@ define i64 @utesth_f16i64(half %x) {
910896
; CHECK-NEXT: call __extendhfsf2
911897
; CHECK-NEXT: call __fixunssfti
912898
; CHECK-NEXT: local.get 1
913-
; CHECK-NEXT: i32.const 8
914-
; CHECK-NEXT: i32.add
915-
; CHECK-NEXT: i64.load 0
899+
; CHECK-NEXT: i64.load 8
916900
; CHECK-NEXT: local.set 2
917901
; CHECK-NEXT: local.get 1
918902
; CHECK-NEXT: i64.load 0
@@ -981,9 +965,7 @@ define i64 @ustest_f16i64(half %x) {
981965
; CHECK-NEXT: call __extendhfsf2
982966
; CHECK-NEXT: call __fixsfti
983967
; CHECK-NEXT: local.get 1
984-
; CHECK-NEXT: i32.const 8
985-
; CHECK-NEXT: i32.add
986-
; CHECK-NEXT: i64.load 0
968+
; CHECK-NEXT: i64.load 8
987969
; CHECK-NEXT: local.set 2
988970
; CHECK-NEXT: local.get 1
989971
; CHECK-NEXT: i64.load 0
@@ -1471,9 +1453,7 @@ define i64 @utest_f64i64_mm(double %x) {
14711453
; CHECK-NEXT: local.get 0
14721454
; CHECK-NEXT: call __fixunsdfti
14731455
; CHECK-NEXT: local.get 1
1474-
; CHECK-NEXT: i32.const 8
1475-
; CHECK-NEXT: i32.add
1476-
; CHECK-NEXT: i64.load 0
1456+
; CHECK-NEXT: i64.load 8
14771457
; CHECK-NEXT: local.set 2
14781458
; CHECK-NEXT: local.get 1
14791459
; CHECK-NEXT: i64.load 0
@@ -1509,9 +1489,7 @@ define i64 @ustest_f64i64_mm(double %x) {
15091489
; CHECK-NEXT: local.get 0
15101490
; CHECK-NEXT: call __fixdfti
15111491
; CHECK-NEXT: local.get 1
1512-
; CHECK-NEXT: i32.const 8
1513-
; CHECK-NEXT: i32.add
1514-
; CHECK-NEXT: i64.load 0
1492+
; CHECK-NEXT: i64.load 8
15151493
; CHECK-NEXT: local.set 2
15161494
; CHECK-NEXT: local.get 1
15171495
; CHECK-NEXT: i64.load 0
@@ -1573,9 +1551,7 @@ define i64 @utest_f32i64_mm(float %x) {
15731551
; CHECK-NEXT: local.get 0
15741552
; CHECK-NEXT: call __fixunssfti
15751553
; CHECK-NEXT: local.get 1
1576-
; CHECK-NEXT: i32.const 8
1577-
; CHECK-NEXT: i32.add
1578-
; CHECK-NEXT: i64.load 0
1554+
; CHECK-NEXT: i64.load 8
15791555
; CHECK-NEXT: local.set 2
15801556
; CHECK-NEXT: local.get 1
15811557
; CHECK-NEXT: i64.load 0
@@ -1611,9 +1587,7 @@ define i64 @ustest_f32i64_mm(float %x) {
16111587
; CHECK-NEXT: local.get 0
16121588
; CHECK-NEXT: call __fixsfti
16131589
; CHECK-NEXT: local.get 1
1614-
; CHECK-NEXT: i32.const 8
1615-
; CHECK-NEXT: i32.add
1616-
; CHECK-NEXT: i64.load 0
1590+
; CHECK-NEXT: i64.load 8
16171591
; CHECK-NEXT: local.set 2
16181592
; CHECK-NEXT: local.get 1
16191593
; CHECK-NEXT: i64.load 0
@@ -1679,9 +1653,7 @@ define i64 @utesth_f16i64_mm(half %x) {
16791653
; CHECK-NEXT: call __extendhfsf2
16801654
; CHECK-NEXT: call __fixunssfti
16811655
; CHECK-NEXT: local.get 1
1682-
; CHECK-NEXT: i32.const 8
1683-
; CHECK-NEXT: i32.add
1684-
; CHECK-NEXT: i64.load 0
1656+
; CHECK-NEXT: i64.load 8
16851657
; CHECK-NEXT: local.set 2
16861658
; CHECK-NEXT: local.get 1
16871659
; CHECK-NEXT: i64.load 0
@@ -1719,9 +1691,7 @@ define i64 @ustest_f16i64_mm(half %x) {
17191691
; CHECK-NEXT: call __extendhfsf2
17201692
; CHECK-NEXT: call __fixsfti
17211693
; CHECK-NEXT: local.get 1
1722-
; CHECK-NEXT: i32.const 8
1723-
; CHECK-NEXT: i32.add
1724-
; CHECK-NEXT: i64.load 0
1694+
; CHECK-NEXT: i64.load 8
17251695
; CHECK-NEXT: local.set 2
17261696
; CHECK-NEXT: local.get 1
17271697
; CHECK-NEXT: i64.load 0

0 commit comments

Comments
 (0)