diff --git a/llvm/lib/CodeGen/ExpandMemCmp.cpp b/llvm/lib/CodeGen/ExpandMemCmp.cpp --- a/llvm/lib/CodeGen/ExpandMemCmp.cpp +++ b/llvm/lib/CodeGen/ExpandMemCmp.cpp @@ -282,6 +282,8 @@ ByteType, Builder.CreateBitCast(RhsSource, ByteType->getPointerTo()), OffsetBytes); } + Align LhsAlign = max(LhsSource->getPointerAlignment(DL), Align(1)); + Align RhsAlign = max(RhsSource->getPointerAlignment(DL), Align(1)); LhsSource = Builder.CreateBitCast(LhsSource, LoadSizeType->getPointerTo()); RhsSource = Builder.CreateBitCast(RhsSource, LoadSizeType->getPointerTo()); @@ -290,13 +292,13 @@ if (auto *C = dyn_cast(LhsSource)) Lhs = ConstantFoldLoadFromConstPtr(C, LoadSizeType, DL); if (!Lhs) - Lhs = Builder.CreateLoad(LoadSizeType, LhsSource); + Lhs = Builder.CreateAlignedLoad(LoadSizeType, LhsSource, LhsAlign); Value *Rhs = nullptr; if (auto *C = dyn_cast(RhsSource)) Rhs = ConstantFoldLoadFromConstPtr(C, LoadSizeType, DL); if (!Rhs) - Rhs = Builder.CreateLoad(LoadSizeType, RhsSource); + Rhs = Builder.CreateAlignedLoad(LoadSizeType, RhsSource, RhsAlign); // Swap bytes if required. if (NeedsBSwap) { diff --git a/llvm/test/CodeGen/AArch64/bcmp-inline-small.ll b/llvm/test/CodeGen/AArch64/bcmp-inline-small.ll --- a/llvm/test/CodeGen/AArch64/bcmp-inline-small.ll +++ b/llvm/test/CodeGen/AArch64/bcmp-inline-small.ll @@ -4,35 +4,28 @@ declare i32 @bcmp(i8*, i8*, i64) nounwind readonly declare i32 @memcmp(i8*, i8*, i64) nounwind readonly -define i1 @bcmp_b2(i8* %s1, i8* %s2) { +define i1 @test_b2(i8* %s1, i8* %s2) { entry: %bcmp = call i32 @bcmp(i8* %s1, i8* %s2, i64 15) %ret = icmp eq i32 %bcmp, 0 ret i1 %ret -; CHECK-LABEL: bcmp_b2: +; CHECK-LABEL: test_b2: ; CHECK-NOT: bl bcmp ; CHECKN: ldr x ; CHECKN-NEXT: ldr x ; CHECKN-NEXT: ldur x ; CHECKN-NEXT: ldur x -; CHECKS: ldr x -; CHECKS-NEXT: ldr x -; CHECKS-NEXT: ldr w -; CHECKS-NEXT: ldr w -; CHECKS-NEXT: ldrh w -; CHECKS-NEXT: ldrh w -; CHECKS-NEXT: ldrb w -; CHECKS-NEXT: ldrb w +; CHECKS-30: ldrb } -define i1 @bcmp_bs(i8* %s1, i8* %s2) optsize { +define i1 @test_bs(i8* %s1, i8* %s2) optsize { entry: %memcmp = call i32 @memcmp(i8* %s1, i8* %s2, i64 31) %ret = icmp eq i32 %memcmp, 0 ret i1 %ret -; CHECK-LABEL: bcmp_bs: +; CHECK-LABEL: test_bs: ; CHECKN-NOT: bl memcmp ; CHECKN: ldp x ; CHECKN-NEXT: ldp x diff --git a/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll b/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll --- a/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll +++ b/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll @@ -35,8 +35,8 @@ define signext i32 @zeroEqualityTest01(i8* %x, i8* %y) { ; CHECK-LABEL: zeroEqualityTest01: ; CHECK: # %bb.0: -; CHECK-NEXT: ld 5, 0(3) -; CHECK-NEXT: ld 6, 0(4) +; CHECK-NEXT: ldx 5, 0, 3 +; CHECK-NEXT: ldx 6, 0, 4 ; CHECK-NEXT: cmpld 5, 6 ; CHECK-NEXT: bne 0, .LBB1_2 ; CHECK-NEXT: # %bb.1: # %loadbb1 @@ -125,7 +125,7 @@ define signext i32 @equalityFoldOneConstant(i8* %X) { ; CHECK-LABEL: equalityFoldOneConstant: ; CHECK: # %bb.0: -; CHECK-NEXT: ld 4, 0(3) +; CHECK-NEXT: ldx 4, 0, 3 ; CHECK-NEXT: li 5, 1 ; CHECK-NEXT: sldi 5, 5, 32 ; CHECK-NEXT: cmpld 4, 5 diff --git a/llvm/test/CodeGen/PowerPC/memcmp-mergeexpand.ll b/llvm/test/CodeGen/PowerPC/memcmp-mergeexpand.ll --- a/llvm/test/CodeGen/PowerPC/memcmp-mergeexpand.ll +++ b/llvm/test/CodeGen/PowerPC/memcmp-mergeexpand.ll @@ -8,8 +8,8 @@ define zeroext i1 @opeq1( ; PPC64LE-LABEL: opeq1: ; PPC64LE: # %bb.0: # %"entry+land.rhs.i" -; PPC64LE-NEXT: ld 3, 0(3) -; PPC64LE-NEXT: ld 4, 0(4) +; PPC64LE-NEXT: ldx 3, 0, 3 +; PPC64LE-NEXT: ldx 4, 0, 4 ; PPC64LE-NEXT: xor 3, 3, 4 ; PPC64LE-NEXT: cntlzd 3, 3 ; PPC64LE-NEXT: rldicl 3, 3, 58, 63