when merging two loads, make sure to take the min of their alignment,
authorChris Lattner <sabre@nondot.org>
Sun, 1 Nov 2009 20:07:07 +0000 (20:07 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 1 Nov 2009 20:07:07 +0000 (20:07 +0000)
not the max.  This didn't matter until the previous patch because
instcombine would refuse to sink loads with differenting alignments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85738 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/phi.ll

index 4c6c2bb2ac8c41a2c72a9074a0156688dd95e846..07681d15d87634f89b1c881069ee14f5d89f0b2b 100644 (file)
@@ -10774,7 +10774,7 @@ Instruction *InstCombiner::FoldPHIArgLoadIntoPHI(PHINode &PN) {
     if ((LoadAlignment != 0) != (LI->getAlignment() != 0))
       return 0;
     
-    LoadAlignment = std::max(LoadAlignment, LI->getAlignment());
+    LoadAlignment = std::min(LoadAlignment, LI->getAlignment());
     
     // If the PHI is of volatile loads and the load block has multiple
     // successors, sinking it would remove a load of the volatile value from
index 08d28b4de7ef1955a9de5e9915fd56231d3de220..d5665f6b68c3ef93834596a3cc62387195156e2d 100644 (file)
@@ -157,9 +157,35 @@ bb1:
 bb2:
   %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
   ret i32 %E
+; CHECK: @test9
 ; CHECK:       bb2:
 ; CHECK-NEXT:        phi i32* [ %B, %bb ], [ %A, %bb1 ]
 ; CHECK-NEXT:   %E = load i32* %{{[^,]*}}, align 1
 ; CHECK-NEXT:   ret i32 %E
 
 }
+
+define i32 @test10(i32* %A, i32* %B) {
+entry:
+  %c = icmp eq i32* %A, null
+  br i1 %c, label %bb1, label %bb
+
+bb:
+  %C = load i32* %B, align 16
+  br label %bb2
+
+bb1:
+  %D = load i32* %A, align 32
+  br label %bb2
+
+bb2:
+  %E = phi i32 [ %C, %bb ], [ %D, %bb1 ]
+  ret i32 %E
+; CHECK: @test10
+; CHECK:       bb2:
+; CHECK-NEXT:        phi i32* [ %B, %bb ], [ %A, %bb1 ]
+; CHECK-NEXT:   %E = load i32* %{{[^,]*}}, align 16
+; CHECK-NEXT:   ret i32 %E
+
+}
+